b269411823
- Giriş: satır içi doğrulama, şifre göster/gizle, beni hatırla, hoş geldin bildirimi - Kayıt: yeni hane kur / davetle katıl, /kayit?davet=KOD bağlantısı - Sunucu hataları ilgili alanda gösterilir (kayıtlı e-posta, geçersiz davet) - react-hook-form + zod, sonner bildirimleri, shadcn input/label/checkbox/card - Ortak form bileşenleri (FormField, PasswordInput, FormError) - 8 form kuralı testi (toplam 47); api.http demo hesaplara güncellendi - Faz 2 tamamlandı Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
81 lines
5.6 KiB
Markdown
81 lines
5.6 KiB
Markdown
# Kakeibo — Proje Rehberi
|
||
|
||
Japon Kakeibo yöntemine dayalı, hane bazlı kişisel ev finans defteri.
|
||
Tam gereksinimler: `KAKEIBO_PROMPT.md` (yalnızca ilgili bölümü oku).
|
||
|
||
## Çalışma Kuralları
|
||
- Faz bazlı, küçük adımlar. Her adım sonunda dur, kısa özet ver, onay bekle.
|
||
- Yeni session'da yalnızca `CLAUDE.md` + `docs/MEMORY.md` oku; tüm projeyi tarama.
|
||
- `target/`, `node_modules/`, `dist/`, `*.lock` dosyalarını asla okuma.
|
||
- Değişikliklerde dosyayı baştan yazma; yalnızca değişen kısmı düzenle.
|
||
- Yanıt formatı: ne yapıldı → nasıl test edilir → sıradaki adım.
|
||
- Her adım sonunda `docs/MEMORY.md`'ye 3–5 satır not ekle.
|
||
- Her adım sonunda Claude commit atar ve "push zamanı" diye haber verir; push'u kullanıcı kendi uygulamasıyla yapar (Claude `git push` çalıştırmaz).
|
||
- Bir hata 2 denemede çözülmezse dur, seçenek sun.
|
||
- Kullanıcı Rust'a yeni: kavramları ihtiyaç anında, kısa örnekle açıkla.
|
||
- Her yeni bağımlılık için kısa gerekçe ver.
|
||
|
||
## Teknoloji Yığını
|
||
- **Backend:** Rust + Axum + tokio + resmi `mongodb` sürücüsü, `serde`, `validator`
|
||
- **Auth:** argon2 + JWT (httpOnly, Secure, SameSite cookie)
|
||
- **Frontend:** React + TypeScript + Vite, TailwindCSS, shadcn/ui, lucide-react
|
||
- **Veri/Form:** TanStack Query, react-hook-form + zod, date-fns (tr)
|
||
- **Diğer:** Recharts, sonner, react-markdown + remark-gfm, vite-plugin-pwa
|
||
- **Tipler:** `ts-rs` (Rust → `frontend/src/types/`)
|
||
- **DB:** MongoDB 7, tek düğümlü replica set (transaction için)
|
||
- **Dağıtım:** Tek Docker imajı (Axum frontend'i de sunar) → Dokploy (Atlas homeserver)
|
||
- **Gelecek:** Tauri 2 (Windows, Linux, Android)
|
||
|
||
## Klasör Yapısı
|
||
```
|
||
backend/src/ main.rs, config.rs, db.rs, auth/, models/, routes/, services/
|
||
frontend/src/ components/ui/, features/, lib/ (api, format), types/
|
||
docs/ MEMORY, PHASES, DATA_MODEL, DEPLOY
|
||
templates/ monthly_report.md
|
||
scripts/ seed, reset, backup
|
||
```
|
||
|
||
## Kodlama Kuralları
|
||
- Kod İngilizce; arayüz metinleri Türkçe ve tek dosyada toplanır.
|
||
- İş mantığı: backend `services/`, frontend `lib/`.
|
||
- Para: kuruş cinsinden `i64` (asla float). Altın/kur: Decimal128 veya ölçekli tamsayı.
|
||
- Tüm kayıtlar: `_id` (UUID v7), `household_id`, `created_at`, `updated_at`, `deleted_at`, `version`.
|
||
- Her sorgu `household_id` ile filtrelenir (ortak middleware).
|
||
- Hesaplanan değerler saklanmaz; aggregation ile hesaplanır.
|
||
- Format: `1.250,00 ₺`, tarih `GG.AA.YYYY`; tümü `lib/format.ts` üzerinden.
|
||
- Haftalar Pazartesi başlar; kısmi haftalar gün sayısına göre orantılanır.
|
||
- Hatalar kullanıcıya Türkçe ve sade; teknik detay yalnızca logda.
|
||
- Commit mesajları Türkçe: `feat(defter): haftalık giriş listesi eklendi`
|
||
|
||
## Sık Kullanılan Komutlar
|
||
```
|
||
npm run dev # frontend (5173) + backend (8080) birlikte, hot reload
|
||
npm run dev:host # telefondan test için ağa aç
|
||
npm run db:up # yerel MongoDB (Docker)
|
||
npm run db:down
|
||
npm run db:seed
|
||
npm run db:reset # kakeibo_dev + artık kakeibo_test_* veritabanlarını siler
|
||
npm test # backend (cargo test, MongoDB açık olmalı) + frontend (vitest)
|
||
npm run lint # clippy + oxlint
|
||
npm run types # Rust DTO → frontend/src/types/*.ts (ts-rs; cargo test de üretir)
|
||
npm run icons # frontend/brand/*.svg → favicon, PWA, Apple, Tauri ikonları (rsvg-convert + magick)
|
||
```
|
||
- `npm run dev` öncesinde DB otomatik başlar (`predev`).
|
||
- Yerel MongoDB host portu **27020** (27017 sistem mongod, 27018/27019 diğer projeler).
|
||
- Frontend lint: **oxlint** (Vite şablonu varsayılanı; ESLint yerine). `components/ui/**` shadcn dosyaları.
|
||
- Frontend: Tailwind v4 (`src/index.css` token'ları), shadcn/ui (style `radix-nova`, `cn` paketi), `@/` → `src/`. Renkler: `bg-needs`/`text-needs-fg`/`bg-needs-soft` (wants, culture, unexpected aynı), `text-income`/`text-expense`/`text-warning`. Tutarlarda `money` sınıfı. Butonlar ≥44 px (shadcn boyutları büyütüldü).
|
||
- API: `lib/api.ts` (`api.get/post/...`, hata → `ApiError` Türkçe `message`), `lib/query.ts` (QueryClient + `queryKeys`), `lib/auth.ts` (`useMe` → undefined/null/MeResponse, `useLogin`/`useRegister`/`useLogout`).
|
||
- Tipler: `frontend/src/types/` **elle düzenlenmez**; backend'de DTO'ya `#[derive(TS)] #[ts(export)]` ekle → `npm run types`. İstek yapılarında `optional_fields`.
|
||
- Sayfalar: `src/router.tsx`; adresler `components/layout/nav-items.ts` (`paths`); sayfa bileşenleri `features/<alan>/page.tsx`; iskelet `components/layout/app-layout.tsx`. Sayfa başlığı `PageHeader` (sekme başlığını da ayarlar). Metinler `lib/strings.ts` (`t`).
|
||
- Yönlendirme: `RequireAuth` (oturum yok → `/giris?donus=`), `RequireGuest` (oturum var → `donus` ya da panel; formlar ayrıca navigate etmez). `donus` daima `safeReturnPath` ile.
|
||
- Geliştirmede tasarım önizlemesi: `/dev/tasarim`.
|
||
- Formlar: react-hook-form + zod (`mode: 'onTouched'`), alanlar `components/form-field.tsx` (`FormField`, `PasswordInput`, `FormError`); sunucu hatası `setError` ile ilgili alana. Bildirim: `toast` (sonner, `components/toaster.tsx`).
|
||
- Grup tanımları: `lib/groups.ts`; tema: `lib/theme.tsx` (+ `index.html` içindeki ilk-boya betiği); biçimlendirme: `lib/format.ts`.
|
||
- API örnekleri: `backend/api.http`
|
||
- Backend = lib (`src/lib.rs`) + bin (`src/main.rs`). Entegrasyon testleri `backend/tests/` (her test geçici `kakeibo_test_<uuid>` DB, `tests/common` yardımcıları).
|
||
- Hane izolasyonu: hane kimliği yalnızca `AuthUser.household_id`'den; sorgular `scope(hid)` ile başlar; başka hane → 404.
|
||
|
||
## Ortam
|
||
- Geliştirme makinesi: CachyOS (Arch), fish kabuğu, VS Code
|
||
- Git remote: `https://gitea.ta1sph.info/suphicakir/kakeibo.git` (Gitea, dal: `main`)
|