First commit

This commit is contained in:
2025-07-09 02:12:06 +02:00
parent 1a7946495c
commit a5e044d747
23 changed files with 1967 additions and 0 deletions

77
api/app/schemas.py Normal file
View File

@@ -0,0 +1,77 @@
"""
Schémas Pydantic pour la validation et la sérialisation des données
"""
from typing import Optional, Dict, Any, List
from pydantic import BaseModel, Field
from enum import Enum
from datetime import datetime
class JobStatus(str, Enum):
"""Statuts possibles pour une tâche d'extraction"""
PENDING = "pending"
PROCESSING = "processing"
COMPLETED = "completed"
FAILED = "failed"
class UploadResponse(BaseModel):
"""Réponse à une demande d'upload d'image"""
job_id: str = Field(..., description="Identifiant unique de la tâche")
status: JobStatus = Field(default=JobStatus.PENDING, description="Statut de la tâche")
message: str = Field(default="Image en file d'attente pour traitement", description="Message d'information")
created_at: datetime = Field(default_factory=datetime.now, description="Date de création de la tâche")
class JobStatusResponse(BaseModel):
"""Réponse à une demande de statut de tâche"""
job_id: str = Field(..., description="Identifiant unique de la tâche")
status: JobStatus = Field(..., description="Statut de la tâche")
message: str = Field(..., description="Message d'information")
created_at: datetime = Field(..., description="Date de création de la tâche")
updated_at: Optional[datetime] = Field(None, description="Date de dernière mise à jour")
progress: Optional[int] = Field(None, description="Progression en pourcentage (0-100)")
queue_position: Optional[int] = Field(None, description="Position dans la file d'attente")
class ExtractionResult(BaseModel):
"""Résultat de l'extraction d'informations d'un chèque"""
montant: Optional[str] = Field(None, description="Montant du chèque")
date: Optional[str] = Field(None, description="Date du chèque")
beneficiaire: Optional[str] = Field(None, description="Bénéficiaire du chèque")
numero_cheque: Optional[str] = Field(None, description="Numéro du chèque")
qualite_extraction: Optional[str] = Field(None, description="Qualité de l'extraction (échec, faible, moyenne, bonne)")
image_zones: Optional[str] = Field(None, description="Chemin vers l'image avec les zones identifiées")
class JobResult(BaseModel):
"""Résultat complet d'une tâche d'extraction"""
job_id: str = Field(..., description="Identifiant unique de la tâche")
status: JobStatus = Field(..., description="Statut de la tâche")
created_at: datetime = Field(..., description="Date de création de la tâche")
completed_at: Optional[datetime] = Field(None, description="Date de complétion de la tâche")
image_path: str = Field(..., description="Chemin de l'image originale")
result: Optional[ExtractionResult] = Field(None, description="Résultats de l'extraction")
texte_brut: Optional[str] = Field(None, description="Texte brut extrait (si disponible)")
methode: str = Field(..., description="Méthode utilisée (ocr ou cv)")
erreur: Optional[str] = Field(None, description="Message d'erreur (si échec)")
class HealthCheck(BaseModel):
"""Réponse du health check"""
status: str = Field(default="ok", description="Statut du service")
version: str = Field(..., description="Version de l'API")
timestamp: datetime = Field(default_factory=datetime.now, description="Horodatage de la vérification")
redis_status: str = Field(..., description="Statut de la connexion Redis")
worker_count: int = Field(..., description="Nombre de workers disponibles")
queue_size: int = Field(..., description="Nombre de tâches en attente")
uptime: str = Field(..., description="Temps de fonctionnement du service")
class ErrorResponse(BaseModel):
"""Réponse en cas d'erreur"""
status: str = Field(default="error", description="Statut de la réponse")
message: str = Field(..., description="Message d'erreur")
error_code: Optional[str] = Field(None, description="Code d'erreur")
details: Optional[Dict[str, Any]] = Field(None, description="Détails supplémentaires")