//! Health check routes
use actix_web::{web, HttpResponse};
/// Health check handler
pub async fn health() -> HttpResponse {
HttpResponse::Ok().json(serde_json::json!({
"status": "ok",
"service": env!("CARGO_PKG_NAME")
}))
}
/// Liveness probe
pub async fn liveness() -> HttpResponse {
HttpResponse::Ok().json(serde_json::json!({"status": "alive"}))
}
/// Readiness probe
pub async fn readiness() -> HttpResponse {
HttpResponse::Ok().json(serde_json::json!({"status": "ready"}))
}
/// OpenAPI documentation
pub async fn openapi() -> HttpResponse {
HttpResponse::Ok()
.content_type("application/json")
.body(serde_json::json!({
"openapi": "3.0.0",
"info": {
"title": env!("CARGO_PKG_NAME"),
"version": env!("CARGO_PKG_VERSION"),
},
"paths": {}
}).to_string())
}
/// Swagger UI page
async fn swagger_ui() -> HttpResponse {
HttpResponse::Ok()
.content_type("text/html")
.body(r#"<!DOCTYPE html>
<html>
<head><title>Swagger UI</title></head>
<body>
<h1>Swagger UI</h1>
<p>Visit <a href="/api-docs/openapi.json">/api-docs/openapi.json</a> for the OpenAPI spec.</p>
</body>
</html>"#)
}
/// ReDoc page
async fn redoc() -> HttpResponse {
HttpResponse::Ok()
.content_type("text/html")
.body(r#"<!DOCTYPE html>
<html>
<head><title>ReDoc</title></head>
<body>
<h1>ReDoc</h1>
<p>Visit <a href="/api-docs/openapi.json">/api-docs/openapi.json</a> for the OpenAPI spec.</p>
</body>
</html>"#)
}
pub fn configure(cfg: &mut web::ServiceConfig) {
cfg.route("/health", web::get().to(health))
.route("/health/live", web::get().to(liveness))
.route("/health/ready", web::get().to(readiness))
.route("/api-docs/openapi.json", web::get().to(openapi))
.route("/swagger-ui", web::get().to(swagger_ui))
.route("/redoc", web::get().to(redoc));
}