Skip to content

Architecture

Este documento describe la arquitectura implementada en el microservicio Storage Manager.

El Storage Manager sigue una arquitectura hexagonal (también conocida como arquitectura de puertos y adaptadores), que está organizada en tres capas principales: Domain, Application e Infrastructure. Esta arquitectura promueve la separación de responsabilidades, la testabilidad y la mantenibilidad.

La capa de Domain es el núcleo de la aplicación y contiene la lógica de negocio. Esta capa define:

  • Entities: Objetos que tienen una identidad y un ciclo de vida (Container, Location, Storage, Product)
  • ValueObjects: Objetos inmutables que representan conceptos del dominio (Country, Warehouse, ContainerName)
  • Repositories: Interfaces que definen cómo acceder y persistir entidades
  • Services: Interfaces que definen operaciones del dominio
  • Errors: Tipos de errores específicos del dominio
  • container/: Entidades y lógica relacionada con contenedores
  • inventory/: Entidades y lógica relacionada con inventario
  • location/: Entidades y lógica relacionada con ubicaciones
  • product/: Entidades y lógica relacionada con productos
  • restocking/: Entidades y lógica relacionada con reabastecimiento
  • storage/: Entidades y lógica relacionada con operaciones de almacenamiento
  • user/: Entidades y lógica relacionada con usuarios
  • valueobjects/: ValueObjects utilizados en todo el dominio
  • utils/: Funciones de utilidad para operaciones del dominio
  • errors.ts: Definiciones de errores del dominio

La capa de Application orquesta el flujo de datos entre el mundo exterior y el dominio. Contiene los casos de uso de la aplicación, que representan las operaciones que el sistema puede realizar. Esta capa:

  • Coordina entidades del dominio para realizar tareas específicas
  • Implementa reglas de negocio que involucran múltiples entidades del dominio
  • Maneja límites de transacciones
  • Gestiona el manejo de errores y el registro de logs
  • usecases/: Implementaciones de los casos de uso
    • containers/: Casos de uso para operaciones de contenedores
      • store.ts: Almacenar un contenedor en una ubicación de almacenamiento
      • store-partial.ts: Almacenar un contenedor parcialmente
      • suggestions.ts: Obtener sugerencias para almacenamiento de contenedores
      • filter.ts: Filtrar contenedores basados en criterios
    • container-pre-storage.ts: Manejar contenedores en estado de pre-almacenamiento
    • calendar.ts: Funcionalidad relacionada con el calendario
    • error-handler.ts: Lógica común de manejo de errores

La capa de Infrastructure proporciona implementaciones concretas de las interfaces definidas en la capa de dominio. Esta capa:

  • Implementa el acceso a datos usando MongoDB
  • Proporciona controladores HTTP y rutas para la API
  • Implementa clientes de servicios externos
  • Maneja preocupaciones transversales como logging y métricas
  • http/: Componentes relacionados con HTTP
    • controllers/: Controladores de la API
    • middlewares/: Middlewares de Express
    • routes/: Rutas de la API
    • server.ts: Configuración del servidor Express
  • repositories/: Implementaciones de repositories del dominio
    • storage/: Implementación del repository de almacenamiento
  • services/: Implementaciones de services del dominio
    • http-client/: Clientes HTTP para servicios externos
    • metrics/: Servicio de recolección de métricas
    • calendar.ts: Implementación del servicio de calendario
    • id-generator.ts: Servicio de generación de IDs
  • providers/: Funciones factory para crear servicios y repositories
    • mongodb.ts: Proveedor de conexión a MongoDB
    • services.ts: Proveedores de servicios
    • repositories.ts: Proveedores de repositories
    • usecases.ts: Proveedores de casos de uso
  • context/: Gestión del contexto de la aplicación
  • logger/: Configuración de logging
  • validators/: Validación de entrada
  1. Las peticiones HTTP son recibidas por el servidor Express
  2. Las peticiones son enrutadas al controlador apropiado
  3. Los controladores validan la entrada y llaman al caso de uso apropiado
  4. Los casos de uso orquestan entidades y servicios del dominio para realizar la operación
  5. Las entidades y servicios del dominio implementan la lógica de negocio
  6. Los repositories persisten los cambios en la base de datos
  7. Los controladores formatean la respuesta y la envían de vuelta al cliente

Esta arquitectura asegura que la lógica de negocio esté aislada de preocupaciones externas, haciendo que sea más fácil probar, mantener y evolucionar la aplicación a lo largo del tiempo.