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