Patrón 3: Puertos y Adaptadores - JuanHerreraP/Proyecto-MISO-Solventa-Grupo-11 GitHub Wiki

Problema

Solventa depende de múltiples proveedores externos:

  • Open Finance.
  • Open Data.
  • KYC y validación de identidad.
  • Pasarelas de pago.
  • Firma electrónica.
  • Telemetría e IoT.

Cada proveedor utiliza contratos, formatos, protocolos y mecanismos de autenticación diferentes. Si los servicios del dominio consumieran directamente estas APIs, cualquier cambio de proveedor afectaría la lógica de perfilamiento, pagos, identidad, pólizas o siniestros.

Solución

Se utiliza el patrón Puertos y Adaptadores para separar los servicios del dominio de las tecnologías externas. Los puertos son interfaces internas que expresan las operaciones requeridas por Solventa, sin depender de un proveedor particular. Los adaptadores implementan estas interfaces y traducen entre el modelo interno de Solventa y el contrato de cada proveedor.

Aplicación en Solventa

El servicio de Perfilamiento solicita información financiera mediante un puerto interno. El adaptador de Open Finance convierte la solicitud al formato del proveedor y transforma su respuesta al modelo común de Solventa.

De manera similar:

  • Identidad utiliza el adaptador KYC.
  • Pagos utiliza el adaptador de la pasarela.
  • Pólizas utiliza el adaptador de firma electrónica.
  • Siniestros utiliza el adaptador de telemetría.
  • Perfilamiento utiliza adaptadores de Open Finance y Open Data.

Los servicios del dominio no conocen las URLs, SDK, credenciales o formatos específicos de los proveedores.

Razonamiento

El patrón fue seleccionado porque una parte importante de Solventa depende de servicios que se encuentran fuera de su control.

Aislarlos detrás de interfaces estables permite sustituir proveedores, incorporar nuevas fuentes de datos y utilizar simuladores durante las pruebas sin modificar los servicios consumidores.

También reduce el riesgo de que cambios regulatorios o tecnológicos se propaguen por toda la aplicación.

Relación con los ASR

  • EC06 – Facilidad de modificación: permite cambiar el proveedor de KYC o pagos sin modificar los componentes consumidores.
  • EC07 – Seguridad: concentra la autenticación y protección de las comunicaciones externas.
  • EC12 – Disponibilidad: permite aplicar mecanismos de degradación ante la caída de un proveedor.
  • EC14 – Facilidad de integración: permite incorporar nuevas fuentes de Open Finance u Open Data sin afectar el motor de perfilamiento.
  • EC13 – Integración de socios: ayuda a traducir contratos externos al modelo interno de Solventa.

Ventajas

  • Facilita sustituir proveedores.
  • Evita cambios en los servicios del dominio.
  • Permite agregar nuevas fuentes de información.
  • Simplifica las pruebas mediante simuladores.
  • Centraliza la transformación de formatos externos.
  • Reduce el acoplamiento tecnológico.

Limitaciones

  • Requiere mantener una interfaz y un adaptador por integración.
  • Agrega código de transformación.
  • Puede ocultar capacidades particulares de algunos proveedores.
  • Las interfaces deben diseñarse cuidadosamente para mantenerse estables.

Para controlar estos riesgos, los puertos tendrán operaciones pequeñas y orientadas a las necesidades del negocio, no a las características particulares de cada proveedor.

Diagrama

flowchart TB
    subgraph Domain["Servicios del dominio"]
        Identity["Identidad y Consentimiento"]
        Risk["Perfilamiento"]
        Payments["Cobros y Pagos"]
        Policies["Pólizas"]
        Claims["Siniestros"]
    end

    subgraph Ports["Puertos internos"]
        KYC_P["IdentityVerificationProvider"]
        Finance_P["FinancialDataProvider"]
        Data_P["PublicDataProvider"]
        Payment_P["PaymentProvider"]
        Signature_P["ElectronicSignatureProvider"]
        Telemetry_P["TelemetryProvider"]
    end

    subgraph Adapters["Adaptadores"]
        KYC_A["Adaptador KYC"]
        Finance_A["Adaptador Open Finance"]
        Data_A["Adaptador Open Data"]
        Payment_A["Adaptador de Pagos"]
        Signature_A["Adaptador de Firma"]
        Telemetry_A["Adaptador de Telemetría"]
    end

    subgraph External["Proveedores externos"]
        KYC_E["Proveedor KYC"]
        Finance_E["Open Finance"]
        Data_E["Open Data"]
        Payment_E["Pasarela de Pagos"]
        Signature_E["Firma Electrónica"]
        Telemetry_E["Telemetría / IoT"]
    end

    Identity --> KYC_P
    Risk --> Finance_P
    Risk --> Data_P
    Payments --> Payment_P
    Policies --> Signature_P
    Claims --> Telemetry_P

    KYC_P --> KYC_A
    Finance_P --> Finance_A
    Data_P --> Data_A
    Payment_P --> Payment_A
    Signature_P --> Signature_A
    Telemetry_P --> Telemetry_A

    KYC_A --> KYC_E
    Finance_A --> Finance_E
    Data_A --> Data_E
    Payment_A --> Payment_E
    Signature_A --> Signature_E
    Telemetry_A --> Telemetry_E