60 lines
4.0 KiB
Markdown
60 lines
4.0 KiB
Markdown
# Faz 5 — Freelancer backend geçişi
|
||
|
||
Tarih: 2026-07-16
|
||
|
||
## Kapsam
|
||
|
||
Bu faz mevcut freelancer ekranlarını yeniden tasarlamadan, çekirdek veri okuma ve mutation akışlarını Supabase'ten Better Auth + SQLite + Drizzle domain katmanına taşır.
|
||
|
||
Faz 5 kapsamı:
|
||
|
||
- profil, avatar, şifre ve AI tercih kaydı;
|
||
- müşteri listesi, CRM pipeline, detay ve aktiviteler;
|
||
- proje, planning section, yerel kapak dosyası, revizyon durumu ve proje ayarları;
|
||
- görev, takvim, finans ve günlük CRUD akışları;
|
||
- dashboard ve analytics tarih aralıklı aggregate'leri.
|
||
|
||
Portal sayfaları Faz 6'ya; chat, AI analiz route'ları ve business sayfaları Faz 7'ye aittir. Supabase import/cutover ve paketlerin fiziksel olarak kaldırılması Faz 8 kapsamındadır.
|
||
|
||
## Runtime envanteri ve yeni karşılıklar
|
||
|
||
| Modül | Eski runtime kaynağı | Yeni backend sınırı |
|
||
| --- | --- | --- |
|
||
| Ayarlar | Supabase Auth, `profiles`, `app_settings`, Storage | Better Auth API, `app_profiles`, local file service, encrypted `user_ai_settings` |
|
||
| Müşteriler | `clients`, `client_activities`, ilişkili tablo sorguları | `DomainService` + owner-scoped repository + server-side özetler |
|
||
| Projeler | `projects`, `project_planning_sections`, Supabase Storage | Domain service + local project asset + `/api/files/:id` |
|
||
| Görevler | `tasks` ve browser tarafı filtre/kanban | Domain service mutation'ları; mevcut filtre/kanban UI korunur |
|
||
| Takvim | `calendar_events` ve Supabase join'leri | Domain service + server-side relation map |
|
||
| Finans | decimal `finance_transactions` | integer minor unit + adapter'da kontrollü decimal dönüşüm |
|
||
| Günlük | `daily_logs` upsert/update | `journal_entries`, owner+tarih tekilliği |
|
||
| Dashboard | `get_dashboard_metrics` RPC | tarih aralıklı repository sorguları + domain aggregate |
|
||
| Analytics | `get_analytics_metrics` RPC | SQLite task status ve proje geliri aggregate'leri |
|
||
|
||
## Uygulanan kurallar
|
||
|
||
- Server Component ve Server Action'lar `requireFreelancerBackend()` ile Better Auth session'ından actor üretir.
|
||
- Owner kimliği formdan veya query'den alınmaz.
|
||
- Form verileri merkezi adapter yardımcılarıyla temizlenir; son domain validation Zod schema'larında yapılır.
|
||
- Update schema'ları create default'larından ayrı patch sözleşmeleridir; kısmi güncelleme status, pipeline, visibility, currency veya progress mode alanlarını sessizce varsayılana döndüremez.
|
||
- Müşteri/proje/görev ilişkileri service katmanında doğrulanır. UI yalnızca proje seçtiğinde adapter eksik client bağını owned project'ten türetir.
|
||
- Para verileri SQLite'ta minor unit olarak kalır; mevcut UI sözleşmesine girerken ve formdan çıkarken 100 tabanlı dönüşüm yapılır.
|
||
- Avatar ve proje kapağı yerel file service'in MIME, boyut, magic-byte, scope ve path politikalarından geçer.
|
||
- AI API key ayar ekranına geri okunmaz ve `localStorage`'a yazılmaz. Key AES-256-GCM ile server-side şifrelenir; runtime AI entegrasyonu Faz 7'de bu service'e bağlanacaktır.
|
||
- Dashboard tarih aralığı allowlist ile doğrulanır; RPC yerine owner-scoped SQLite sorguları kullanılır.
|
||
|
||
## Migration
|
||
|
||
`0005_brief_black_bolt.sql`, owner'a bire bir bağlı `user_ai_settings` tablosunu ekler. Provider allowlist'i database CHECK constraint'iyle de korunur. API key alanında yalnızca şifreli payload saklanır.
|
||
|
||
## Doğrulama
|
||
|
||
- `pnpm phase5:backend-boundary`: 31 Faz 5 runtime dosyasında Supabase import/env/veri erişimi olmadığını doğrular.
|
||
- `pnpm phase2:domain-smoke`: gerçek migration uygulanmış SQLite'ta CRUD, aggregate, relation invariant ve cross-owner negatiflerini doğrular.
|
||
- `pnpm phase5:smoke`: yukarıdaki kontrollerin yanında Better Auth owner cookie ile 11 kritik freelancer route'unu SSR eder.
|
||
- `pnpm typecheck`: başarılı.
|
||
- Faz 5 adapter ve backend dosyalarında hedefli ESLint: başarılı.
|
||
- `pnpm build`: başarılı.
|
||
- `git diff --check`: başarılı.
|
||
|
||
Repo genel lint'i, Faz 5'in değiştirmediği legacy client component ve Faz 6–7 dosyalarındaki mevcut borçlar nedeniyle release genelinde açık kalır.
|