61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
|
|
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);
|
||
|
|
}
|
||
|
|
}
|