import { fail } from "@sveltejs/kit"; import type { Actions, PageServerLoad } from "./$types"; import type { StackqItem } from "$lib/types/items"; import { parseBool, parseNum } from "$lib/parse-form"; import { validateImageUpload } from "$lib/validate-image-upload"; const COLLECTION = "Stackq_Items"; export const load: PageServerLoad = async ({ locals }) => { const list = await locals.pb .collection(COLLECTION) .getFullList({ sort: "-created", expand: "Parent", }) .catch((err) => { console.error(COLLECTION, err); return [] as StackqItem[]; }); const itemsForParent = list.map((i) => ({ id: i.id, Item: i.Item, SKU: i.SKU })); return { items: list, itemsForParent }; }; export const actions: Actions = { create: async ({ request, locals }) => { const form = await request.formData(); const Item = (form.get("Item") as string)?.trim() ?? ""; const SKU = (form.get("SKU") as string)?.trim() ?? ""; const Description = (form.get("Description") as string)?.trim() ?? ""; const UOM = (form.get("UOM") as string)?.trim() ?? ""; const Cost = parseNum(form.get("Cost")); const Vendor = (form.get("Vendor") as string)?.trim() ?? ""; const Catagory = (form.get("Catagory") as string)?.trim() ?? ""; const Sub_Catagory = (form.get("Sub_Catagory") as string)?.trim() ?? ""; const Has_Parent = parseBool(form.get("Has_Parent")); const Parent = (form.get("Parent") as string)?.trim() ?? ""; const Stock = parseBool(form.get("Stock")); const imageFileCreate = form.get("Image") as File | null; const hasImage = imageFileCreate && imageFileCreate.size > 0; if (hasImage) { const imgError = validateImageUpload(imageFileCreate); if (imgError) return fail(400, { error: imgError, form: "create" }); } if (!Item) return fail(400, { error: "Item name is required", form: "create" }); try { const body: Record = { Item, SKU, Description, UOM: UOM || undefined, Cost: Cost ?? 0, Vendor, Catagory: Catagory || undefined, Sub_Catagory: Sub_Catagory || undefined, Has_Parent: !!Has_Parent, Parent: Parent || null, Stock: !!Stock, }; if (hasImage) body.Image = imageFileCreate; await locals.pb.collection(COLLECTION).create(body); } catch (e: unknown) { const message = e && typeof e === "object" && "message" in e ? String((e as { message: string }).message) : "Create failed"; return fail(500, { error: message, form: "create" }); } return { success: true }; }, update: async ({ request, locals }) => { const form = await request.formData(); const id = (form.get("id") as string)?.trim(); if (!id) return fail(400, { error: "Missing id", form: "update" }); const Item = (form.get("Item") as string)?.trim() ?? ""; const SKU = (form.get("SKU") as string)?.trim() ?? ""; const Description = (form.get("Description") as string)?.trim() ?? ""; const UOM = (form.get("UOM") as string)?.trim() ?? ""; const Cost = parseNum(form.get("Cost")); const Vendor = (form.get("Vendor") as string)?.trim() ?? ""; const Catagory = (form.get("Catagory") as string)?.trim() ?? ""; const Sub_Catagory = (form.get("Sub_Catagory") as string)?.trim() ?? ""; const Has_Parent = parseBool(form.get("Has_Parent")); const Parent = (form.get("Parent") as string)?.trim() ?? ""; const Stock = parseBool(form.get("Stock")); const Image = form.get("Image") as File | null; const imageFile = Image && Image.size > 0 ? Image : undefined; if (imageFile) { const imgError = validateImageUpload(imageFile); if (imgError) return fail(400, { error: imgError, form: "update" }); } if (!Item) return fail(400, { error: "Item name is required", form: "update" }); try { const body: Record = { Item, SKU, Description, UOM: UOM || undefined, Cost: Cost ?? 0, Vendor, Catagory: Catagory || undefined, Sub_Catagory: Sub_Catagory || undefined, Has_Parent: !!Has_Parent, Parent: Parent || null, Stock: !!Stock, }; if (imageFile) body.Image = imageFile; await locals.pb.collection(COLLECTION).update(id, body); } catch (e: unknown) { const message = e && typeof e === "object" && "message" in e ? String((e as { message: string }).message) : "Update failed"; return fail(500, { error: message, form: "update" }); } return { success: true }; }, delete: async ({ request, locals }) => { const form = await request.formData(); const id = (form.get("id") as string)?.trim(); if (!id) return fail(400, { error: "Missing id", form: "delete" }); try { await locals.pb.collection(COLLECTION).delete(id); } catch (e: unknown) { const message = e && typeof e === "object" && "message" in e ? String((e as { message: string }).message) : "Delete failed"; return fail(500, { error: message, form: "delete" }); } return { success: true }; }, };