Files
SYNC_API/sync_api/models/sync_models.py
ernestohc21 04e41e6445 Implementar nueva lógica de estados de sincronización basada en ubicación de archivos
- Agregar nuevos estados: Recibido y Procesando
- Implementar función determine_sync_status() que verifica:
  * D:\sftp\{nodo}.zip -> estado 'Recibido'
  * D:\BackupSFTP\{nodo}.zip -> estado 'Procesando'
  * Comparación de fechas para estado 'Actualizada'
- Actualizar get_node_status() y get_all_nodes() para usar nueva lógica
- Agregar script de pruebas test_sync_status.py
2025-11-06 09:55:51 -07:00

86 lines
4.2 KiB
Python

from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any
from datetime import datetime
from enum import Enum
class EstadoSincronizacion(str, Enum):
"""Estados posibles de sincronización"""
ACTUALIZADA = "Actualizada"
ATENCION = "Atención"
ERROR = "Error"
RECIBIDO = "Recibido"
PROCESANDO = "Procesando"
class NodeStatus(BaseModel):
"""Estado de un nodo específico"""
nodo_sub_nodo: str = Field(..., description="Nombre del nodo")
estado_sincronizacion: EstadoSincronizacion = Field(..., description="Estado actual de sincronización")
ultima_sincronizacion: Optional[datetime] = Field(None, description="Timestamp de la última sincronización")
total_clientes: int = Field(0, description="Total de clientes en el nodo")
clientes_activos: int = Field(0, description="Número de clientes activos")
clientes_inactivos: int = Field(0, description="Número de clientes inactivos")
tiempo_desde_ultima_sync: Optional[str] = Field(None, description="Tiempo transcurrido desde última sincronización")
class Config:
json_encoders = {
datetime: lambda v: v.isoformat() if v else None
}
class NodeSummary(BaseModel):
"""Resumen básico de un nodo para listados"""
nodo_sub_nodo: str = Field(..., description="Nombre del nodo")
estado_sincronizacion: EstadoSincronizacion = Field(..., description="Estado actual")
ultima_sincronizacion: Optional[datetime] = Field(None, description="Última sincronización")
total_clientes: int = Field(0, description="Total de clientes")
clientes_activos: int = Field(0, description="Clientes activos")
class NodesList(BaseModel):
"""Lista de todos los nodos"""
nodes: List[NodeSummary] = Field(default_factory=list, description="Lista de nodos")
total_nodes: int = Field(0, description="Número total de nodos")
nodes_by_status: Dict[str, int] = Field(default_factory=dict, description="Conteo por estado")
last_updated: datetime = Field(default_factory=datetime.now, description="Timestamp de la consulta")
class BackupInfo(BaseModel):
"""Información de respaldos de un nodo"""
nodo_sub_nodo: str = Field(..., description="Nombre del nodo")
ultimo_backup: Optional[datetime] = Field(None, description="Fecha del último respaldo")
tipo_backup: Optional[str] = Field(None, description="Tipo de respaldo (Full, Differential, Log)")
tamano_backup: Optional[str] = Field(None, description="Tamaño del respaldo")
estado_backup: Optional[str] = Field(None, description="Estado del respaldo")
ruta_backup: Optional[str] = Field(None, description="Ruta donde se almacena el respaldo")
dias_desde_backup: Optional[int] = Field(None, description="Días desde el último respaldo")
class HealthCheck(BaseModel):
"""Estado general del sistema"""
status: str = Field(..., description="Estado general (healthy, degraded, unhealthy)")
database_status: str = Field(..., description="Estado de la base de datos")
total_nodes: int = Field(0, description="Total de nodos monitoreados")
nodes_healthy: int = Field(0, description="Nodos en estado saludable")
nodes_attention: int = Field(0, description="Nodos que requieren atención")
nodes_error: int = Field(0, description="Nodos con errores")
last_check: datetime = Field(default_factory=datetime.now, description="Timestamp del chequeo")
uptime: Optional[str] = Field(None, description="Tiempo de actividad del servicio")
version: str = Field("1.0.0", description="Versión de la API")
class ErrorResponse(BaseModel):
"""Respuesta de error estándar"""
error: str = Field(..., description="Mensaje de error")
detail: Optional[str] = Field(None, description="Detalle adicional del error")
timestamp: datetime = Field(default_factory=datetime.now, description="Timestamp del error")
path: Optional[str] = Field(None, description="Ruta que causó el error")
class SuccessResponse(BaseModel):
"""Respuesta exitosa estándar"""
message: str = Field(..., description="Mensaje de éxito")
data: Optional[Dict[str, Any]] = Field(None, description="Datos adicionales")
timestamp: datetime = Field(default_factory=datetime.now, description="Timestamp de la respuesta")