from fastapi import APIRouter, Depends, Query, Request as FastAPIRequest from starlette.responses import JSONResponse from src.backend.api.dependencies import verify_api_key, limiter from src.backend.config import settings from src.backend.db.database import ( get_db, create_request, get_request, list_requests, delete_request, ) from src.backend.models.api import RequestCreate, ok, fail router = APIRouter( prefix="/requests", tags=["requests"], dependencies=[Depends(verify_api_key)], ) async def _get_db(): db = await get_db() try: yield db finally: await db.close() @router.post("", summary="Create request") @limiter.limit(lambda: f"{settings.rate_limit_per_minute}/minute;{settings.rate_limit_per_hour}/hour") async def create(request: FastAPIRequest, body: RequestCreate, db=Depends(_get_db)): req = await create_request( db, prompt=body.prompt, topic_id=body.topic_id, session_id=body.session_id, model=body.model, summarize=body.summarize, ) if req is None: return JSONResponse( status_code=404, content=fail("NOT_FOUND", "Topic not found"), ) if req == "SESSION_CLOSED": return JSONResponse( status_code=410, content=fail("SESSION_CLOSED", "Session is closed"), ) return JSONResponse( status_code=202, content=ok({ "id": req["id"], "session_id": req["session_id"], "status": req["status"], "created_at": req["created_at"], }), ) @router.get("", summary="List requests") async def list_all( status: str | None = Query(None), topic_id: str | None = Query(None), session_id: str | None = Query(None), db=Depends(_get_db), ): reqs = await list_requests(db, status=status, topic_id=topic_id, session_id=session_id) return ok(reqs) @router.get("/{request_id}", summary="Get request") async def get_one(request_id: str, db=Depends(_get_db)): req = await get_request(db, request_id) if not req: return JSONResponse( status_code=404, content=fail("NOT_FOUND", "Request not found"), ) return ok(req) @router.delete("/{request_id}", summary="Delete request") async def delete(request_id: str, db=Depends(_get_db)): deleted = await delete_request(db, request_id) if not deleted: return JSONResponse( status_code=404, content=fail("NOT_FOUND", "Request not found or not in pending status"), ) return ok({"deleted": True})