import { ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import { adopt } from "../domain/salesItem"; import type { Transaction } from "../generated/kysely-tailordb"; import type { ItemManagementQueries } from "../module"; import { createSalesItemRepository, type SalesItemRepository, } from "../repository/salesItemRepository"; export interface CreateSalesItemInput { itemId: string; requiresPhysicalFulfillment: boolean; } export async function run>( db: Transaction, input: CreateSalesItemInput & CF, ctx: CommandContext, itemManagementQueries: Pick, repositoryFactory: (db: Transaction) => SalesItemRepository = createSalesItemRepository, ) { const { itemId, requiresPhysicalFulfillment, ...customFields } = input; const repository = repositoryFactory(db); const existingRecord = await repository.findByItemId(itemId, { forUpdate: true }); const { item } = (await itemManagementQueries.getItem(db, { id: itemId }, ctx)).value; const adopted = adopt( { itemId, requiresPhysicalFulfillment, customFields }, { item, existingRecord }, ); if (!adopted.ok) { return adopted; } await repository.save(adopted.value); return ok({ salesItemId: adopted.value.id }); }