Uecko_ERP/modules/customers/src/api/infrastructure/dependencies.ts

83 lines
2.8 KiB
TypeScript
Raw Normal View History

import type { ModuleParams } from "@erp/core/api";
import { SequelizeTransactionManager } from "@erp/core/api";
import {
CreateCustomerUseCase,
CreateCustomersAssembler,
DeleteCustomerUseCase,
GetCustomerAssembler,
GetCustomerUseCase,
ListCustomersAssembler,
ListCustomersUseCase,
2025-09-01 14:07:59 +00:00
UpdateCustomerAssembler,
UpdateCustomerUseCase,
} from "../application";
2025-09-01 14:07:59 +00:00
import { CustomerService } from "../domain";
import { CustomerMapper } from "./mappers";
import { CustomerRepository } from "./sequelize";
type CustomerDeps = {
transactionManager: SequelizeTransactionManager;
repo: CustomerRepository;
mapper: CustomerMapper;
2025-09-01 14:07:59 +00:00
service: CustomerService;
assemblers: {
list: ListCustomersAssembler;
get: GetCustomerAssembler;
create: CreateCustomersAssembler;
2025-09-01 14:07:59 +00:00
update: UpdateCustomerAssembler;
};
build: {
list: () => ListCustomersUseCase;
get: () => GetCustomerUseCase;
create: () => CreateCustomerUseCase;
2025-09-01 14:07:59 +00:00
update: () => UpdateCustomerUseCase;
delete: () => DeleteCustomerUseCase;
};
presenters: {
// list: <T>(res: Response) => ListPresenter<T>;
};
};
let _repo: CustomerRepository | null = null;
let _mapper: CustomerMapper | null = null;
2025-09-01 14:07:59 +00:00
let _service: CustomerService | 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
2025-09-01 14:07:59 +00:00
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),
2025-09-01 14:07:59 +00:00
update: () => new UpdateCustomerUseCase(_service!, transactionManager!, _assemblers!.update),
delete: () => new DeleteCustomerUseCase(_service!, transactionManager!),
},
presenters: {
//list: <T>(res: Response) => createListPresenter<T>(res),
//json: <T>(res: Response, status: number = 200) => createJsonPresenter<T>(res, status),
},
};
}