diff options
Diffstat (limited to 'src/routes/groceries/+page.server.ts')
| -rw-r--r-- | src/routes/groceries/+page.server.ts | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/routes/groceries/+page.server.ts b/src/routes/groceries/+page.server.ts new file mode 100644 index 0000000..e462ab2 --- /dev/null +++ b/src/routes/groceries/+page.server.ts @@ -0,0 +1,71 @@ +import { fail, redirect, error } from '@sveltejs/kit'; +import { + loadUnchecked, + loadAll, + toggle, + addOrUncheck, +} from '$lib/server/services/groceries'; +import { + numericId, + parseFormString, + parseOptionalNumber, +} from '$lib/server/services/validation'; +import type { EnrichedGrocery } from '$lib/server/services/groceries'; +import type { Category } from '$lib/server/services/types'; +import type { Actions, PageServerLoad } from './$types'; + +export interface GroceriesOutput { + items: EnrichedGrocery[]; + categories: Category[]; + catalog: EnrichedGrocery[]; +} + +export const load: PageServerLoad = async () => { + const unchecked = await loadUnchecked(); + const all = await loadAll(); + return { + items: unchecked.items, + categories: unchecked.categories, + catalog: all.items, + }; +}; + +export const actions: Actions = { + add: async ({ request }) => { + const data = await request.formData(); + const name = parseFormString(data.get('name')); + const categoryId = parseOptionalNumber(data.get('category_id')); + + if (!name) { + return fail(400, { error: 'Le nom est requis' }); + } + + await addOrUncheck(name, categoryId); + const { items } = await loadUnchecked(); + return { success: true, items }; + }, + + toggle: async ({ request }) => { + const data = await request.formData(); + try { + const id = numericId(data.get('id')); + await toggle(id); + } catch { + return fail(400, { error: 'ID invalide' }); + } + return { success: true }; + }, + + addAndEdit: async ({ request }) => { + const data = await request.formData(); + const name = parseFormString(data.get('name')); + const categoryId = parseOptionalNumber(data.get('category_id')); + + if (!name) { + return fail(400, { error: 'Le nom est requis' }); + } + + const { item, created } = await addOrUncheck(name, categoryId); + throw redirect(303, `/grocery/${item.id}`); + }, +}; |
