Uecko_ERP/modules/customers/src/api/infrastructure/di/customers.di.ts
2026-06-25 13:49:59 +02:00

123 lines
3.9 KiB
TypeScript

import { type ModuleParams, buildTransactionManager } from "@erp/core/api";
import {
type CreateCustomerUseCase,
type GetCustomerByIdUseCase,
type ListCustomersUseCase,
type UpdateCustomerUseCase,
buildCreateCustomerUseCase,
buildCustomerCreator,
buildCustomerFinder,
buildCustomerInputMappers,
buildCustomerSnapshotBuilders,
buildCustomerUpdater,
buildGetCustomerByIdUseCase,
buildListCustomersUseCase,
buildUpdateCustomerUseCase,
} from "../../application";
import { buildCustomerReadModelAssemblers } from "../../application/di";
import { buildCustomerCatalogResolvers } from "../../application/di/customer-catalog-resolvers.di";
import { resolveCustomerCatalogsDeps } from "./customer-catalog-deps.di";
import { buildCustomerPersistenceMappers } from "./customer-persistence-mappers.di";
import { buildCustomerRepository } from "./customer-repositories.di";
export type CustomersInternalDeps = {
useCases: {
listCustomers: () => ListCustomersUseCase;
getCustomerById: () => GetCustomerByIdUseCase;
createCustomer: () => CreateCustomerUseCase;
updateCustomer: () => UpdateCustomerUseCase;
//reportCustomer: () => ReportCustomerUseCase;
/*
deleteCustomer: () => DeleteCustomerUseCase;
issueCustomer: () => IssueCustomerUseCase;
changeStatusCustomer: () => ChangeStatusCustomerUseCase;*/
};
};
export function buildCustomersDependencies(params: ModuleParams): CustomersInternalDeps {
const { database } = params;
const catalogs = resolveCustomerCatalogsDeps(params);
const transactionManager = buildTransactionManager(database);
const persistenceMappers = buildCustomerPersistenceMappers();
const repository = buildCustomerRepository({ database, mappers: persistenceMappers });
const inputMappers = buildCustomerInputMappers();
const snapshotBuilders = buildCustomerSnapshotBuilders();
const catalogResolvers = buildCustomerCatalogResolvers({
taxDefinitionFinder: catalogs.taxDefinition.finder,
taxRegimeFinder: catalogs.taxRegime.finder,
paymentMethodFinder: catalogs.paymentMethod.finder,
paymentTermFinder: catalogs.paymentTerm.finder,
});
const readModelAssemblers = buildCustomerReadModelAssemblers({
paymentMethodFinder: catalogs.paymentMethod.finder,
taxRegimeFinder: catalogs.taxRegime.finder,
paymentTermFinder: catalogs.paymentTerm.finder,
});
const finder = buildCustomerFinder({ repository });
const creator = buildCustomerCreator({ repository });
const updater = buildCustomerUpdater({ repository });
//const documentGeneratorPipeline = buildCustomerDocumentService(params);
// Internal use cases (factories)
return {
useCases: {
listCustomers: () =>
buildListCustomersUseCase({
finder,
summarySnapshotBuilder: snapshotBuilders.summary,
transactionManager,
}),
getCustomerById: () =>
buildGetCustomerByIdUseCase({
finder,
fullReadModelAssembler: readModelAssemblers.full,
fullSnapshotBuilder: snapshotBuilders.full,
transactionManager,
}),
createCustomer: () =>
buildCreateCustomerUseCase({
creator,
dtoMapper: inputMappers.createInputMapper,
fullReadModelAssembler: readModelAssemblers.full,
fullSnapshotBuilder: snapshotBuilders.full,
transactionManager,
}),
updateCustomer: () =>
buildUpdateCustomerUseCase({
updater,
dtoMapper: inputMappers.updateInputMapper,
fullReadModelAssembler: readModelAssemblers.full,
fullSnapshotBuilder: snapshotBuilders.full,
transactionManager,
}),
/*reportCustomer: () =>
buildReportCustomerUseCase({
finder,
fullSnapshotBuilder: snapshotBuilders.full,
reportSnapshotBuilder: snapshotBuilders.report,
documentService: documentGeneratorPipeline,
transactionManager,
}),
*/
},
};
}