"""Modelos Pydantic para validación de datos""" from pydantic import BaseModel, EmailStr, Field from typing import Optional from datetime import datetime class RegistroRequest(BaseModel): """Modelo para crear un nuevo registro""" uid: str = Field(..., max_length=255, description="UID de Firestore") display_name: str = Field(..., min_length=1, max_length=255, description="Nombre a mostrar") pais: str = Field(..., min_length=1, max_length=255, description="País del usuario") correo: EmailStr = Field(..., description="Email del usuario") fecha_registro: Optional[datetime] = Field(None, description="Fecha de registro") usos: Optional[int] = Field(0, ge=0, description="Cantidad de usos") prompt: Optional[str] = Field(None, max_length=255, description="Prompt utilizado") prompt_type: Optional[str] = Field(None, max_length=255, description="Tipo de prompt") prompt_eval: Optional[str] = Field(None, max_length=255, description="Evaluación del prompt") estilo: Optional[str] = Field(None, max_length=255, description="Estilo para la generación") estilo_agregado: Optional[str] = Field(None, max_length=255, description="Estilo adicional") calificacion: Optional[int] = Field(None, ge=0, description="Calificación numérica") proveedor: Optional[str] = Field(None, max_length=255, description="Proveedor del servicio") seed: Optional[int] = Field(None, description="Seed para generación") class Config: example = { "uid": "usuario123", "display_name": "Juan Pérez", "pais": "España", "correo": "juan@example.com", "prompt": "crear imagen de perro", "prompt_type": "imagen", "prompt_eval": "muy buena calidad", "estilo": "realista", "estilo_agregado": "alto detalle", "calificacion": 9, "proveedor": "openai", "seed": 12345 } class RegistroResponse(BaseModel): """Modelo para respuesta de registro""" id: int = Field(..., description="ID único del registro (auto-incremental)") uid: str = Field(..., description="UID de Firestore") display_name: str pais: str correo: str fecha_registro: Optional[datetime] usos: int prompt: Optional[str] prompt_type: Optional[str] prompt_eval: Optional[str] estilo: Optional[str] estilo_agregado: Optional[str] calificacion: Optional[int] proveedor: Optional[str] seed: Optional[int] created_at: datetime class Config: example = { "id": "550e8400-e29b-41d4-a716-446655440000", "display_name": "Juan Pérez", "pais": "España", "correo": "juan@example.com", "fecha_registro": "2025-01-13T10:30:00", "usos": 0, "prompt": "crear imagen de perro", "proveedor": "openai", "seed": 12345, "created_at": "2025-01-13T10:30:00" } class CalificacionRequest(BaseModel): """Modelo para actualizar calificación de un registro""" id: int = Field(..., gt=0, description="ID del registro a calificar") calificacion: int = Field(..., ge=0, description="Calificación numérica") class Config: example = { "id": 1, "calificacion": 8 }