6eb5440d4d
- /api/categories ve /api/payment-methods: listele, ekle, düzenle, sırala, pasife al - Sürüm kontrolü ile eşzamanlı düzenleme çakışması (409) - Backend lib + bin yapısına ayrıldı (entegrasyon testleri için) - tests/: hane izolasyonu (3) ve katalog (4) entegrasyon testleri - db:reset artık artık test veritabanlarını da siler - api.http tamamlandı; Faz 1 tamamlandı Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.8 KiB
5.8 KiB
🧠 Proje Hafızası
▶️ Sıradaki Adım
Faz 2 – Başlangıç: Faz 2 planını sun (Tailwind + shadcn/ui kurulumu, tasarım token'ları, tema, logo/ikonlar, layout + navigasyon, giriş/kayıt ekranları, lib/format.ts, lib/api.ts), onay al.
📌 Alınan Kararlar
- Sürüm kontrolü: Gitea (
https://gitea.ta1sph.info/suphicakir/kakeibo.git), dalmain. - Her adım sonunda Claude commit atar ve haber verir; push'u kullanıcı kendi uygulamasıyla yapar (Claude
git pushçalıştırmaz). - Node v26 (LTS) sistemde mevcut; ayrı kurulum gerekmedi.
- Yerel MongoDB host portu 27020 (27017 sistem mongod, 27018/27019 başka projeler).
- Frontend lint aracı: oxlint (Vite şablonu varsayılanı), ESLint yerine.
- Veri modeli v1 onaylandı (2026-11-11): ölçekli tam sayı (
_e6), tarihYYYY-MM-DDmetin, dönem bitişi hariç, kullanıcı = tek hane, ayarlar haneye gömülü, haftalık bütçe hesaplanır. - Model yaklaşımı:
#[serde(flatten)]yerine ortak alanlarmodels/common.rsyardımcılarıyla (new_meta,scope,touch). Modeller ilgili adımda eklenir. households.household_id = _id(scope filtresi her yerde aynı).- Auth: JWT (HS256, jsonwebtoken
rust_crypto)kakeibo_sessioncookie'de; HttpOnly, SameSite=Lax, Secure yalnızca APP_URL https ise. Beni hatırla → 30 gün Max-Age; değilse 12 saat JWT + oturum cookie'si. Kayıttan sonra 30 gün. - Giriş sınırı: e-posta başına 15 dk'da 5 hatalı deneme (bellek içi,
auth/limiter.rs). Olmayan kullanıcıda da sahte argon2 doğrulaması (zamanlama sızıntısı yok). - Hata kodları:
{error:{code,message}};invalid_credentials,unauthorized,bad_request,conflict,too_many_requests. - Hane izolasyonu kuralı: hane kimliği her zaman
AuthUser.household_id'den alınır, asla URL/gövdeden. Başka hanenin kaydı → 404 (403 değil; varlığı sızdırılmaz). AuthUserher istekte DB'den kullanıcıyı doğrular (silinen kullanıcı → 401, rol DB'den). Owner-only işlemler:auth.require_owner()?.- Davet: 8 karakter (31 harflik okunaklı alfabe), 7 gün, tek kullanım;
find_one_and_updateile atomik claim, kayıt transaction'ı içinde. - Kategoriler/ödeme türleri: tüm üyeler yönetir; silme yok (pasife alma); grup sonradan değişmez; ad grup içinde benzersiz (büyük/küçük harf duyarsız, pasifler dahil); PATCH'te
version→ iyimser kilit (409); sıralama tam liste ister. - Sürümler: Rust 1.99.1 (edition 2024), Axum 0.8, React 19, Vite 8, TypeScript 7.
❓ Açık Konular
- Üye çıkarma / rol değiştirme / sahipliği devretme henüz yok (Ayarlar ekranıyla birlikte, Faz 2+).
- Kapalı dönem yeniden açılırken başka açık dönem varsa davranış (Faz 6).
- Altın kuru için veri kaynağı seçimi (Faz 8).
- Aylık değerlendirme çıktı formatı kullanıcıdan gelecek (Faz 9).
- Canlı MongoDB kurulum şekli (konteyner mi, doğrudan mı) Faz 3'te birlikte kontrol edilecek.
📝 İlerleme Günlüğü
2026-11-11 — Faz 0
- Adım 1: Ortam kontrol edildi. CachyOS, fish. Node 26, npm 12, Docker 29 + Compose 5, Git, VS Code, gcc mevcut. Rust ve cargo-watch eksik; kurulum komutları verildi.
- Adım 2:
.vscode/(extensions, settings, tasks, launch),.gitignore,.env.exampleve monorepo klasörleri oluşturuldu.git init -b main. - Adım 3:
CLAUDE.md,docs/MEMORY.md,docs/PHASES.mdoluşturuldu. Gitea remote eklendi, ilk commit push edildi. - Adım 4: Rust kuruldu.
docker-compose.dev.yml(mongo:7, rs0, healthcheck ile otomatikrs.initiate). Backend: Axum, yalnızcaGET /api/health. Frontend: Vite react-ts şablonu,/apiproxy → 8080, geçici durum ekranı. Kökpackage.json: concurrently ilenpm run dev. Uçtan uca test edildi (Mongo PRIMARY, proxy çalışıyor). - Adım 5:
docs/DATA_MODEL.mdhazırlandı ve onaylandı. Faz 0 tamamlandı.
2026-11-11 — Faz 1
- Adım 1:
config.rs(env + doğrulama, JWT_SECRET ≥ 32),db.rs(5 sn timeout + ping),error.rs(AppError→{error:{code,message}}Türkçe; 5xx detayı yalnızca logda),state.rs,routes/(health: DB yoksa 503). Açılışta DB/ayar hatasında anlaşılır log + çıkış kodu 1. Elle test: 4 senaryo geçti. - Adım 2:
db/modülü:colsabitleri,migrations.rs(schema_migrations, v1 = koleksiyonları oluştur),indexes.rs(DATA_MODEL §4 + tüm hane koleksiyonlarına(household_id, updated_at)).models/common.rs: UUID v7,new_meta,scope,touch. Açılıştadb::prepare. 4 birim testi; idempotency ve tek açık dönem indeksi elle doğrulandı.uuid(v7) eklendi. - Adım 3: Kimlik doğrulama:
auth/(password argon2id + spawn_blocking, jwt, limiter, session cookie +AuthUserextractor),extract.rs(ValidJson= JSON + validator, Türkçe 400),services/account.rs(kayıt tek transaction: hane + owner + 13 kategori + 4 ödeme türü),services/seed.rs,routes/auth.rs(register/login/logout/me). Yeni crate'ler: argon2, jsonwebtoken, axum-extra(cookie), validator, time. 11 birim testi; 13 senaryo curl ile, rollback DB'de doğrulandı. - Adım 4:
AuthUserDB doğrulaması +require_owner,services/invite.rs(create/list_active/revoke/claim), kayıt davet koduylamemberolarak katılma (services/account.rsyeniden düzenlendi),routes/household.rs(GET /household, invites GET/POST/DELETE). 13 birim testi; 15 senaryo e2e (izolasyon 404, member 403, kod tekrar kullanımı, rollback) geçti. - Adım 5:
models/group.rs,services/catalog.rs(kategori + ödeme türü ortak: list/create/update/reorder),routes/catalog.rs. Backend lib+bin'e ayrıldı (AppState::new). Entegrasyon testleri:tests/isolation.rs(3),tests/catalog.rs(4) — toplam 22 test. İzolasyon testi, kasıtlı açık eklenerek doğrulandı (yakaladı).db:resetartık test DB'lerini de siler. Dev-deps: tower, http-body-util. Faz 1 tamamlandı.