"""Main FastAPI application.""" import logging from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.config import settings from app.database import init_db from app.api import api_router # Configure logging def setup_logging(): """Configure application logging.""" log_dir = Path(settings.log_file).parent log_dir.mkdir(parents=True, exist_ok=True) logging.basicConfig( level=getattr(logging, settings.log_level.upper()), format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler(settings.log_file), logging.StreamHandler() ] ) setup_logging() logger = logging.getLogger(__name__) # Create FastAPI application app = FastAPI( title=settings.app_name, version=settings.app_version, description="Network scanning and visualization tool API", docs_url="/docs", redoc_url="/redoc" ) # Configure CORS app.add_middleware( CORSMiddleware, allow_origins=settings.cors_origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Include API router app.include_router(api_router, prefix=settings.api_prefix) @app.on_event("startup") async def startup_event(): """Initialize application on startup.""" logger.info(f"Starting {settings.app_name} v{settings.app_version}") # Initialize database try: init_db() logger.info("Database initialized successfully") except Exception as e: logger.error(f"Failed to initialize database: {e}") raise @app.on_event("shutdown") async def shutdown_event(): """Cleanup on application shutdown.""" logger.info("Shutting down application") @app.get("/") async def root(): """Root endpoint.""" return { "name": settings.app_name, "version": settings.app_version, "status": "running", "docs": "/docs" } @app.get("/health") async def health_check(): """Health check endpoint.""" return { "status": "healthy", "version": settings.app_version } if __name__ == "__main__": import uvicorn uvicorn.run( "main:app", host="0.0.0.0", port=8000, reload=False, log_level=settings.log_level.lower() )