import type { ModuleParams } from "@erp/core/api"; import { SequelizeTransactionManager } from "@erp/core/api"; import { CreateCustomerInvoiceUseCase, CreateCustomerInvoicesAssembler, DeleteCustomerInvoiceUseCase, GetCustomerInvoiceItemsAssembler, GetCustomerInvoiceUseCase, ListCustomerInvoicesAssembler, ListCustomerInvoicesUseCase, UpdateCustomerInvoiceAssembler, UpdateCustomerInvoiceUseCase, } from "../application"; import { CustomerInvoiceService, ICustomerInvoiceService } from "../domain"; import { CustomerInvoiceMapper } from "./mappers"; import { CustomerInvoiceRepository } from "./sequelize"; type InvoiceDeps = { transactionManager: SequelizeTransactionManager; repo: CustomerInvoiceRepository; mapper: CustomerInvoiceMapper; service: ICustomerInvoiceService; assemblers: { list: ListCustomerInvoicesAssembler; get: GetCustomerInvoiceItemsAssembler; create: CreateCustomerInvoicesAssembler; update: UpdateCustomerInvoiceAssembler; }; build: { list: () => ListCustomerInvoicesUseCase; get: () => GetCustomerInvoiceUseCase; create: () => CreateCustomerInvoiceUseCase; update: () => UpdateCustomerInvoiceUseCase; delete: () => DeleteCustomerInvoiceUseCase; }; presenters: { // list: (res: Response) => ListPresenter; }; }; let _repo: CustomerInvoiceRepository | null = null; let _mapper: CustomerInvoiceMapper | null = null; let _service: ICustomerInvoiceService | null = null; let _assemblers: InvoiceDeps["assemblers"] | null = null; export function getInvoiceDependencies(params: ModuleParams): InvoiceDeps { const { database } = params; const transactionManager = new SequelizeTransactionManager(database); if (!_mapper) _mapper = new CustomerInvoiceMapper(); if (!_repo) _repo = new CustomerInvoiceRepository(_mapper); if (!_service) _service = new CustomerInvoiceService(_repo); if (!_assemblers) { _assemblers = { list: new ListCustomerInvoicesAssembler(), // transforma domain → ListDTO get: new GetCustomerInvoiceItemsAssembler(), // transforma domain → DetailDTO create: new CreateCustomerInvoicesAssembler(), // transforma domain → CreatedDTO update: new UpdateCustomerInvoiceAssembler(), // transforma domain -> UpdateDTO }; } return { transactionManager, repo: _repo, mapper: _mapper, service: _service, assemblers: _assemblers, build: { list: () => new ListCustomerInvoicesUseCase(_service!, transactionManager!, _assemblers!.list), get: () => new GetCustomerInvoiceUseCase(_service!, transactionManager!, _assemblers!.get), create: () => new CreateCustomerInvoiceUseCase(_service!, transactionManager!, _assemblers!.create), update: () => new UpdateCustomerInvoiceUseCase(_service!, transactionManager!, _assemblers!.update), delete: () => new DeleteCustomerInvoiceUseCase(_service!, transactionManager!), }, presenters: { //list: (res: Response) => createListPresenter(res), //json: (res: Response, status: number = 200) => createJsonPresenter(res, status), }, }; }