"""Authenticated OCR recognition and source-file endpoints.""" from typing import Annotated from fastapi import APIRouter, Depends, File, UploadFile from fastapi.responses import FileResponse from app.api.dependencies import DatabaseSession, require_permission from app.core.exceptions import AppException from app.models.entities import UserAccount from app.schemas.common import ApiResponse from app.schemas.ocr import OcrBatchResult, OcrJudgmentRequest, OcrStandardJudgment from app.services.ocr import OcrService router = APIRouter(prefix="/ocr", tags=["ocr"]) @router.post("/recognize", response_model=ApiResponse[OcrBatchResult]) async def recognize_files( files: Annotated[list[UploadFile], File(description="1-5 JPG, PNG, or PDF files")], session: DatabaseSession, _current_user: Annotated[UserAccount, Depends(require_permission("risk_item.submit", operate=True))], ) -> ApiResponse[OcrBatchResult]: return ApiResponse(data=await OcrService(session).recognize(files)) @router.post("/judge", response_model=ApiResponse[list[OcrStandardJudgment]]) async def judge_measurements( payload: OcrJudgmentRequest, session: DatabaseSession, _current_user: Annotated[UserAccount, Depends(require_permission("risk_item.submit", operate=True))], ) -> ApiResponse[list[OcrStandardJudgment]]: return ApiResponse(data=await OcrService(session).judge(payload.measurements)) @router.get("/files/{file_id}", response_class=FileResponse) async def get_source_file( file_id: str, session: DatabaseSession, _current_user: Annotated[UserAccount, Depends(require_permission("risk_item.submit"))], ) -> FileResponse: path = OcrService(session).upload_path(file_id) if not path.is_file(): raise AppException("附件不存在", code=404, status_code=404) media_type = { ".jpg": "image/jpeg", ".png": "image/png", ".pdf": "application/pdf", }[path.suffix.lower()] return FileResponse(path, media_type=media_type, filename=file_id)