import sys
from contextlib import asynccontextmanager
import uvicorn
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from loguru import logger
from sqlalchemy.exc import SQLAlchemyError
from app.database import check_database, engine
logger.remove()
logger.add(
sys.stderr,
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function} - {message}",
)
@asynccontextmanager
async def lifespan(app: FastAPI):
await check_database()
logger.info("Database connection verified")
yield
await engine.dispose()
logger.info("Database engine disposed")
app = FastAPI(
title="Operation Room Monitor",
lifespan=lifespan,
)
@app.get("/health")
async def health():
logger.debug("Health check")
try:
await check_database()
except SQLAlchemyError as exc:
logger.warning("Health check: database unavailable: {}", exc)
return JSONResponse(
status_code=503,
content={"status": "degraded", "database": "unavailable"},
)
return {"status": "ok", "database": "connected"}
def main() -> None:
uvicorn.run(
"main:app",
host="0.0.0.0",
port=8000,
reload=True,
)
if __name__ == "__main__":
main()