FactuGES_ERP/modules/supplier/src/api/application/services/supplier-updater.service.ts

61 lines
1.5 KiB
TypeScript
Raw Normal View History

2026-03-30 11:57:42 +00:00
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<Result<Supplier, Error>>;
}
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<Result<Supplier, Error>> {
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);
}
}