Saltar a contenido

Arquitectura

La API está organizada con una separación cercana a arquitectura limpia: dominio, casos de uso e infraestructura.

Módulo principal

AppModule registra:

  • ConfigModule.forRoot({ isGlobal: true })
  • MongooseModule.forRoot(...)
  • SuppliersModule
  • AppController
  • AppService

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

Módulo Suppliers

SuppliersModule registra el modelo Mongoose SupplierDocument sobre la colección suppliers y expone el controlador REST.

Proveedores registrados:

Provider Responsabilidad
ISupplierRepository Token de inyección para el repositorio
SupplierRepository Implementación Mongoose
CreateSupplierUseCase Alta de proveedores
GetSuppliersByTenantUseCase Listado por tenant y búsqueda
GetSupplierUseCase Consulta por ID y tenant
UpdateSupplierUseCase Actualización parcial
DeleteSupplierUseCase Eliminación por ID y tenant

Capas

Capa Ruta Contenido
Dominio src/suppliers/domain Entidad Supplier e interfaz ISupplierRepository
Aplicación src/suppliers/application/use-cases Casos de uso de negocio
Infraestructura HTTP src/suppliers/infraestructure/http SuppliersController
Infraestructura DTO src/suppliers/infraestructure/dto DTOs de request y response
Infraestructura MongoDB src/suppliers/infraestructure/moongose Schema Mongoose
Repositorio src/suppliers/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 una creación

  1. POST /suppliers recibe CreateSupplierDto.
  2. SuppliersController.create llama a CreateSupplierUseCase.
  3. El caso de uso normaliza campos: trim, email en minúsculas, RFC/tax ID en mayúsculas.
  4. Si requiresInvoice es false, los datos fiscales se guardan como cadenas vacías.
  5. SupplierRepository.create persiste el documento en MongoDB.
  6. SupplierResponse.toResponse transforma la entidad al contrato HTTP.

Observaciones técnicas

  • main.ts registra ValidationPipe global con whitelist, forbidNonWhitelisted y transform.
  • main.ts habilita CORS usando CORS_ORIGIN cuando está definido; si no existe, permite cualquier origen.
  • La aplicación no define prefijo global de API; las rutas cuelgan directamente de /.