US01-02: Establish Application and Database Foundation (#47)

This commit was merged in pull request #47.
This commit is contained in:
2026-07-15 16:33:25 +02:00
parent ffafa308de
commit a723b63d55
22 changed files with 821 additions and 1 deletions

View File

@@ -0,0 +1,45 @@
"""Liveness and readiness endpoints.
``/health/live`` answers whether the process is up. ``/health/ready`` answers
whether it can serve: the database is reachable and configured correctly (WAL,
foreign keys). Tests and any future orchestration wait on readiness rather than a
sleep. Readiness returns 503 until the checks pass.
"""
from __future__ import annotations
from fastapi import APIRouter, Request, Response
from sqlalchemy import text
router = APIRouter(tags=["health"])
@router.get("/health/live")
def live() -> dict:
return {"status": "alive"}
@router.get("/health/ready")
def ready(request: Request, response: Response) -> dict:
checks: dict[str, object] = {}
ok = True
engine = getattr(request.app.state, "engine", None)
if engine is None:
ok = False
checks["database"] = "unavailable"
else:
try:
with engine.connect() as conn:
conn.execute(text("SELECT 1"))
journal_mode = conn.execute(text("PRAGMA journal_mode")).scalar()
foreign_keys = conn.execute(text("PRAGMA foreign_keys")).scalar()
checks["database"] = "ok"
checks["journal_mode"] = journal_mode
checks["foreign_keys"] = int(foreign_keys)
if str(journal_mode).lower() != "wal" or int(foreign_keys) != 1:
ok = False
except Exception:
ok = False
checks["database"] = "error"
response.status_code = 200 if ok else 503
return {"status": "ready" if ok else "not_ready", "checks": checks}