from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi_swagger import patch_fastapi from domains.auth.api import router as auth_router from domains.users.api import router as users_router from domains.admin.api import router as admin_router from domains.groups.api import router as groups_router from domains.realtime.ws import router as realtime_router from domains.notifications.api import router as notifications_router from integrations.livekit.client import close_livekit_api from db.redis import redis_client @asynccontextmanager async def lifespan(app: FastAPI): # ---------- Startup ---------- try: await redis_client.ping() # type: ignore print("Redis connected") async for key in redis_client.scan_iter("speaker:*"): await redis_client.delete(key) async for key in redis_client.scan_iter("presence:*"): await redis_client.delete(key) except Exception as e: print("Redis connection failed:", e) yield # ---------- Shutdown ---------- await close_livekit_api() await redis_client.close() app = FastAPI( title="NEDA API", description="Realtime Voice Communication Backend", version="1.0.0", lifespan=lifespan, docs_url=None, swagger_ui_oauth2_redirect_url=None ) patch_fastapi(app,docs_url="/swagger") # ------------------------- # CORS # ------------------------- app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # ------------------------- # Routers # ------------------------- app.include_router(auth_router) app.include_router(users_router) app.include_router(admin_router) app.include_router(groups_router) app.include_router(realtime_router) app.include_router(notifications_router)