|
import asyncio |
|
|
|
from fastapi import UploadFile, File |
|
|
|
from ocr.api.message.schemas import CreateMessageRequest |
|
from ocr.api.openai_requests import generate_report, generate_changes |
|
from ocr.api.report import report_router |
|
from ocr.api.report.db_requests import (get_all_reports_obj, |
|
delete_all_reports, |
|
get_report_obj_by_id, |
|
save_report_obj, |
|
get_last_report_obj, change_report_report_obj, change_changes_report_obj) |
|
from ocr.api.report.dto import Paging |
|
from ocr.api.report.model import ReportModel |
|
from ocr.api.report.schemas import AllReportResponse |
|
from ocr.api.utils import divide_images, clean_response, extract_text_from_images |
|
from ocr.core.wrappers import OcrResponseWrapper |
|
|
|
|
|
@report_router.get('/all') |
|
async def get_all_reports() -> OcrResponseWrapper[AllReportResponse]: |
|
reports = await get_all_reports_obj() |
|
response = AllReportResponse( |
|
paging=Paging(pageSize=len(reports), pageIndex=0, totalCount=len(reports)), |
|
data=reports |
|
) |
|
return OcrResponseWrapper(data=response) |
|
|
|
|
|
@report_router.delete('/all') |
|
async def delete_all_report() -> OcrResponseWrapper: |
|
await delete_all_reports() |
|
return OcrResponseWrapper() |
|
|
|
|
|
@report_router.get('/{reportId}') |
|
async def get_report(reportId: str) -> OcrResponseWrapper[ReportModel]: |
|
report = await get_report_obj_by_id(reportId) |
|
return OcrResponseWrapper(data=report) |
|
|
|
|
|
@report_router.patch('/{reportId}/report') |
|
async def change_report_report( |
|
reportId: str, |
|
data: CreateMessageRequest |
|
) -> OcrResponseWrapper[ReportModel]: |
|
report = await change_report_report_obj(reportId, data) |
|
return OcrResponseWrapper(data=report) |
|
|
|
|
|
@report_router.patch('/{reportId}/changes') |
|
async def change_report_changes( |
|
reportId: str, |
|
data: CreateMessageRequest |
|
) -> OcrResponseWrapper[ReportModel]: |
|
report = await change_changes_report_obj(reportId, data) |
|
return OcrResponseWrapper(data=report) |
|
|
|
|
|
@report_router.post('') |
|
async def create_report( |
|
file: UploadFile = File(...), |
|
) -> OcrResponseWrapper[ReportModel]: |
|
try: |
|
last_report, contents = await asyncio.gather(get_last_report_obj(), file.read()) |
|
report, changes = None, None |
|
images = divide_images(contents) |
|
text_content = extract_text_from_images(images) |
|
if last_report: |
|
report, changes = await asyncio.gather( |
|
generate_report(text_content), |
|
generate_changes(text_content, last_report.report) |
|
) |
|
else: |
|
report = await generate_report(text_content) |
|
report = await save_report_obj(clean_response(report), clean_response(changes), text_content, file.filename) |
|
finally: |
|
await file.close() |
|
return OcrResponseWrapper(data=report) |
|
|