402 lines
17 KiB
Markdown
402 lines
17 KiB
Markdown
---
|
||
title: Phase 0 v3 Baseline
|
||
description: Supabase çıkışı ve Poyraz UI v3 dönüşümü başlamadan önce güncel repo, route, davranış, dependency ve doğrulama baseline'ı.
|
||
status: active
|
||
last_updated: 2026-07-16
|
||
---
|
||
|
||
# Phase 0 v3 Baseline
|
||
|
||
Bu belge `neta-self-hosted-v3-master-plan.md` için Faz 0 kanıtıdır. Önceki 2026-07-10 baseline'ı; Better Auth, SQLite runtime, Docker ve yeni shell eklenmeden önceki durumu anlattığı için bu içerikle güncellenmiştir.
|
||
|
||
## 1. İnceleme kapsamı
|
||
|
||
İncelenen alanlar:
|
||
|
||
- Next.js route, layout, loading ve action yüzeyi
|
||
- Better Auth ve SQLite runtime
|
||
- Supabase browser/server/service-role kullanımları
|
||
- Supabase kaynak schema, RLS, RPC ve storage kapsamı
|
||
- Poyraz UI ve local UI component sınırı
|
||
- Dependency kullanımı
|
||
- Kritik freelancer ve client portal akışları
|
||
- Typecheck, lint, build ve smoke script sonuçları
|
||
|
||
İnceleme dalı ve commit:
|
||
|
||
```text
|
||
branch: codex-self-hosted-redesign-faz2
|
||
HEAD: f5d89e8
|
||
```
|
||
|
||
## 2. Sayısal repo baseline'ı
|
||
|
||
| Ölçüm | Güncel değer |
|
||
| --- | ---: |
|
||
| Uygulama sayfası (`page.tsx`) | 22 |
|
||
| Layout | 3 |
|
||
| Route Handler | 8 |
|
||
| Server Action dosyası | 10 |
|
||
| Export edilen async Server Action | 33 |
|
||
| Loading boundary | 6 |
|
||
| Client Component | 40 |
|
||
| Uygulama/server/script TS/TSX/MJS satırı | yaklaşık 16.014 |
|
||
| Poyraz UI import eden app/component dosyası | 26 |
|
||
| Supabase entegrasyonu içeren app/lib/server dosyası | 40 |
|
||
| Browser Supabase client kullanan ekran | 2 |
|
||
| Production dependency | 47 |
|
||
| Dev dependency | 12 |
|
||
| Supabase kaynak tablo | 20; 19 ürün/public + 1 internal |
|
||
| Supabase storage bucket | 2 |
|
||
| Mevcut SQLite tablo | 10; auth/setup/audit/runtime |
|
||
|
||
## 3. Güncel çalışma zamanı
|
||
|
||
Repo artık iki mimariyi aynı anda içeriyor.
|
||
|
||
### Yeni self-hosted temel
|
||
|
||
- Better Auth email/password ve DB session
|
||
- `better-sqlite3`
|
||
- Drizzle schema ve migration
|
||
- İlk freelancer setup lock'u
|
||
- `app_profiles`
|
||
- Portal invitation tablo iskeleti
|
||
- Auth audit events
|
||
- SQLite WAL/foreign key/busy timeout ayarları
|
||
- Health live/ready endpoint'leri
|
||
- Migration, backup ve restore script'leri
|
||
- Next.js standalone Dockerfile
|
||
- Tek persistent volume kullanan Compose tanımı
|
||
|
||
### Henüz taşınmamış feature runtime
|
||
|
||
- Müşteriler
|
||
- Client activities
|
||
- Projeler ve planning sections
|
||
- Görevler
|
||
- Takvim
|
||
- Finans
|
||
- Günlük
|
||
- Analytics/dashboard RPC
|
||
- Chat session/message
|
||
- AI settings/context
|
||
- Client portal verileri ve revision mutation
|
||
- Avatar ve project asset storage
|
||
|
||
Bu feature'lar hâlâ Supabase Auth principal'ı, Postgres, RLS ve Storage bekliyor.
|
||
|
||
## 4. Kritik hibrit-auth baseline'ı
|
||
|
||
Dashboard ve portal layout'ları Better Auth session kullanıyor:
|
||
|
||
- `app/(dashboard)/layout.tsx` → `requireFreelancer()`
|
||
- `app/portal/layout.tsx` → `requireClientUser()`
|
||
|
||
Alt feature sayfaları ve action'lar ise Supabase `auth.getUser()` kullanıyor. Better Auth cookie'si Supabase session üretmediği için güncel dal uçtan uca çalışan tek auth sistemi sunmuyor.
|
||
|
||
Beklenen mevcut sonuç:
|
||
|
||
- Better Auth ile giriş yapan freelancer layout guard'ını geçebilir.
|
||
- Aynı kullanıcı Supabase tabanlı page/action içinde oturumsuz görünür.
|
||
- Feature reads/mutations boş sonuç, redirect, `null` veya auth hatası verebilir.
|
||
- Better Auth client profile oluşturacak invitation consume akışı henüz yoktur.
|
||
- Eski `/api/create-client-user` route'u Supabase Auth user üretir ve yeni portal layout'ının beklediği SQLite profile'ı üretmez.
|
||
|
||
Bu durum redesign sırasında korunacak davranış değil, ortadan kaldırılması gereken geçiş kırığıdır.
|
||
|
||
## 5. Route ve özellik envanteri
|
||
|
||
### 5.1. Auth ve platform
|
||
|
||
| Route | Durum | Not |
|
||
| --- | --- | --- |
|
||
| `/login` | Var | Better Auth Server Action kullanıyor |
|
||
| `/register` | Var | İlk freelancer setup akışı |
|
||
| `/forgot-password` | Yok | Login ekranında link var; gerçek route/akış yok |
|
||
| `/api/auth/[...all]` | Var | Better Auth handler |
|
||
| `/api/health` | Var | Edge basic health |
|
||
| `/api/health/live` | Var | Process liveness |
|
||
| `/api/health/ready` | Var | SQLite/data dir/migration readiness |
|
||
|
||
### 5.2. Freelancer ekranları
|
||
|
||
| Route | Mevcut yetenek | Veri kaynağı | v3 kararı |
|
||
| --- | --- | --- | --- |
|
||
| `/` | KPI, trend, recent project/client | Supabase RPC + tables | Aggregate repository |
|
||
| `/analytics` | Dönemsel finans/görev analizi | Supabase RPC | SQLite aggregate repository |
|
||
| `/clients` | Liste, filtre, pipeline, CRUD | Supabase | İlk core vertical slice |
|
||
| `/clients/[id]` | Detay ve activity timeline | Supabase | Owner-filtered service |
|
||
| `/projects` | Liste, filtre, CRUD, cover | Supabase + Storage | Local file metadata |
|
||
| `/projects/[id]` | Planning, tasks, finance, revisions | Supabase + Storage | Transaction/service sınırı |
|
||
| `/tasks` | Liste/kanban, CRUD, status | Supabase | Task/project transaction |
|
||
| `/calendar` | Event CRUD | Supabase | Visible-range query |
|
||
| `/finance` | Income/expense CRUD | Supabase | Integer minor unit |
|
||
| `/journal` | Daily log CRUD | Supabase `daily_logs` | `journal_entries` |
|
||
| `/chat` | AI session/message UI | Browser Supabase + API | Server-only chat service |
|
||
| `/settings` | Profil, avatar, AI key, password | Browser/server Supabase | Better Auth + settings service |
|
||
|
||
### 5.3. Business ekranları
|
||
|
||
| Route | Güncel durum | İlk release kararı |
|
||
| --- | --- | --- |
|
||
| `/business/proposals` | Read + ekleme dialog taslağı; gerçek mutation yok | Release-blocker değil |
|
||
| `/business/invoices` | Read + ekleme dialog taslağı; gerçek mutation yok | Release-blocker değil |
|
||
| `/business/subscriptions` | Read + ekleme dialog taslağı; gerçek mutation yok | Release-blocker değil |
|
||
| Contracts | Kaynak tablo var; sayfa yok | Release-blocker değil |
|
||
|
||
Kaynak veriler import sırasında korunacak; eksik UI/CRUD Faz 7'ye bırakılacak veya navigation dışı tutulacak.
|
||
|
||
### 5.4. Client portal
|
||
|
||
| Route | Güncel yetenek | Bilinen sınır |
|
||
| --- | --- | --- |
|
||
| `/portal` | Proje KPI ve proje kartları | Hybrid auth nedeniyle veri session'ı kırık |
|
||
| `/portal/projects` | Client'a bağlı projeler | Supabase RLS'e bağlı |
|
||
| `/portal/projects/[id]` | Progress, public tasks, planning, revisions | `order_index`/`sort_order` uyumsuzluğu |
|
||
| `/portal/tasks` | Public görevler | Eski `completed` toleransı var |
|
||
| `/portal/revisions` | Revision geçmişi | Genel mesajlaşma yok |
|
||
| `/portal/settings` | Yok | Shell hesap menüsü bu route'a link üretiyor |
|
||
|
||
### 5.5. AI ve internal API
|
||
|
||
| Route | Sorumluluk | v3 riski/kararı |
|
||
| --- | --- | --- |
|
||
| `POST /api/chat` | Context oluşturma ve streaming chat | Supabase session/data ve client-supplied key |
|
||
| `POST /api/finance-analysis` | Son 30 gün finance analizi | Supabase ve düz metin API key |
|
||
| `POST /api/project-risk` | Project/task risk analizi | Owner filter RLS'e bırakılmış; `completed` uyumsuzluğu |
|
||
| `POST /api/create-client-user` | Supabase client auth user üretme | Better Auth invitation ile kaldırılacak |
|
||
|
||
## 6. Kritik kullanıcı akışı baseline'ı
|
||
|
||
| Akış | Kodda mevcut davranış | v3'te korunacak/iyileştirilecek sözleşme |
|
||
| --- | --- | --- |
|
||
| İlk admin setup | Atomic Better Auth setup lock ve freelancer profile | Korunacak; smoke/negative test eklenecek |
|
||
| Login/logout | Better Auth Server Actions | Korunacak; forgot-password eklenecek |
|
||
| Client hesabı | Eski Supabase admin route'u + yeni invitation tablo iskeleti | Süreli hash token ile self-activation |
|
||
| Client CRUD | Supabase Server Actions ve RLS | Repository owner filter |
|
||
| Project CRUD | Supabase actions, planning ve storage | Service + local file transaction sınırı |
|
||
| Task kanban | Client state + Supabase action; `done` kanoniği | Task update ve auto progress aynı transaction |
|
||
| Calendar | Tüm/ geniş event datası | Visible date range zorunlu |
|
||
| Finance | Decimal amount | Integer minor unit |
|
||
| Journal | `daily_logs` aktif, `journals` legacy | Tek `journal_entries` modeli |
|
||
| Dashboard/analytics | Supabase RPC | SQLite aggregate repository |
|
||
| Settings | Browser Supabase + localStorage API key | Server-only settings; secret browser'a dönmez |
|
||
| Portal project | RLS ile client project read | Actor/client/project explicit ilişki kontrolü |
|
||
| Portal revision | UI quota uyarısı, zayıf insert policy | Kota ve ilişki aynı transaction içinde |
|
||
| AI chat | Kullanıcı verisi cloud provider'a gönderiliyor | Açık gizlilik bildirimi ve server-only secret |
|
||
|
||
Bu tablo Faz 0 kritik davranış kaydıdır. Canlı ekran kaydı mevcut hibrit auth nedeniyle güvenilir parity kanıtı sayılmayacaktır; vertical slice kabulünde yeni ekran kayıtları alınacaktır.
|
||
|
||
## 7. Supabase kaynak envanteri
|
||
|
||
Geçiş başlangıcında bulunan ve daha sonra release ağacından kaldırılan legacy PostgreSQL setup kaydı üzerinden doğrulanan kaynak tablolar:
|
||
|
||
```text
|
||
profiles
|
||
clients
|
||
client_activities
|
||
projects
|
||
project_planning_sections
|
||
project_revisions
|
||
tasks
|
||
calendar_events
|
||
finance_transactions
|
||
daily_logs
|
||
journals
|
||
app_settings
|
||
proposals
|
||
contracts
|
||
invoices
|
||
subscriptions
|
||
chat_sessions
|
||
chat_messages
|
||
document_embeddings
|
||
neta_internal.internal_auth_creations
|
||
```
|
||
|
||
Storage bucket'ları:
|
||
|
||
- `avatars`
|
||
- `project-assets`
|
||
|
||
Kaynak RPC/trigger function yüzeyi:
|
||
|
||
- `handle_new_user`
|
||
- `set_updated_at`
|
||
- `is_first_admin_setup_available`
|
||
- `request_internal_auth_creation`
|
||
- `neta_current_jwt_role`
|
||
- `update_project_progress_on_task_change`
|
||
- `update_project_progress_on_type_change`
|
||
- `get_dashboard_metrics`
|
||
- `get_analytics_metrics`
|
||
- `match_documents`
|
||
|
||
### 7.1. Fixture satır baseline'ı
|
||
|
||
Geçiş başlangıcındaki legacy demo seed'in deterministik içeriği:
|
||
|
||
| Tablo | Satır |
|
||
| --- | ---: |
|
||
| clients | 2 |
|
||
| projects | 3 |
|
||
| tasks | 3 |
|
||
| calendar_events | 2 |
|
||
| finance_transactions | 3 |
|
||
| daily_logs | 3 |
|
||
| app_settings | 1 |
|
||
|
||
İlk legacy fixture; 1 profile, 1 settings, 2 project, 3 task, 3 finance ve 3 daily log içeriyordu. Bu seed'de `completed` task status'ü ve `daily_logs.notes` alanı gibi güncel schema ile uyumsuz legacy değerler vardı; hedef seed olarak kullanılmadı ve release ağacından kaldırıldı.
|
||
|
||
### 7.2. Production veri sayımı durumu
|
||
|
||
Workspace'te yalnızca `.env.example` vardır; read-only production Supabase bağlantısı veya export snapshot'ı bulunmamaktadır. Bu nedenle gerçek production satır sayıları, status dağılımları, bucket dosya sayıları/boyutları ve orphan path raporu ölçülmemiştir.
|
||
|
||
Çalıştırılacak sorgular `phase-0-data-mapping.md` içinde hazırdır. Bu veri gelmeden ana plandaki “Supabase tablo ve storage veri sayıları çıkarıldı” maddesi işaretlenmez.
|
||
|
||
## 8. Mevcut SQLite envanteri
|
||
|
||
Mevcut tablolar:
|
||
|
||
```text
|
||
user
|
||
session
|
||
account
|
||
verification
|
||
app_profiles
|
||
app_setup_state
|
||
portal_invitations
|
||
auth_audit_events
|
||
runtime_checks
|
||
runtime_events
|
||
```
|
||
|
||
Henüz domain tablosu yoktur. `portal_invitations` yalnızca schema düzeyindedir; davet oluşturma/kabul/revoke service ve route akışı uygulanmamıştır.
|
||
|
||
## 9. Supabase kod bağımlılığı baseline'ı
|
||
|
||
- 40 app/lib/server dosyası Supabase entegrasyonu veya helper'ı içeriyor.
|
||
- 2 client ekran browser Supabase client kullanıyor: chat ve settings.
|
||
- 33 feature page/action/route Supabase feature verisine doğrudan bağlı.
|
||
- Service-role client avatar, project asset ve client auth user oluşturmak için kullanılıyor.
|
||
- Dashboard/analytics iki RPC'ye bağlı.
|
||
- Embedding helper `match_documents` pgvector RPC'sine bağlı.
|
||
|
||
Supabase kaldırma ancak bu kullanımların tamamı service/repository/file katmanına taşındıktan sonra yapılacaktır.
|
||
|
||
## 10. Poyraz UI v3 baseline'ı
|
||
|
||
- Package manifest: `poyraz-ui@^2.1.0`
|
||
- Hedef referans: `poyraz-ui@3.0.2`
|
||
- Poyraz UI import eden dosya: 26
|
||
- Import yüzeyi: atoms ve molecules; güncel custom shell Poyraz organism kullanmıyor.
|
||
- `components/ui` altında 19 local primitive/helper dosyası var.
|
||
- Faz 3 local shell/primitive yönü ADR-0006 tarafından supersede edilmiştir.
|
||
- Hedef: generic UI için Poyraz UI v3; Neta domain componentleri Poyraz kompozisyonu.
|
||
|
||
Poyraz v3 migration sırasında local primitive dosyaları hemen topluca silinmeyecek. Her kullanım taşındıktan ve import boundary doğrulandıktan sonra duplicate dosya/dependency kaldırılacak.
|
||
|
||
## 11. Dependency baseline'ı
|
||
|
||
Doğrudan production dependency sayısı 47'dir.
|
||
|
||
Statik import taramasında aktif kullanımı bulunmayan adaylar:
|
||
|
||
- `@base-ui/react`
|
||
- `dexie-react-hooks`
|
||
- `shadcn`
|
||
- `uuid`
|
||
|
||
Çok sınırlı kullanım:
|
||
|
||
- `@iconify/react`: 1 dosya
|
||
- `framer-motion`: 1 dosya
|
||
- `next-themes`: 1 dosya
|
||
|
||
Geçiş sonrasında kaldırılacak ana gruplar:
|
||
|
||
- Supabase SDK'ları
|
||
- PWA ve Dexie
|
||
- Poyraz v3'ün gereksiz kıldığı direct Radix/Base UI/shadcn bağımlılıkları
|
||
- Aktif importu olmayan yardımcı paketler
|
||
|
||
Kanban için DnD Kit, grafikler için Recharts ve kullanılan AI provider paketleri işlevsel gerekçeyle korunabilir.
|
||
|
||
## 12. Bilinen regression ve güvenlik baseline'ı
|
||
|
||
- Portal planning query `order_index` kullanıyor; schema alanı `sort_order`.
|
||
- Portal planning UI `section.type` okuyor; schema alanı `category`.
|
||
- Project risk route `completed` sayıyor; kanonik task status `done`.
|
||
- Revision quota yalnızca UI'da kontrol ediliyor.
|
||
- Revision insert policy project-client eşleşmesini tam doğrulamıyor.
|
||
- Settings AI API key'i DB'de düz metin, browser state ve `localStorage` içinde tutuyor.
|
||
- Chat/settings browser Supabase SDK ile DB/auth erişimi yapıyor.
|
||
- Project risk tek proje sorgusu açık owner predicate taşımıyor; güvenliği RLS'e bırakıyor.
|
||
- Clients/projects/tasks/calendar/finance listelerinde genel pagination yok.
|
||
- `/forgot-password` ve `/portal/settings` link hedefleri mevcut değil.
|
||
- Business create dialog'ları gerçek mutation yapmıyor.
|
||
- Veri sorgularının bir kısmı hatayı boş liste gibi gösteriyor.
|
||
|
||
Bu maddeler `phase-0-regression-and-spike.md` içindeki regression backlog ile takip edilir.
|
||
|
||
## 13. Performans baseline'ı
|
||
|
||
- Dashboard recent project/client sorguları 5 kayıtla sınırlı.
|
||
- Journal sorgusu 180 kayıtla sınırlı.
|
||
- Chat context sorguları 12–20 kayıt arasında limit kullanıyor.
|
||
- Diğer ana liste ekranlarında `.range()` pagination görülmüyor.
|
||
- Dashboard ve analytics aggregate işlemleri Supabase RPC ile server-side yapılmış.
|
||
- En büyük client dosyaları yaklaşık 500–1.260 satır aralığında; feature UI parçalama ihtiyacı var.
|
||
- 40 Client Component ve duplicate UI runtime'ı client bundle riskini artırıyor.
|
||
|
||
Gerçek TTFB, route payload ve client JS ölçümü mevcut hibrit auth ve eksik local feature schema nedeniyle güvenilir değildir; ilgili vertical slice tamamlandığında yeniden ölçülecektir.
|
||
|
||
## 14. 2026-07-16 local doğrulama sonuçları
|
||
|
||
Ortam:
|
||
|
||
```text
|
||
Node: v24.16.0
|
||
pnpm: 11.5.1
|
||
Platform: macOS arm64
|
||
```
|
||
|
||
| Komut | Sonuç | Kanıt/not |
|
||
| --- | --- | --- |
|
||
| `npm run typecheck` | Başarılı | TypeScript hata vermedi |
|
||
| `npm run phase3:ui-boundary` | Başarılı | Tarihsel internal UI boundary script'i geçti |
|
||
| `npm run lint` | Başarısız | 32 error, 22 warning; `any`, `set-state-in-effect`, unused import, unescaped entity ve image uyarıları |
|
||
| `npm run phase1:smoke` | Başarısız | `better-sqlite3` native binding yok |
|
||
| `npm run phase2:smoke` | Çalışmadı | Faz 1 zinciri başarısız olduğu için başlanmadı; aynı native runtime'a bağlı |
|
||
| `npm run build` | Başarısız | Compile ve TypeScript geçti; page data aşamasında default `/app/data` oluşturulamadı |
|
||
| Temp `DATA_DIR` ile build | Başarısız | `/app/data` sorunu izole edildi; sonra eksik `better-sqlite3` binding'inde durdu |
|
||
|
||
Pnpm durumu:
|
||
|
||
- `pnpm ignored-builds`, `better-sqlite3`, `esbuild`, `sharp` ve `unrs-resolver` build scriptlerinin ignore edildiğini raporluyor.
|
||
- `pnpm-workspace.yaml` içindeki `allowBuilds` değerleri henüz boolean olarak kilitlenmemiş.
|
||
- Native binding düzeltilmeden SQLite smoke ve production build yeşil kabul edilemez.
|
||
- Build sırasında production varsayılanının `/app/data` olması builder aşamasında güvenli build-time path gereksinimi doğuruyor; Faz 1 hardening maddesidir.
|
||
|
||
## 15. Faz 0 tamamlanma durumu
|
||
|
||
Tamamlanan:
|
||
|
||
- Ürün kapsam kararları ADR ile kilitlendi.
|
||
- Güncel route ve özellik envanteri çıkarıldı.
|
||
- Kritik kullanıcı akışları kod davranışı ve hedef sözleşmeyle kaydedildi.
|
||
- Supabase kaynak schema, bucket, RPC ve fixture envanteri çıkarıldı.
|
||
- Source-to-target data mapping onaylandı.
|
||
- Poyraz UI v3 kararı ADR-0006 olarak güncellendi.
|
||
- Local typecheck/lint/build/smoke baseline'ı kaydedildi.
|
||
|
||
Açık dış veri:
|
||
|
||
- Production Supabase gerçek satır sayıları
|
||
- Production status dağılımları
|
||
- Storage bucket dosya sayısı ve toplam boyut
|
||
- Storage orphan path raporu
|
||
|
||
Bu dış veri kalemleri için hazır audit sorguları vardır; read-only export veya erişim sağlandığında Faz 0'ın son açık checklist maddesi kapatılacaktır.
|