import type { ModuleParams } from "@erp/core/api"; import { SequelizeTransactionManager } from "@erp/core/api"; import { CreateCustomerUseCase, CreateCustomersAssembler, DeleteCustomerUseCase, GetCustomerAssembler, GetCustomerUseCase, ListCustomersAssembler, ListCustomersUseCase, } from "../application"; import { CustomerService, ICustomerService } from "../domain"; import { CustomerMapper } from "./mappers"; import { CustomerRepository } from "./sequelize"; type CustomerDeps = { transactionManager: SequelizeTransactionManager; repo: CustomerRepository; mapper: CustomerMapper; service: ICustomerService; assemblers: { list: ListCustomersAssembler; get: GetCustomerAssembler; create: CreateCustomersAssembler; //update: UpdateCustomerAssembler; }; build: { list: () => ListCustomersUseCase; get: () => GetCustomerUseCase; create: () => CreateCustomerUseCase; //update: () => UpdateCustomerUseCase; delete: () => DeleteCustomerUseCase; }; presenters: { // list: (res: Response) => ListPresenter; }; }; let _repo: CustomerRepository | null = null; let _mapper: CustomerMapper | null = null; let _service: ICustomerService | null = null; let _assemblers: CustomerDeps["assemblers"] | null = null; export function getCustomerDependencies(params: ModuleParams): CustomerDeps { const { database } = params; const transactionManager = new SequelizeTransactionManager(database); if (!_mapper) _mapper = new CustomerMapper(); if (!_repo) _repo = new CustomerRepository(_mapper); if (!_service) _service = new CustomerService(_repo); 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, mapper: _mapper, service: _service, assemblers: _assemblers, 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!), }, presenters: { //list: (res: Response) => createListPresenter(res), //json: (res: Response, status: number = 200) => createJsonPresenter(res, status), }, }; }