from collections.abc import AsyncGenerator from contextlib import asynccontextmanager import socketio from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.api import api_router from app.core.database import init_db from app.core.logging import get_logger, setup_logging from app.middleware.logging import LoggingMiddleware from app.services.extraction_processor import extraction_processor from app.services.socket import socket_manager @asynccontextmanager async def lifespan(_app: FastAPI) -> AsyncGenerator[None, None]: """Application lifespan context manager for setup and teardown.""" setup_logging() logger = get_logger(__name__) logger.info("Starting application") await init_db() logger.info("Database initialized") # Start the extraction processor await extraction_processor.start() logger.info("Extraction processor started") yield logger.info("Shutting down application") # Stop the extraction processor await extraction_processor.stop() logger.info("Extraction processor stopped") def create_app(): """Create and configure the FastAPI application.""" app = FastAPI(lifespan=lifespan) # Add CORS middleware app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:8001"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.add_middleware(LoggingMiddleware) # Include API routes app.include_router(api_router) # Create Socket.IO app with fallback to FastAPI app return socketio.ASGIApp(socket_manager.sio, app) app = create_app()