63 lines
2.6 KiB
Python
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()
|