import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import { update } from "../domain/purchaseItem"; import type { Transaction } from "../generated/kysely-tailordb"; import { ItemNotPurchasableError } from "../lib/errors.generated"; import { createPurchaseItemRepository, type PurchaseItemRepository, } from "../repository/purchaseItemRepository"; export interface UpdatePurchaseItemInput { itemId: string; requiresPhysicalReceipt?: boolean; } export async function run>( db: Transaction, input: UpdatePurchaseItemInput & Partial, _ctx: CommandContext, repositoryFactory: (db: Transaction) => PurchaseItemRepository = createPurchaseItemRepository, ) { const { itemId, requiresPhysicalReceipt, ...customFields } = input; const repository = repositoryFactory(db); const purchaseItem = await repository.findByItemId(itemId, { forUpdate: true }); if (!purchaseItem) { return err(new ItemNotPurchasableError(itemId)); } const updated = update(purchaseItem, { requiresPhysicalReceipt, customFields }); await repository.save(updated); return ok({ purchaseItemId: updated.id }); }