Saltar a contenido

Arquitectura

La API está organizada en capas de dominio, aplicación e infraestructura.

Módulo Principal

AppModule registra:

  • MongooseModule.forRoot(...)
  • CustomersModule
  • AppController

La conexión a MongoDB se toma de MONGODB_URI. Los valores reales de conexión no deben documentarse ni commitearse.

Módulo Customers

CustomersModule registra el modelo Mongoose CustomerDocument sobre la colección customers y expone el controlador REST.

Providers registrados:

Provider Responsabilidad
ICustomerRepository Token de inyección para el repositorio
CustomerRepository Implementación Mongoose
CreateCustomerUseCase Alta de clientes
GetCustomerUseCase Consulta por ID y tenant
GetCustomersByTenantUseCase Listado por tenant y búsqueda
IncrementCustomerOrdersUseCase Incremento de totalOrders
UpdateCustomerUseCase Actualización parcial
DeleteCustomerUseCase Eliminación por ID y tenant

Capas

Capa Ruta Contenido
Dominio src/customers/domain Entidad Customer e interfaz ICustomerRepository
Aplicación src/customers/application/use-cases Casos de uso de negocio
Infraestructura HTTP src/customers/infraestructure/http CustomersController
Infraestructura DTO src/customers/infraestructure/dto DTOs de request y response
Infraestructura MongoDB src/customers/infraestructure/moongose Schema Mongoose
Repositorio src/customers/infraestructure/repositories Implementación con Mongoose

Nota: las carpetas del código usan los nombres infraestructure y moongose; se documentan así porque son los nombres reales en el proyecto.

Flujo De Creación

  1. POST /customers recibe CreateCustomerDto.
  2. CustomersController.create llama a CreateCustomerUseCase.
  3. El caso de uso normaliza campos: trim en textos y email en minúsculas.
  4. CustomerRepository.create persiste el documento en MongoDB.
  5. El repositorio asigna totalOrders inicial en 0, registeredAt, updatedAt y allowCredit por defecto.
  6. CustomerResponse.toResponse transforma la entidad al contrato HTTP.

Observaciones Técnicas

  • La aplicación registra ValidationPipe global con whitelist, forbidNonWhitelisted y transform.
  • No se define prefijo global de API; las rutas cuelgan directamente de /.
  • tenantId se valida explícitamente en el controlador para rutas de consulta, actualización, incremento y borrado.
  • No se configura CORS en main.ts; en Lambda se agregan headers CORS a la respuesta.