//! API route'larının tek giriş noktası. Tüm uç noktalar `/api` altında. mod auth; mod budget; mod catalog; mod entry; mod health; mod household; mod note; mod period; mod plan; mod review; mod spa; use axum::{ Router, routing::{delete, get, patch, post, put}, }; use tower_http::{compression::CompressionLayer, trace::TraceLayer}; use crate::{error::AppError, state::AppState}; /// Sunucunun tamamı: API + (STATIC_DIR tanımlıysa) arayüz dosyaları, /// sıkıştırma ve istek logları. `main.rs` bunu kullanır. pub fn app(state: AppState) -> Router { let static_dir = state.config.static_dir.clone(); let mut app = router(state); if let Some(dir) = static_dir { app = app.fallback_service(spa::router(&dir)); } app.layer(CompressionLayer::new()) .layer(TraceLayer::new_for_http()) } /// Tüm API route'ları. Testler de bu fonksiyonu kullanır. pub fn router(state: AppState) -> Router { let api = Router::new() .route("/health", get(health::health)) .route("/auth/register", post(auth::register)) .route("/auth/registration", get(auth::registration_info)) .route("/auth/login", post(auth::login)) .route("/auth/logout", post(auth::logout)) .route("/auth/me", get(auth::me)) .route("/household", get(household::get)) .route( "/household/invites", get(household::list_invites).post(household::create_invite), ) .route("/household/invites/{id}", delete(household::revoke_invite)) .route( "/categories", get(catalog::list_categories).post(catalog::create_category), ) .route("/categories/order", put(catalog::reorder_categories)) .route("/categories/{id}", patch(catalog::update_category)) .route( "/payment-methods", get(catalog::list_payment_methods).post(catalog::create_payment_method), ) .route( "/payment-methods/order", put(catalog::reorder_payment_methods), ) .route( "/payment-methods/{id}", patch(catalog::update_payment_method), ) .route("/periods", get(period::list).post(period::create)) .route("/periods/current", get(period::current)) .route("/periods/{id}", get(period::get).patch(period::update)) .route("/periods/{id}/close", post(period::close)) .route("/periods/{id}/reopen", post(period::reopen)) .route( "/periods/{id}/plan-items", get(plan::list).post(plan::create), ) .route( "/periods/{id}/plan-items/copy-previous", post(plan::copy_previous), ) .route("/plan-items/{id}", patch(plan::update).delete(plan::delete)) .route("/periods/{id}/notes", get(note::list).post(note::create)) .route("/periods/{id}/summary", get(budget::summary)) .route("/periods/{id}/review", get(review::get)) .route( "/periods/{id}/budget", get(budget::get).put(budget::set_monthly), ) .route("/periods/{id}/budget/weeks", put(budget::set_week)) .route("/periods/{id}/budget/suggestion", get(budget::suggestion)) .route("/notes/{id}", patch(note::update).delete(note::delete)) .route( "/periods/{id}/entries", get(entry::list).post(entry::create), ) .route("/entries/{id}", patch(entry::update).delete(entry::delete)) .route("/entries/{id}/restore", post(entry::restore)) // Bilinmeyen /api/... → JSON 404 (arayüzün index.html'i dönmesin) .fallback(|| async { AppError::NotFound }); Router::new().nest("/api", api).with_state(state) }