import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import { reject } from "../domain/purchaseOrder"; import type { Transaction } from "../generated/kysely-tailordb"; import { PurchaseOrderNotFoundError } from "../lib/errors.generated"; import { createPurchaseOrderRepository, type PurchaseOrderRepository, } from "../repository/purchaseOrderRepository"; export interface RejectPurchaseOrderInput { id: string; reason: string; } export async function run( db: Transaction, input: RejectPurchaseOrderInput, ctx: CommandContext, repositoryFactory: (db: Transaction) => PurchaseOrderRepository = createPurchaseOrderRepository, ) { void ctx; const repository = repositoryFactory(db); const order = await repository.findById(input.id, { forUpdate: true }); if (!order) { return err(new PurchaseOrderNotFoundError(input.id)); } const rejected = reject(order, input.reason); if (!rejected.ok) { return rejected; } await repository.save(rejected.value); return ok({ purchaseOrderId: rejected.value.id }); }