import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import { update } from "../domain/salesItem"; import type { Transaction } from "../generated/kysely-tailordb"; import { ItemNotSellableError } from "../lib/errors.generated"; import { createSalesItemRepository, type SalesItemRepository, } from "../repository/salesItemRepository"; export interface UpdateSalesItemInput { itemId: string; requiresPhysicalFulfillment?: boolean; } export async function run>( db: Transaction, input: UpdateSalesItemInput & Partial, _ctx: CommandContext, repositoryFactory: (db: Transaction) => SalesItemRepository = createSalesItemRepository, ) { const { itemId, requiresPhysicalFulfillment, ...customFields } = input; const repository = repositoryFactory(db); const salesItem = await repository.findByItemId(itemId, { forUpdate: true }); if (!salesItem) { return err(new ItemNotSellableError(itemId)); } const updated = update(salesItem, { requiresPhysicalFulfillment, customFields }); await repository.save(updated); return ok({ salesItemId: updated.id }); }