Skip to content

Design Patterns

Este documento detalla los patrones de diseño utilizados en el worker para procesar reportes de mermas de inventario y enviarlos a SAP.

  • Descripción: El patrón Adapter convierte la interfaz de una clase en otra interfaz que los clientes esperan. Permite que clases trabajen juntas que de otra manera no podrían debido a interfaces incompatibles.

  • Componentes clave:

    1. Interfaces del dominio:
      • QueueService (src/domain/queue/service.ts): Define la interfaz para operaciones de cola
      • SapDocumentsService (src/domain/sap-documents/service.ts): Define la interfaz para operaciones de documentos SAP
    2. Implementaciones en infraestructura:
      • AwsQueueService (src/infrastructure/services/queue/index.ts): Adapta AWS SQS a la interfaz QueueService
      • HttpSapDocumentsService (src/infrastructure/services/sap-documents/client.ts): Adapta llamadas HTTP a la interfaz SapDocumentsService
    3. Casos de uso:
      • La capa de aplicación usa las interfaces del dominio sin conocer las implementaciones concretas
  • Descripción: Dependency Injection es una técnica donde un objeto recibe otros objetos de los que depende. Estos otros objetos se llaman dependencias.

  • Componentes clave:

    1. Proveedores de servicios:
      • src/infrastructure/providers/services.ts: Crea y proporciona instancias de servicios
      • src/infrastructure/providers/processors.ts: Crea y proporciona instancias de procesadores
    2. Inyección por constructor:
      • El constructor de SapWorker recibe QueueService y SapProcessor
      • El constructor de SapProcessor recibe SapDocumentsService
      • El constructor de HttpSapDocumentsService recibe parámetros de configuración
    3. Casos de uso:
      • Facilita las pruebas al permitir implementaciones simuladas
      • Desacopla componentes, haciendo el sistema más modular
  • Descripción: El Either monad es un patrón de programación funcional para manejar errores sin excepciones. Representa un valor que puede ser un éxito (Right) o un fracaso (Left).

  • Componentes clave:

    1. Implementación de Either:
      • El paquete @justomx/either proporciona los tipos Either y EitherAsync
    2. Uso en el dominio:
      • Las interfaces de servicio devuelven Either<BusinessError, T>
      • Los errores de negocio se definen en src/domain/errors.ts
    3. Casos de uso:
      • SapWorker.run(): Encadena operaciones con flatMap y maneja errores con fold
      • SapProcessor.process(): Encadena validaciones y transformaciones con flatMap
      • transformToItem(): Devuelve un error o un item transformado
  • Descripción: El patrón Factory Method define una interfaz para crear un objeto, pero permite a las subclases decidir qué clase instanciar.

  • Componentes clave:

    1. Funciones factory:
      • getCollectorWorker() en src/infrastructure/providers/processors.ts: Crea una instancia de worker
      • getLogger() en src/infrastructure/logger/index.ts: Crea una instancia de logger
    2. Casos de uso:
      • Centraliza la creación de objetos
      • Oculta detalles de implementación a los clientes
  • Descripción: El patrón Singleton asegura que una clase tenga solo una instancia y proporciona un punto de acceso global a ella.

  • Componentes clave:

    1. Implementaciones de Singleton:
      • HealthState.getInstance() en src/infrastructure/healthcheck/health-state.ts: Proporciona una única instancia del estado de salud
      • AsyncJustoContextStorage.getInstance() en el archivo principal: Proporciona una única instancia del almacenamiento de contexto
    2. Casos de uso:
      • Asegura que solo exista una instancia del estado de salud
      • Proporciona un punto de acceso global al estado de salud