dieya_risk_prediction_backend/app/api/v1/integration_follow_up.py

50 lines
2.0 KiB
Python

"""The single external JSON report follow-up endpoint."""
from typing import Annotated
from fastapi import APIRouter, Depends, Request
from fastapi.responses import JSONResponse
from app.api.dependencies import DatabaseSession
from app.api.v1.integration_risk import IntegrationRoute, integration_client
from app.core.exceptions import AppException
from app.schemas.common import ApiResponse
from app.schemas.integration_follow_up import IntegrationFollowUpData, IntegrationFollowUpRequest
from app.services.integration_follow_up import IntegrationFollowUpService
router = APIRouter(prefix="/integrations/risk-assessments", tags=["integrations"], route_class=IntegrationRoute)
async def follow_up_client(request: Request, session: DatabaseSession) -> str:
if request.headers.get("X-Signature-Version") != "2":
raise AppException("报告追问要求 X-Signature-Version: 2", code=401, status_code=401)
return await integration_client(request, session)
ClientId = Annotated[str, Depends(follow_up_client)]
@router.post(
"/follow-up",
response_model=ApiResponse[IntegrationFollowUpData],
responses={202: {"description": "同一问题正在生成,请使用原编号原内容重试本接口"}},
)
async def follow_up_report(
request: Request,
payload: IntegrationFollowUpRequest,
session: DatabaseSession,
client_id: ClientId,
) -> ApiResponse[IntegrationFollowUpData] | JSONResponse:
if request.headers.get("Idempotency-Key") != payload.message_request_id:
raise AppException("Idempotency-Key 必须与 messageRequestId 一致", code=422, status_code=422)
data = await IntegrationFollowUpService(session).ask(client_id, payload)
if data.status == "processing":
return JSONResponse(
status_code=202,
headers={"Retry-After": "3"},
content=ApiResponse(code=202, message="原问题正在生成,请用相同编号重试", data=data).model_dump(
mode="json", by_alias=True
),
)
return ApiResponse(data=data)