Debashis
Deploy AIMS Full-Stack - 2026-03-28 18:01:53
45ab2bd
"""
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()
)