from fastapi import APIRouter, FastAPI from fastapi.middleware.cors import CORSMiddleware from api.lifespan import app_lifespan from api.middlewares import UserConfigEnvUpdateMiddleware from api.middlewares.auth_middleware import AuthMiddleware from api.v1.ppt.router import API_V1_PPT_ROUTER from api.v1.webhook.router import API_V1_WEBHOOK_ROUTER from api.v1.mock.router import API_V1_MOCK_ROUTER from api.v1.auth.router import AUTH_ROUTER from api.v1.admin.users_router import USERS_ROUTER from api.v1.admin.teams_router import TEAMS_ROUTER from api.v1.admin.clients_router import CLIENTS_ROUTER from api.v1.admin.audit_router import AUDIT_ROUTER from api.v1.admin.brand_config_router import BRAND_CONFIG_ROUTER from api.v1.admin.master_decks_router import MASTER_DECKS_ROUTER from api.middlewares.audit_middleware import AuditMiddleware app = FastAPI(lifespan=app_lifespan) # Admin router aggregator ADMIN_ROUTER = APIRouter(prefix="/api/v1/admin") ADMIN_ROUTER.include_router(USERS_ROUTER) ADMIN_ROUTER.include_router(TEAMS_ROUTER) ADMIN_ROUTER.include_router(CLIENTS_ROUTER) ADMIN_ROUTER.include_router(AUDIT_ROUTER) ADMIN_ROUTER.include_router(BRAND_CONFIG_ROUTER) ADMIN_ROUTER.include_router(MASTER_DECKS_ROUTER) # Routers app.include_router(AUTH_ROUTER) app.include_router(ADMIN_ROUTER) app.include_router(API_V1_PPT_ROUTER) app.include_router(API_V1_WEBHOOK_ROUTER) app.include_router(API_V1_MOCK_ROUTER) # Middlewares (executed in reverse order: last added = first executed) # 1. CORS must run first (handles preflight OPTIONS) origins = ["*"] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 2. Auth middleware (validates JWT, attaches user to request.state) app.add_middleware(AuthMiddleware) # 3. Audit middleware (fire-and-forget logging for mutations) app.add_middleware(AuditMiddleware) # 4. User config middleware app.add_middleware(UserConfigEnvUpdateMiddleware)