906f05f62f
- Backend: ts-rs ile DTO'lardan TypeScript tipleri (frontend/src/types, npm run types) - Hata ve health yanıtları tipli yapılara çevrildi - lib/api.ts: tek API istemcisi, Türkçe ApiError, ağ hatası mesajı - lib/query.ts: QueryClient (4xx tekrar denenmez, 401 → oturum kapanır) - lib/auth.ts: useMe, useLogin, useRegister, useLogout - Vitest: 7 API istemcisi testi (toplam 29) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
1.1 KiB
Rust
44 lines
1.1 KiB
Rust
use axum::{Json, extract::State, http::StatusCode};
|
||
use serde::Serialize;
|
||
use ts_rs::TS;
|
||
|
||
use crate::{db, state::AppState};
|
||
|
||
#[derive(Serialize, TS)]
|
||
#[ts(export)]
|
||
pub struct HealthResponse {
|
||
/// `ok` veya `degraded`
|
||
status: &'static str,
|
||
/// `ok` veya `error`
|
||
db: &'static str,
|
||
version: &'static str,
|
||
}
|
||
|
||
/// Sağlık kontrolü (Dokploy health check bunu kullanır).
|
||
/// DB erişilemezse 503 döner.
|
||
pub async fn health(State(state): State<AppState>) -> (StatusCode, Json<HealthResponse>) {
|
||
let version = env!("CARGO_PKG_VERSION");
|
||
|
||
match db::ping(&state.db).await {
|
||
Ok(()) => (
|
||
StatusCode::OK,
|
||
Json(HealthResponse {
|
||
status: "ok",
|
||
db: "ok",
|
||
version,
|
||
}),
|
||
),
|
||
Err(e) => {
|
||
tracing::warn!(error = %e, "health: veritabanına erişilemiyor");
|
||
(
|
||
StatusCode::SERVICE_UNAVAILABLE,
|
||
Json(HealthResponse {
|
||
status: "degraded",
|
||
db: "error",
|
||
version,
|
||
}),
|
||
)
|
||
}
|
||
}
|
||
}
|