Files
kakeibo/docs/MEMORY.md
T
suphicakir 4cc4fa5882 feat(hane): davet kodu ile üye katılımı ve hane izolasyonu
- AuthUser her istekte kullanıcıyı DB'den doğrular (silinen kullanıcı → 401)
- require_owner: yalnızca hane sahibine açık işlemler
- Davet kodu: oluştur, listele, iptal et (7 gün, tek kullanım)
- Davet koduyla kayıt → mevcut haneye member olarak katılma (transaction)
- GET /api/household: hane bilgisi ve üyeler
- api.http güncellendi

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 23:43:16 +03:00

5.2 KiB
Raw Blame History

🧠 Proje Hafızası

▶️ Sıradaki Adım

Faz 1 – Adım 5: Kategori (/api/categories) ve ödeme türü (/api/payment-methods) uç noktaları: listele, ekle, düzenle, sırala, pasife al (silme yok). Otomatik hane izolasyonu entegrasyon testleri (gerçek DB, ayrı test veritabanı). api.http tamamlanır → Faz 1 kapanır.

📌 Alınan Kararlar

  • Sürüm kontrolü: Gitea (https://gitea.ta1sph.info/suphicakir/kakeibo.git), dal main.
  • 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), tarih YYYY-MM-DD metin, 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 alanlar models/common.rs yardı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_session cookie'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).
  • AuthUser her 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_update ile atomik claim, kayıt transaction'ı içinde.
  • 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.example ve monorepo klasörleri oluşturuldu. git init -b main.
  • Adım 3: CLAUDE.md, docs/MEMORY.md, docs/PHASES.md oluşturuldu. Gitea remote eklendi, ilk commit push edildi.
  • Adım 4: Rust kuruldu. docker-compose.dev.yml (mongo:7, rs0, healthcheck ile otomatik rs.initiate). Backend: Axum, yalnızca GET /api/health. Frontend: Vite react-ts şablonu, /api proxy → 8080, geçici durum ekranı. Kök package.json: concurrently ile npm run dev. Uçtan uca test edildi (Mongo PRIMARY, proxy çalışıyor).
  • Adım 5: docs/DATA_MODEL.md hazı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ü: col sabitleri, 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ışta db::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 + AuthUser extractor), 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: AuthUser DB doğrulaması + require_owner, services/invite.rs (create/list_active/revoke/claim), kayıt davet koduyla member olarak katılma (services/account.rs yeniden 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.