from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from .routers import annotations, auth, pdfs, ws @asynccontextmanager async def lifespan(app: FastAPI): # Tables are managed by Alembic migrations. # Run: alembic upgrade head (done by docker-compose entrypoint) yield app = FastAPI(title="LMS API", lifespan=lifespan) app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:3000", "http://localhost:3001"], allow_credentials=True, # required for cookies allow_methods=["*"], allow_headers=["*"], ) app.include_router(auth.router, prefix="/api") app.include_router(pdfs.router, prefix="/api") app.include_router(annotations.router, prefix="/api") app.include_router(ws.router) # WebSocket — no /api prefix (ws:// path)