feat(katalog): kategori ve ödeme türü uç noktaları, hane izolasyonu entegrasyon testleri

- /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>
This commit is contained in:
2026-11-11 23:54:16 +03:00
parent 4cc4fa5882
commit 6eb5440d4d
21 changed files with 1257 additions and 44 deletions
+3 -24
View File
@@ -1,23 +1,8 @@
mod auth;
mod config;
mod db;
mod error;
mod extract;
mod models;
mod routes;
mod services;
mod state;
use std::{net::SocketAddr, process::ExitCode, sync::Arc, time::Duration};
use std::{net::SocketAddr, process::ExitCode};
use kakeibo::{config::Config, db, routes, state::AppState};
use tracing_subscriber::EnvFilter;
use crate::{
auth::{jwt::Jwt, limiter::LoginLimiter},
config::Config,
state::AppState,
};
#[tokio::main]
async fn main() -> ExitCode {
// .env dosyasını yükle (proje kökünde; üst klasörler de aranır). Yoksa sorun değil.
@@ -57,13 +42,7 @@ async fn main() -> ExitCode {
}
let port = config.port;
let state = AppState {
db,
jwt: Arc::new(Jwt::new(&config.jwt_secret)),
// Aynı e-postaya 15 dakikada en fazla 5 hatalı giriş denemesi
login_limiter: Arc::new(LoginLimiter::new(5, Duration::from_secs(15 * 60))),
config: Arc::new(config),
};
let state = AppState::new(db, config);
let app = routes::router(state);
let addr = SocketAddr::from(([0, 0, 0, 0], port));