__init__.py (1886B)
1 """Router registration for all sub-routers.""" 2 3 from fastapi import FastAPI, Request, Response 4 from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint 5 6 from app.auth import get_jwt_from_cookie, verify_jwt 7 from app.routes.auth import router as auth_router 8 from app.routes.attachments import router as attachments_router 9 from app.routes.chat import chat_router 10 from app.routes.sessions import router as sessions_router 11 from app.routes.topics import router as topics_router 12 from app.routes.search import router as search_router 13 from app.routes.models import router as models_router 14 15 _EXEMPT_PREFIXES = ("/api/auth/", "/api/health", "/ws/") 16 17 18 class AuthMiddleware(BaseHTTPMiddleware): 19 """JWT auth middleware for /api/* routes.""" 20 21 async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response: # pragma: no mutate: block 22 if request.url.path.startswith(_EXEMPT_PREFIXES): 23 return await call_next(request) 24 if request.method == "OPTIONS": 25 return await call_next(request) 26 if request.url.path.startswith("/api/"): 27 token = get_jwt_from_cookie(request) 28 if token is None: 29 return Response(status_code=401, content="Unauthorized") 30 try: 31 verify_jwt(token) 32 except Exception: 33 return Response(status_code=401, content="Invalid token") 34 return await call_next(request) 35 36 37 def register_routes(app: FastAPI) -> None: # pragma: no mutate: block 38 """Include all routers on the app.""" 39 app.include_router(auth_router) 40 app.include_router(chat_router) 41 app.include_router(attachments_router) 42 app.include_router(sessions_router) 43 app.include_router(topics_router) 44 app.include_router(search_router) 45 app.include_router(models_router) 46 app.add_middleware(AuthMiddleware)