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, }), }, }; }