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

76 lines
2.6 KiB
TypeScript
Raw Normal View History

2025-09-12 10:40:52 +00:00
import type { IMapperRegistry, IPresenterRegistry, ModuleParams } from "@erp/core/api";
2025-09-13 18:45:55 +00:00
import {
InMemoryMapperRegistry,
InMemoryPresenterRegistry,
SequelizeTransactionManager,
} from "@erp/core/api";
import {
2025-09-14 10:50:29 +00:00
CreateCustomerUseCase,
2025-09-14 10:04:57 +00:00
CustomerFullPresenter,
ListCustomersPresenter,
ListCustomersUseCase,
2025-09-19 16:55:30 +00:00
UpdateCustomerUseCase,
} from "../application";
2025-09-14 10:04:57 +00:00
import { GetCustomerUseCase } from "../application/use-cases/get-customer.use-case";
2025-09-01 14:07:59 +00:00
import { CustomerService } from "../domain";
2025-09-14 10:04:57 +00:00
import { CustomerDomainMapper, CustomerListMapper } from "./mappers";
import { CustomerRepository } from "./sequelize";
2025-09-13 18:45:55 +00:00
export type CustomerDeps = {
transactionManager: SequelizeTransactionManager;
2025-09-12 10:40:52 +00:00
mapperRegistry: IMapperRegistry;
presenterRegistry: IPresenterRegistry;
repo: CustomerRepository;
2025-09-01 14:07:59 +00:00
service: CustomerService;
build: {
list: () => ListCustomersUseCase;
get: () => GetCustomerUseCase;
2025-09-14 10:50:29 +00:00
create: () => CreateCustomerUseCase;
2025-09-19 16:55:30 +00:00
update: () => UpdateCustomerUseCase;
//delete: () => DeleteCustomerUseCase;
};
};
2025-09-13 18:45:55 +00:00
export function buildCustomerDependencies(params: ModuleParams): CustomerDeps {
2025-09-23 10:40:49 +00:00
const { database, logger } = params;
const transactionManager = new SequelizeTransactionManager(database);
2025-09-13 18:45:55 +00:00
// Mapper Registry
const mapperRegistry = new InMemoryMapperRegistry();
2025-09-14 10:04:57 +00:00
mapperRegistry
.registerDomainMapper({ resource: "customer" }, new CustomerDomainMapper())
.registerQueryMapper({ resource: "customer", query: "LIST" }, new CustomerListMapper());
2025-09-13 18:45:55 +00:00
// Repository & Services
2025-09-14 10:04:57 +00:00
const repo = new CustomerRepository({ mapperRegistry, database });
2025-09-13 18:45:55 +00:00
const service = new CustomerService(repo);
2025-09-12 10:40:52 +00:00
2025-09-13 18:45:55 +00:00
// Presenter Registry
const presenterRegistry = new InMemoryPresenterRegistry();
presenterRegistry.registerPresenters([
{
key: { resource: "customer", projection: "FULL" },
2025-09-14 10:04:57 +00:00
presenter: new CustomerFullPresenter(presenterRegistry),
2025-09-13 18:45:55 +00:00
},
{
key: { resource: "customer", projection: "LIST" },
2025-09-14 10:04:57 +00:00
presenter: new ListCustomersPresenter(presenterRegistry),
2025-09-13 18:45:55 +00:00
},
]);
return {
transactionManager,
2025-09-13 18:45:55 +00:00
repo,
mapperRegistry,
presenterRegistry,
service,
build: {
2025-09-14 10:04:57 +00:00
list: () => new ListCustomersUseCase(service, transactionManager, presenterRegistry),
2025-09-14 10:50:29 +00:00
get: () => new GetCustomerUseCase(service, transactionManager, presenterRegistry),
create: () => new CreateCustomerUseCase(service, transactionManager, presenterRegistry),
2025-09-19 16:55:30 +00:00
update: () => new UpdateCustomerUseCase(service, transactionManager, presenterRegistry),
//delete: () => new DeleteCustomerUseCase(_service!, transactionManager!),
},
};
}