geo/backend/app/api/queries.py

109 lines
3.3 KiB
Python

import uuid
from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy.ext.asyncio import AsyncSession
from app.api.deps import get_current_user
from app.database import get_db
from app.models.user import User
from app.schemas.citation import RunNowResponse
from app.schemas.query import QueryCreate, QueryListResponse, QueryResponse, QueryUpdate
from app.services.citation import trigger_query_now
from app.services.query import create_query, delete_query, get_queries, get_query, update_query
router = APIRouter()
@router.get("/", response_model=QueryListResponse)
async def list_queries(
skip: int = Query(0, ge=0),
limit: int = Query(20, ge=1, le=100),
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
items, total = await get_queries(db, current_user.id, skip=skip, limit=limit)
return {"items": items, "total": total}
@router.post("/", response_model=QueryResponse, status_code=status.HTTP_201_CREATED)
async def create_new_query(
query_data: QueryCreate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
try:
query = await create_query(db, current_user.id, query_data)
except PermissionError as e:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail=str(e) if str(e) else "查询词数量已达上限",
)
return query
@router.get("/{query_id}", response_model=QueryResponse)
async def retrieve_query(
query_id: uuid.UUID,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
query = await get_query(db, query_id, current_user.id)
if query is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="查询词不存在",
)
return query
@router.put("/{query_id}", response_model=QueryResponse)
async def modify_query(
query_id: uuid.UUID,
update_data: QueryUpdate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
query = await update_query(db, query_id, current_user.id, update_data)
if query is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="查询词不存在",
)
return query
@router.delete("/{query_id}", status_code=status.HTTP_204_NO_CONTENT)
async def remove_query(
query_id: uuid.UUID,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
deleted = await delete_query(db, query_id, current_user.id)
if not deleted:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="查询词不存在",
)
return None
@router.post("/{query_id}/run-now", response_model=RunNowResponse, status_code=status.HTTP_202_ACCEPTED)
async def run_query_now(
query_id: uuid.UUID,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
try:
task = await trigger_query_now(db, current_user.id, query_id)
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=str(e),
)
return {
"task_id": task.id,
"status": task.status,
"message": "查询任务已加入队列",
}