Files
plantillas-proyectos/backend/api/v1/modules/a76/expediente_archivos/external_service.py
2026-04-27 11:08:33 -06:00

63 lines
2.6 KiB
Python

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()