import { ITransactionManager } from "@erp/core/api"; import { UniqueID } from "@repo/rdx-ddd"; import { Result } from "@repo/rdx-utils"; import { ICustomerService } from "../../domain"; import { GetCustomerAssembler } from "./assembler"; type GetCustomerUseCaseInput = { tenantId: string; id: string; }; export class GetCustomerUseCase { constructor( private readonly service: ICustomerService, private readonly transactionManager: ITransactionManager, private readonly assembler: GetCustomerAssembler ) {} public execute(params: GetCustomerUseCaseInput) { const { id, tenantId: companyId } = params; const idOrError = UniqueID.create(id); if (idOrError.isFailure) { return Result.fail(idOrError.error); } const companyIdOrError = UniqueID.create(companyId); if (companyIdOrError.isFailure) { return Result.fail(companyIdOrError.error); } return this.transactionManager.complete(async (transaction) => { try { const customerOrError = await this.service.getCustomerByIdInCompany( companyIdOrError.data, idOrError.data, transaction ); if (customerOrError.isFailure) { return Result.fail(customerOrError.error); } const getDTO = this.assembler.toDTO(customerOrError.data); return Result.ok(getDTO); } catch (error: unknown) { return Result.fail(error as Error); } }); } }