import type { IMapperRegistry, IPresenterRegistry, ModuleParams } from "@erp/core/api"; import { InMemoryMapperRegistry, InMemoryPresenterRegistry, SequelizeTransactionManager, } from "@erp/core/api"; import { CreateCustomerUseCase, DeleteCustomerUseCase, GetCustomerAssembler, GetCustomerUseCase, ListCustomersAssembler, ListCustomersUseCase, UpdateCustomerUseCase, } from "../application"; import { CustomerService } from "../domain"; import { CustomerMapper } from "./mappers"; import { CustomerRepository } from "./sequelize"; type CustomerDeps = { transactionManager: SequelizeTransactionManager; mapperRegistry: IMapperRegistry; presenterRegistry: IPresenterRegistry; repo: CustomerRepository; service: CustomerService; build: { list: () => ListCustomersUseCase; get: () => GetCustomerUseCase; create: () => CreateCustomerUseCase; update: () => UpdateCustomerUseCase; delete: () => DeleteCustomerUseCase; }; }; let _presenterRegistry: IPresenterRegistry | null = null; let _mapperRegistry: IMapperRegistry | null = null; let _repo: CustomerRepository | null = null; let _service: CustomerService | null = null; export function getCustomerDependencies(params: ModuleParams): CustomerDeps { const { database } = params; const transactionManager = new SequelizeTransactionManager(database); if (!_mapperRegistry) { _mapperRegistry = new InMemoryMapperRegistry(); _mapperRegistry.registerDomainMapper("FULL", new CustomerMapper()); } if (!_repo) _repo = new CustomerRepository({ mapperRegistry: _mapperRegistry }); if (!_service) _service = new CustomerService(_repo); if (!_presenterRegistry) { _presenterRegistry = new InMemoryPresenterRegistry(); _presenterRegistry.registerPresenters([ { key: { projection: "FULL" }, presenter: new ListCustomersAssembler(), }, { key: { projection: "LIST" }, presenter: new GetCustomerAssembler(), }, ]); /*if (!_assemblers) { _assemblers = { list: new ListCustomersAssembler(), // transforma domain → ListDTO get: new GetCustomerAssembler(), // transforma domain → DetailDTO create: new CreateCustomersAssembler(), // transforma domain → CreatedDTO update: new UpdateCustomerAssembler(), // transforma domain -> UpdateDTO };*/ } return { transactionManager, repo: _repo, mapperRegistry: _mapperRegistry, presenterRegistry: _presenterRegistry, service: _service, build: { list: () => new ListCustomersUseCase(_service!, transactionManager!, _assemblers!.list), get: () => new GetCustomerUseCase(_service!, transactionManager!, _assemblers!.get), create: () => new CreateCustomerUseCase(_service!, transactionManager!, _assemblers!.create), update: () => new UpdateCustomerUseCase(_service!, transactionManager!, _assemblers!.update), delete: () => new DeleteCustomerUseCase(_service!, transactionManager!), }, }; }