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()