""" Main FastAPI application """ import logging from contextlib import asynccontextmanager from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse from datetime import datetime from src.config.settings import settings from src.database import init_db from src.api import routes # Configure logging logging.basicConfig( level=getattr(logging, settings.log_level), format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): """Application lifecycle events""" # Startup logger.info(f"Starting {settings.app_name} v{settings.app_version}") init_db() logger.info("Database initialized") yield # Shutdown logger.info("Shutting down application") # Create FastAPI app app = FastAPI( title=settings.api_title, description=settings.api_description, version=settings.app_version, lifespan=lifespan ) # Add CORS middleware app.add_middleware( CORSMiddleware, allow_origins=settings.get_cors_origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Exception handlers @app.exception_handler(Exception) async def general_exception_handler(request: Request, exc: Exception): """Handle general exceptions""" logger.error(f"Unhandled exception: {exc}", exc_info=True) return JSONResponse( status_code=500, content={ "error": "Internal Server Error", "message": str(exc), "timestamp": datetime.utcnow().isoformat() } ) # Include routers app.include_router(routes.health_router, prefix=settings.api_prefix, tags=["health"]) app.include_router(routes.alerts_router, prefix=settings.api_prefix, tags=["alerts"]) app.include_router(routes.incidents_router, prefix=settings.api_prefix, tags=["incidents"]) app.include_router(routes.analysis_router, prefix=settings.api_prefix, tags=["analysis"]) @app.get("/") async def root(): """Root endpoint""" return { "app": settings.app_name, "version": settings.app_version, "status": "running" } if __name__ == "__main__": import uvicorn uvicorn.run( "src.main:app", host="0.0.0.0", port=8000, reload=settings.debug, log_level=settings.log_level.lower() )