""" FastAPI main application entry point. Job ID: MTAD-IMPL-2025-11-18-CL """ import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.config import settings from app.database import init_db, close_db from app.api.v1 import api_router # Configure logging logging.basicConfig( level=settings.log_level, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): """Lifespan context manager for startup and shutdown events.""" # Startup logger.info("Starting MoreThanADiagnosis API") await init_db() logger.info("Database initialized") yield # Shutdown logger.info("Shutting down MoreThanADiagnosis API") await close_db() logger.info("Database connections closed") # Create FastAPI app app = FastAPI( title=settings.api_title, description=settings.api_description, version=settings.api_version, lifespan=lifespan, ) # Add CORS middleware app.add_middleware( CORSMiddleware, allow_origins=settings.cors_origins, allow_credentials=settings.cors_credentials, allow_methods=settings.cors_methods, allow_headers=settings.cors_headers, ) # Include API routes app.include_router(api_router, prefix=f"/api/{settings.api_version}") # Health check endpoint @app.get("/health", tags=["Health"]) async def health_check(): """Health check endpoint for uptime monitoring.""" return { "status": "healthy", "version": settings.api_version, "env": settings.env, } @app.get("/", tags=["Root"]) async def root(): """Root endpoint.""" return { "service": settings.api_title, "version": settings.api_version, "docs": "/docs", "redoc": "/redoc", } if __name__ == "__main__": import uvicorn uvicorn.run( "app.main:app", host="0.0.0.0", port=8000, reload=settings.debug, log_level=settings.log_level.lower(), )