FactuGES_ERP/modules/companies/src/api/infrastructure/di/companies.di.ts

105 lines
3.2 KiB
TypeScript
Raw Normal View History

2026-07-06 10:57:33 +00:00
import { buildTransactionManager, type ModuleParams, type SetupParams } from "@erp/core/api";
import type { IIdentityPublicServices } from "@erp/identity/api";
import type { Sequelize } from "sequelize";
import {
CompanyCreator,
CompanyFinder,
CompanyPublicFinder,
CompanyPublicModelMapper,
CompanyStatusChanger,
CompanyUpdater,
CreateCompanyUseCase,
DisableCompanyUseCase,
EnableCompanyUseCase,
FindAvailableCompaniesForAccountUseCase,
GetCompanyByIdUseCase,
type ICompanyPublicServices,
UpdateCompanyUseCase,
buildCompanyPublicServices,
} from "../../application";
import { SequelizeCompanyDomainMapper, SequelizeCompanyRepository } from "../persistence";
export type CompaniesInternalDeps = {
repository: SequelizeCompanyRepository;
publicFinder: CompanyPublicFinder;
useCases: {
createCompany: () => CreateCompanyUseCase;
getCompanyById: () => GetCompanyByIdUseCase;
findAvailableCompaniesForAccount: () => FindAvailableCompaniesForAccountUseCase;
updateCompany: () => UpdateCompanyUseCase;
enableCompany: () => EnableCompanyUseCase;
disableCompany: () => DisableCompanyUseCase;
};
};
export const buildCompaniesDependencies = (params: ModuleParams): CompaniesInternalDeps => {
const { database, getService } = params;
const transactionManager = buildTransactionManager(database as Sequelize);
const responseMapper = new CompanyPublicModelMapper();
const identityServices = getService<IIdentityPublicServices>("identity:general");
const repository = new SequelizeCompanyRepository(new SequelizeCompanyDomainMapper(), database);
const finder = new CompanyFinder(repository);
const creator = new CompanyCreator(repository);
const updater = new CompanyUpdater({ finder, repository });
const statusChanger = new CompanyStatusChanger(repository);
const publicFinder = new CompanyPublicFinder({
repository,
mapper: responseMapper,
});
return {
repository,
publicFinder,
useCases: {
createCompany: () =>
new CreateCompanyUseCase({
creator,
responseMapper,
transactionManager,
}),
getCompanyById: () =>
new GetCompanyByIdUseCase({
finder,
responseMapper,
transactionManager,
}),
findAvailableCompaniesForAccount: () =>
new FindAvailableCompaniesForAccountUseCase({
identityServices,
repository,
responseMapper,
transactionManager,
}),
updateCompany: () =>
new UpdateCompanyUseCase({
updater,
responseMapper,
transactionManager,
}),
enableCompany: () =>
new EnableCompanyUseCase({
finder,
changer: statusChanger,
responseMapper,
transactionManager,
}),
disableCompany: () =>
new DisableCompanyUseCase({
finder,
changer: statusChanger,
responseMapper,
transactionManager,
}),
},
};
};
export const buildCompaniesPublicServices = (
_params: SetupParams,
deps: CompaniesInternalDeps
): ICompanyPublicServices => {
return buildCompanyPublicServices(deps.publicFinder);
};