93 lines
2.6 KiB
Python
93 lines
2.6 KiB
Python
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})
|