""" Schémas Pydantic communs utilisés dans plusieurs modules. """ from datetime import datetime, timezone from typing import Optional, Literal, Dict, Any from pydantic import BaseModel, Field, ConfigDict class CommandResult(BaseModel): """Résultat d'une commande SSH ou Ansible.""" status: str return_code: int stdout: str stderr: Optional[str] = None execution_time: Optional[float] = None timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) class LogEntry(BaseModel): """Entrée de log (modèle mémoire).""" id: int = 0 timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) level: Literal["DEBUG", "INFO", "WARN", "WARNING", "ERROR"] = "INFO" message: str source: Optional[str] = None host: Optional[str] = None model_config = ConfigDict( json_encoders={datetime: lambda v: v.isoformat()} ) class SystemMetrics(BaseModel): """Métriques système du dashboard.""" online_hosts: int = 0 total_tasks: int = 0 success_rate: float = 100.0 uptime: float = 99.9 cpu_usage: float = 0.0 memory_usage: float = 0.0 disk_usage: float = 0.0 class PaginatedResponse(BaseModel): """Réponse paginée générique.""" items: list = Field(default_factory=list) count: int = 0 total_count: int = 0 has_more: bool = False limit: int = 50 offset: int = 0 class SuccessResponse(BaseModel): """Réponse de succès générique.""" success: bool = True message: str class ErrorResponse(BaseModel): """Réponse d'erreur générique.""" error: str message: str details: Optional[Dict[str, Any]] = None