aboutsummaryrefslogtreecommitdiff
path: root/src/routes/groceries/+page.server.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/routes/groceries/+page.server.ts')
-rw-r--r--src/routes/groceries/+page.server.ts71
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}`);
+ },
+};