from __future__ import annotations import logging from typing import Any, Dict, Optional import httpx from core.config import settings logger = logging.getLogger(__name__) class ExpedienteExternalService: """ Cliente HTTP real para el API externo de digitalización de archivos en Ventanilla Única. Endpoints utilizados: POST {base_url}/api/v1/expediente-archivos/digitalizar-archivo-json GET {base_url}/api/v1/expediente-archivos/status-digitalizacion-task/{task_id} """ def __init__(self) -> None: self.base_url = settings.COVE_API_URL.strip() self.verify_ssl = settings.COVE_API_VERIFY_SSL def digitalizar_archivo_json(self, payload: Dict[str, Any]) -> Dict[str, Any]: """ Envía un JSON con el documento + configuracion_vu al endpoint de digitalización. Retorna la respuesta JSON tal como viene del API externo. """ url = f"{self.base_url.rstrip('/')}/api/v1/expediente-archivos/digitalizar-archivo-json" configuracion_vu = payload.get("configuracion_vu") or {} logger.info( "Sending digitalizar-archivo-json: nombre_archivo=%s rfc_vu=%s clave_fiel_len=%s clave_ws_len=%s cer_len=%s key_len=%s", payload.get("nombre_archivo"), configuracion_vu.get("rfc_usuario_vu"), len(configuracion_vu.get("clave_fiel") or ""), len(configuracion_vu.get("clave_webservice") or ""), len(configuracion_vu.get("archivo_cer_base64") or ""), len(configuracion_vu.get("archivo_key_base64") or ""), ) # connect=10s, read=120s: la subida del PDF puede tomar tiempo en el servidor VU with httpx.Client(timeout=httpx.Timeout(120.0, connect=10.0), verify=self.verify_ssl) as client: response = client.post(url, json=payload) response.raise_for_status() return response.json() def get_status(self, task_id: str) -> Optional[Dict[str, Any]]: """ Consulta el estado de una tarea de digitalización en el API externo. """ url = f"{self.base_url.rstrip('/')}/api/v1/expediente-archivos/status-digitalizacion-task/{task_id}" logger.debug("Consulting expediente task status: task_id=%s url=%s", task_id, url) # read=None: sin límite de lectura — VU mantiene la conexión abierta mientras procesa. # El timeout global del polling loop (300 s) actúa como cota máxima real. with httpx.Client(timeout=httpx.Timeout(None, connect=10.0), verify=self.verify_ssl) as client: response = client.get(url) response.raise_for_status() return response.json()