El endpoint para subir documentos existe y funciona, pero hoy está protegido con login de usuario (JWT) y solo es accesible desde la red interna. No existe una variante pública pensada para integraciones externas.
Habilitar uno es técnicamente viable y de esfuerzo acotado porque toda la lógica de negocio (validación, guardado, registro en DB) ya está implementada. Lo que falta es: un mecanismo de autenticación apto para servicios (API key), exponer la URL al exterior y agregar validaciones de seguridad. Estimación MVP: 3 a 5 días de desarrollo (≈ 24 a 40 horas), sin contar la coordinación de infraestructura/red.
/api/auth/signin, válido por 24 horas, y emitido a usuarios reales con rol ROLE_USER o ROLE_ADMIN.POST /api/archivos/operaciones/{operacionId} que ya implementa toda la lógica: recibe el archivo, lo guarda en disco, crea el registro asociado a la operación. Es el mismo que usa la UI hoy. La lógica de negocio está hecha; lo que falta es exponerla de forma segura a un consumidor automatizado.| Aspecto | Detalle |
|---|---|
| Endpoint | POST /api/archivos/operaciones/{operacionId}OperacionItemsController.java:78 |
| Autenticación | JWT en header Authorization: Bearer <token>Token emitido por POST /api/auth/signin (usuario + password)WebSecurityConfig.java:55-67 |
| Parámetros | multipart/form-data con: file, tiposItems, realname, descripcion, pago, y opcionales: nroDocumento, fechaDocumento, moneda, monto, iva, montoIva, pais |
| Identificador de operación | operacionId tipo Long (numérico). El sistema externo necesita conocerlo para apuntar la subida. |
| Almacenamiento del archivo | A nivel de código, el backend escribe al filesystem (POSIX) usando FileOutputStream. No hay cliente S3 ni dependencia AWS en el código (búsqueda exhaustiva: 0 matches).Ruta configurada: /usr/src/files/{operacionId}/{fileName}DocumentDao.java:38, 236-265 · application-prod.properties:1 Caveat: esa ruta dentro del contenedor de producción podría estar montada como volumen Docker, EFS, EBS o incluso un bucket S3 vía s3fs. A confirmar con quien administre la infra. |
| Metadata | Se persiste en MySQL, tabla de items de operación, vinculada al operacionId. |
Corrección a un supuesto inicial: el código del backend no usa S3. Escribe al filesystem vía FileOutputStream. Lo que no podemos confirmar sin acceder a la infra es si ese filesystem está respaldado por disco local, EFS, EBS o un bucket S3 montado. Para el diseño del endpoint público es indistinto, pero conviene preguntárselo a quien administre el deploy antes de prometer SLAs de disponibilidad o tamaños máximos.
| Tarea | Detalle | Esfuerzo |
|---|---|---|
| Endpoint nuevo separado | Crear, p.ej., POST /api/integrations/archivos/operaciones/{operacionId} que reutilice el service existente (DocumentService.save + OperacionItemsService.save). Mantener el endpoint actual intacto. |
Bajo |
| Autenticación por API key | Filtro Spring que valide un header X-API-Key contra una lista de claves emitidas por integrador. Permite revocación y trazabilidad por origen. |
Bajo |
Whitelist en WebSecurityConfig |
Permitir el path nuevo sin JWT, pero exigiendo el filtro de API key. | Bajo |
| Validaciones extra | Existencia y vigencia del operacionId, tamaño máximo, tipo MIME, sanitización de nombre de archivo. |
Bajo |
| Auditoría | Registrar en log/DB qué integrador subió qué archivo a qué operación y cuándo (importante para trazabilidad aduanal). | Bajo |
| Exposición de red | Hoy el sistema está detrás de VPN. Para que ITNOVA/Aduana llegue al endpoint hace falta: o bien exponer una URL pública (con TLS, firewall, idealmente WAF), o bien que el integrador entre por VPN. Decisión y ejecución de infraestructura, no de desarrollo. | Medio |
| Documentación para el integrador | Spec corta del endpoint (curl de ejemplo, parámetros, códigos de error). | Bajo |
Total estimado para el MVP de desarrollo: 3 a 5 días (≈ 24 a 40 horas). El bloqueante práctico suele ser la coordinación de infraestructura, no el código.
operacionId?numeroRef de cliente + folio/DUA), (c) algún otro acuerdo.
La opción que ITNOVA barajaba —automatizar clics sobre la UI— resuelve el problema sin tocar el sistema, pero a un costo alto a mediano plazo:
Un endpoint dedicado, con el esfuerzo estimado, evita todo esto y deja la integración mantenible.