45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
from fastapi import APIRouter, HTTPException, Request
|
|
|
|
from app.services.db import health_check
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
def _startup_payload(request: Request) -> dict:
|
|
return {
|
|
"started": bool(getattr(request.app.state, "startup_started", False)),
|
|
"complete": bool(getattr(request.app.state, "startup_complete", False)),
|
|
"error": getattr(request.app.state, "startup_error", None),
|
|
"warnings": dict(getattr(request.app.state, "background_warnings", {}) or {}),
|
|
}
|
|
|
|
|
|
def _readiness_payload(request: Request) -> tuple[bool, dict]:
|
|
db_ok = health_check()
|
|
startup = _startup_payload(request)
|
|
ready = db_ok and startup["complete"] and not startup["error"]
|
|
payload = {
|
|
"status": "ok" if ready else "not_ready",
|
|
"db": "ok" if db_ok else "unavailable",
|
|
"startup": startup,
|
|
}
|
|
return ready, payload
|
|
|
|
|
|
@router.get("/health/live")
|
|
def liveness():
|
|
return {"status": "ok"}
|
|
|
|
|
|
@router.get("/health/ready")
|
|
def readiness(request: Request):
|
|
ready, payload = _readiness_payload(request)
|
|
if not ready:
|
|
raise HTTPException(status_code=503, detail=payload)
|
|
return payload
|
|
|
|
|
|
@router.get("/health")
|
|
def health(request: Request):
|
|
return readiness(request)
|