import type { UniqueID } from "@repo/rdx-ddd"; import { Result } from "@repo/rdx-utils"; import type { Supplier, SupplierPatchProps } from "../../domain"; import type { ISupplierRepository } from "../repositories"; export interface ISupplierUpdater { update(params: { companyId: UniqueID; id: UniqueID; props: SupplierPatchProps; transaction: unknown; }): Promise>; } type SupplierUpdaterDeps = { repository: ISupplierRepository; }; export class SupplierUpdater implements ISupplierUpdater { private readonly repository: ISupplierRepository; constructor(deps: SupplierUpdaterDeps) { this.repository = deps.repository; } async update(params: { companyId: UniqueID; id: UniqueID; props: SupplierPatchProps; transaction: unknown; }): Promise> { const { companyId, id, props, transaction } = params; // Recuperar agregado existente const existingResult = await this.repository.getByIdInCompany(companyId, id, transaction); if (existingResult.isFailure) { return Result.fail(existingResult.error); } const supplier = existingResult.data; // Aplicar cambios en el agregado const updateResult = supplier.update(props); if (updateResult.isFailure) { return Result.fail(updateResult.error); } // Persistir cambios const saveResult = await this.repository.update(supplier, transaction); if (saveResult.isFailure) { return Result.fail(saveResult.error); } return Result.ok(supplier); } }