50 lines
2.0 KiB
Python
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)
|