Skip to main content

karbon_framework/http/middleware/
maintenance.rs

1use axum::{extract::Request, http::StatusCode, middleware::Next, response::IntoResponse, response::Response};
2use serde::Serialize;
3use std::sync::atomic::{AtomicBool, Ordering};
4
5/// Global maintenance mode flag
6pub static MAINTENANCE: AtomicBool = AtomicBool::new(false);
7
8/// Enable or disable maintenance mode at runtime
9pub fn set_maintenance(enabled: bool) {
10    MAINTENANCE.store(enabled, Ordering::Relaxed);
11}
12
13/// Check if maintenance mode is active
14pub fn is_maintenance() -> bool {
15    MAINTENANCE.load(Ordering::Relaxed)
16}
17
18#[derive(Serialize)]
19struct MaintenanceResponse {
20    error: &'static str,
21    message: &'static str,
22}
23
24/// Middleware that returns 503 when maintenance mode is active
25pub async fn maintenance_mode(request: Request, next: Next) -> Response {
26    if is_maintenance() {
27        let body = MaintenanceResponse {
28            error: "maintenance",
29            message: "The API is currently under maintenance. Please try again later.",
30        };
31        return (StatusCode::SERVICE_UNAVAILABLE, axum::Json(body)).into_response();
32    }
33
34    next.run(request).await
35}