from collections.abc import AsyncIterator from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from app.api.router import api_router from app.core.config import get_settings from app.core.database import init_database from app.core.dependencies import app_state from app.core.logging import configure_logging from app.websocket.router import websocket_router @asynccontextmanager async def lifespan(_: FastAPI) -> AsyncIterator[None]: configure_logging() await init_database() await app_state.startup() try: yield finally: await app_state.shutdown() settings = get_settings() app = FastAPI(title=settings.app_name, lifespan=lifespan, docs_url=None, redoc_url=None) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(api_router, prefix="/api/v1") app.include_router(websocket_router) if settings.frontend_dist.exists(): app.mount("/", StaticFiles(directory=settings.frontend_dist, html=True), name="frontend")