import type { IMapperRegistry, IPresenterRegistry, ModuleParams } from "@erp/core/api"; import { InMemoryMapperRegistry, InMemoryPresenterRegistry, SequelizeTransactionManager, } from "@erp/core/api"; import { CreateCustomerUseCase, DeleteCustomerUseCase, GetCustomerUseCase, ListCustomersUseCase, UpdateCustomerUseCase, } from "../application"; import { CustomerService } from "../domain"; import { CustomerDomainMapper } from "./mappers"; import { CustomerRepository } from "./sequelize"; export type CustomerDeps = { transactionManager: SequelizeTransactionManager; mapperRegistry: IMapperRegistry; presenterRegistry: IPresenterRegistry; repo: CustomerRepository; service: CustomerService; build: { list: () => ListCustomersUseCase; get: () => GetCustomerUseCase; create: () => CreateCustomerUseCase; update: () => UpdateCustomerUseCase; delete: () => DeleteCustomerUseCase; }; }; export function buildCustomerDependencies(params: ModuleParams): CustomerDeps { const { database } = params; const transactionManager = new SequelizeTransactionManager(database); // Mapper Registry const mapperRegistry = new InMemoryMapperRegistry(); mapperRegistry.registerDomainMapper({ resource: "customer" }, new CustomerDomainMapper()); // Repository & Services const repo = new CustomerRepository({ mapperRegistry: _mapperRegistry, database }); const service = new CustomerService(repo); // Presenter Registry const presenterRegistry = new InMemoryPresenterRegistry(); presenterRegistry.registerPresenters([ { key: { resource: "customer", projection: "FULL" }, presenter: new ListCustomersAssembler(), }, { key: { resource: "customer", projection: "LIST" }, presenter: new GetCustomerAssembler(), }, ]); return { transactionManager, repo, mapperRegistry, presenterRegistry, service, build: { /*list: () => new ListCustomersUseCase(_service!, transactionManager!, presenterRegistry!), get: () => new GetCustomerUseCase(_service!, transactionManager!, presenterRegistry!), create: () => new CreateCustomerUseCase(_service!, transactionManager!, presenterRegistry!), update: () => new UpdateCustomerUseCase(_service!, transactionManager!, presenterRegistry!), delete: () => new DeleteCustomerUseCase(_service!, transactionManager!),*/ }, }; }