diff --git a/backend/app/api/routes.py b/backend/app/api/routes.py index 98903df..728b39e 100755 --- a/backend/app/api/routes.py +++ b/backend/app/api/routes.py @@ -475,6 +475,8 @@ async def list_error_items( id=item.id, proof_version_id=item.proof_version_id, error_summary=item.error_summary, + submitter_name=item.proof_version.proof.created_by_user.name if item.proof_version and item.proof_version.proof and item.proof_version.proof.created_by_user else None, + submitter_agency=item.proof_version.proof.created_by_user.agency.name if item.proof_version and item.proof_version.proof and item.proof_version.proof.created_by_user and item.proof_version.proof.created_by_user.agency else None, campaign_name=item.proof_version.proof.campaign.name if item.proof_version and item.proof_version.proof and item.proof_version.proof.campaign else None, proof_name=item.proof_version.proof.proof_name if item.proof_version and item.proof_version.proof else None, version=item.proof_version.version if item.proof_version else None, diff --git a/backend/app/api/schemas.py b/backend/app/api/schemas.py index 9a96290..aa9897e 100755 --- a/backend/app/api/schemas.py +++ b/backend/app/api/schemas.py @@ -129,6 +129,8 @@ class ErrorItemResponse(BaseModel): id: uuid.UUID proof_version_id: uuid.UUID error_summary: Optional[str] + submitter_name: Optional[str] + submitter_agency: Optional[str] campaign_name: Optional[str] proof_name: Optional[str] version: Optional[int] diff --git a/backend/app/repositories/audit_repository.py b/backend/app/repositories/audit_repository.py index 2e8a48e..31fb799 100755 --- a/backend/app/repositories/audit_repository.py +++ b/backend/app/repositories/audit_repository.py @@ -5,7 +5,7 @@ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload -from app.models.models import FlaggedItem, ResolvedItem, ErrorItem, ProofVersion, Proof, Campaign +from app.models.models import FlaggedItem, ResolvedItem, ErrorItem, ProofVersion, Proof, Campaign, User class AuditRepository: @@ -134,6 +134,10 @@ class AuditRepository: selectinload(ErrorItem.proof_version) .selectinload(ProofVersion.proof) .selectinload(Proof.campaign), + selectinload(ErrorItem.proof_version) + .selectinload(ProofVersion.proof) + .selectinload(Proof.created_by_user) + .selectinload(User.agency), ) .join(ProofVersion) .join(Proof) diff --git a/backend/app/websocket/handlers.py b/backend/app/websocket/handlers.py index 8464108..1d32f73 100755 --- a/backend/app/websocket/handlers.py +++ b/backend/app/websocket/handlers.py @@ -9,7 +9,7 @@ from app.websocket.manager import ConnectionManager from app.services.analysis_service import AnalysisService from app.models.schemas import SubReview from app.models.database import async_session_factory -from app.repositories import ProofRepository, CampaignRepository, UserRepository +from app.repositories import ProofRepository, CampaignRepository, UserRepository, AuditRepository from app.services.storage_service import storage_service logger = logging.getLogger(__name__) @@ -231,6 +231,15 @@ async def handle_analyze_message( is_identical_file=is_identical_file, ) + # Auto-create ErrorItem when analysis results in an error + if result.overallStatus == "Analysis Error": + audit_repo = AuditRepository(session) + await audit_repo.create_error_item( + proof_version_id=version.id, + error_summary=result.leadAgentSummary, + ) + logger.info(f"[WEBSOCKET] Created ErrorItem for analysis error on version {version.id}") + await session.commit() proof_id = str(proof.id) version_id = str(version.id) diff --git a/frontend/components/Auditing.tsx b/frontend/components/Auditing.tsx index 9a364fc..ff2ed2e 100755 --- a/frontend/components/Auditing.tsx +++ b/frontend/components/Auditing.tsx @@ -135,7 +135,7 @@ const ErrorsTable: React.FC<{ items: ErrorItem[], onNavigate: AuditingProps['onN onClick={() => onNavigate(item)} title={`Click to view Version ${item.version} of ${item.proofName}`} > -