""" Modèles de données pour l'API """ from pydantic import BaseModel, Field from typing import Optional, Dict, Any, List from datetime import datetime from enum import Enum class DocumentStatus(str, Enum): """Statuts possibles d'un document""" PENDING = "pending" PROCESSING = "processing" COMPLETED = "completed" FAILED = "failed" MANUAL_REVIEW = "manual_review" class DocumentType(str, Enum): """Types de documents supportés""" PDF = "application/pdf" JPEG = "image/jpeg" PNG = "image/png" TIFF = "image/tiff" HEIC = "image/heic" class ImportMeta(BaseModel): """Métadonnées d'import d'un document""" id_dossier: str = Field(..., description="Identifiant du dossier") source: str = Field(default="upload", description="Source du document") etude_id: str = Field(..., description="Identifiant de l'étude") utilisateur_id: str = Field(..., description="Identifiant de l'utilisateur") filename: Optional[str] = Field(None, description="Nom du fichier") mime: Optional[str] = Field(None, description="Type MIME du fichier") received_at: Optional[int] = Field(None, description="Timestamp de réception") class DocumentResponse(BaseModel): """Réponse d'import de document""" status: str = Field(..., description="Statut de la requête") id_document: str = Field(..., description="Identifiant du document") message: Optional[str] = Field(None, description="Message informatif") class DocumentInfo(BaseModel): """Informations détaillées d'un document""" id: str filename: str mime_type: str size: int status: DocumentStatus id_dossier: str etude_id: str utilisateur_id: str created_at: datetime updated_at: datetime processing_steps: Optional[Dict[str, Any]] = None extracted_data: Optional[Dict[str, Any]] = None errors: Optional[List[str]] = None class ProcessingStep(BaseModel): """Étape de traitement""" name: str status: str started_at: Optional[datetime] = None completed_at: Optional[datetime] = None duration: Optional[float] = None error: Optional[str] = None metadata: Optional[Dict[str, Any]] = None class HealthResponse(BaseModel): """Réponse de santé de l'API""" status: str timestamp: datetime version: str services: Dict[str, str] class ErrorResponse(BaseModel): """Réponse d'erreur standardisée""" detail: str error_code: Optional[str] = None timestamp: datetime = Field(default_factory=datetime.now)