import { createContext, DomainError } from "@tailor-platform/erp-kit/app"; import { createResolver, t } from "@tailor-platform/sdk"; import { getDB } from "@/generated/kysely-tailordb"; import { imModulesExport } from "@/modules"; export default createResolver({ name: "createItem", operation: "mutation", input: { sku: t.string().description("Stock keeping unit"), name: t.string().description("Item name"), barcode: t.string({ optional: true }).description("Barcode"), unitId: t.string().description("Unit of measure ID"), }, body: async (context) => { const ctx = createContext(context); const db = getDB("main-db"); return db .transaction() .execute(async (trx) => { // Step 1: Create item (starts in DRAFT state) const result1 = await imModulesExport.commands.createItem( trx, { sku: context.input.sku, name: context.input.name, barcode: context.input.barcode ?? undefined, unitId: context.input.unitId, }, ctx, ); if (!result1.ok) { switch (result1.error.code) { case "ITEM_MANAGEMENT_DUPLICATE_SKU": throw new DomainError(`Duplicate SKU: ${context.input.sku}`); case "ITEM_MANAGEMENT_DUPLICATE_BARCODE": throw new DomainError(`Duplicate barcode: ${context.input.barcode}`); case "ITEM_MANAGEMENT_UNIT_NOT_FOUND": throw new DomainError(`Unit not found: ${context.input.unitId}`); case "UNAUTHENTICATED": throw new DomainError("Authentication is required"); case "INSUFFICIENT_PERMISSION": throw new DomainError("You do not have permission to perform this action"); default: throw result1.error satisfies never; } } const itemId = result1.value.item.id; // Step 2: Activate item const result2 = await imModulesExport.commands.activateItem(trx, { id: itemId }, ctx); if (!result2.ok) { switch (result2.error.code) { case "ITEM_MANAGEMENT_ITEM_NOT_FOUND": throw new DomainError(`Item not found: ${itemId}`); case "ITEM_MANAGEMENT_INVALID_STATE_TRANSITION": throw new DomainError(`Invalid state transition for item: ${itemId}`); case "UNAUTHENTICATED": throw new DomainError("Authentication is required"); case "INSUFFICIENT_PERMISSION": throw new DomainError("You do not have permission to perform this action"); default: throw result2.error satisfies never; } } return { id: result1.value.item.id }; }) .catch((err: unknown) => { if (err instanceof DomainError) throw err; throw new Error("Failed to create the item", { cause: err }); }); }, output: t .object({ id: t.string().description("Created item ID"), }) .description("Created item"), });