"""Роутер для получения отчётов о выполненных задачах.""" import logging from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.core.security import get_current_user from app.database import get_db from app.models.task import Task from app.models.user import User logger = logging.getLogger(__name__) router = APIRouter(prefix="/reports", tags=["reports"]) @router.get("/{task_id}") async def get_report( task_id: str, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ) -> dict: """ Получить готовый отчёт по задаче. Возвращает task.result в зависимости от типа задачи: - search: список источников с ГОСТ-цитатами - plagiarism: детальный отчёт с совпадениями - gost: отформатированная библиография - summarize: краткое изложение """ result = await db.execute( select(Task).where(Task.id == task_id, Task.user_id == current_user.id) ) task = result.scalar_one_or_none() if task is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Задача не найдена", ) if task.status == "queued": raise HTTPException( status_code=status.HTTP_202_ACCEPTED, detail="Задача ещё в очереди", ) if task.status == "processing": raise HTTPException( status_code=status.HTTP_202_ACCEPTED, detail="Задача ещё выполняется", ) if task.status == "failed": raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Задача завершилась с ошибкой: {task.error}", ) if task.result is None: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Результат недоступен", ) return { "task_id": task.id, "type": task.type, "status": task.status, "created_at": task.created_at.isoformat() if task.created_at else None, "updated_at": task.updated_at.isoformat() if task.updated_at else None, "result": task.result, }