from fastapi import APIRouter, Response, status
from app.core.config import database_dialect, is_production
from app.core.schema_meta import CURRENT_SCHEMA_VERSION, check_database
from app.version import __version__
router = APIRouter(tags=["health"])
def _health_payload(*, deep: bool) -> dict:
payload: dict = {
"status": "healthy",
"version": __version__,
"environment": "production" if is_production() else "development",
"database_dialect": database_dialect(),
}
if deep:
db = check_database()
payload["database"] = db
if not db.get("ok"):
payload["status"] = "unhealthy"
elif not db.get("schema_up_to_date"):
payload["status"] = "degraded"
payload["expected_schema_version"] = CURRENT_SCHEMA_VERSION
return payload
@router.get("/api/health")
@router.get("/health")
async def health():
return _health_payload(deep=True)
@router.get("/api/health/live")
@router.get("/health/live")
async def health_live():
return {"status": "ok"}
@router.get("/api/health/ready")
@router.get("/health/ready")
async def health_ready(response: Response):
body = _health_payload(deep=True)
if body["status"] != "healthy":
response.status_code = status.HTTP_503_SERVICE_UNAVAILABLE
return body