62e92f552a
- POST /periods/{id}/close: tek transaction; açık → borç, artı → birikim + devir
- Devir sonraki dönem açılınca ona bağlanır
- POST /periods/{id}/reopen (sahip): düzeltme modu, yeni dönem açık kalır
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
103 lines
3.7 KiB
Rust
103 lines
3.7 KiB
Rust
//! 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)
|
||
}
|