FactuGES_ERP/modules/suppliers/src/api/infrastructure/di/suppliers.di.ts
2026-08-24 23:43:00 +02:00

84 lines
2.5 KiB
TypeScript

import { type ModuleParams, buildTransactionManager } from "@erp/core/api";
import {
type CreateSupplierUseCase,
type GetSupplierByIdUseCase,
type ListSuppliersUseCase,
type UpdateSupplierUseCase,
buildCreateSupplierUseCase,
buildGetSupplierByIdUseCase,
buildListSuppliersUseCase,
buildSupplierUpdater,
buildUpdateSupplierUseCase,
buildSupplierCreator,
buildSupplierFinder,
buildSupplierInputMappers,
buildSupplierSnapshotBuilders,
} from "../../application";
import { buildSupplierPersistenceMappers } from "./supplier-persistence-mappers.di";
import { buildSupplierRepository } from "./supplier-repositories.di";
export type SuppliersInternalDeps = {
useCases: {
listSuppliers: () => ListSuppliersUseCase;
getSupplierById: () => GetSupplierByIdUseCase;
createSupplier: () => CreateSupplierUseCase;
updateSupplier: () => UpdateSupplierUseCase;
};
};
export function buildSuppliersDependencies(params: ModuleParams): SuppliersInternalDeps {
const { database, transactionContext } = params;
// Infrastructure
const transactionManager = buildTransactionManager(database, transactionContext);
const persistenceMappers = buildSupplierPersistenceMappers();
const repository = buildSupplierRepository({ database, mappers: persistenceMappers });
// Application helpers
const inputMappers = buildSupplierInputMappers();
const finder = buildSupplierFinder({ repository });
const creator = buildSupplierCreator({ repository });
const updater = buildSupplierUpdater({ repository });
const snapshotBuilders = buildSupplierSnapshotBuilders();
// Internal use cases (factories)
return {
useCases: {
listSuppliers: () =>
buildListSuppliersUseCase({
finder,
summarySnapshotBuilder: snapshotBuilders.summary,
transactionManager,
}),
getSupplierById: () =>
buildGetSupplierByIdUseCase({
finder,
fullSnapshotBuilder: snapshotBuilders.full,
transactionManager,
}),
createSupplier: () =>
buildCreateSupplierUseCase({
creator,
dtoMapper: inputMappers.createInputMapper,
fullSnapshotBuilder: snapshotBuilders.full,
transactionManager,
}),
updateSupplier: () =>
buildUpdateSupplierUseCase({
finder,
updater,
dtoMapper: inputMappers.updateInputMapper,
fullSnapshotBuilder: snapshotBuilders.full,
transactionManager,
}),
},
};
}