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(...)SuppliersModuleAppControllerAppService
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
POST /suppliersrecibeCreateSupplierDto.SuppliersController.createllama aCreateSupplierUseCase.- El caso de uso normaliza campos: trim, email en minúsculas, RFC/tax ID en mayúsculas.
- Si
requiresInvoiceesfalse, los datos fiscales se guardan como cadenas vacías. SupplierRepository.createpersiste el documento en MongoDB.SupplierResponse.toResponsetransforma la entidad al contrato HTTP.
Observaciones técnicas
main.tsregistraValidationPipeglobal conwhitelist,forbidNonWhitelistedytransform.main.tshabilita CORS usandoCORS_ORIGINcuando está definido; si no existe, permite cualquier origen.- La aplicación no define prefijo global de API; las rutas cuelgan directamente de
/.