diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-07-27 18:31:26 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-07-27 18:31:26 +0200 |
| commit | e14717b2e7853705469275d64023bb902b195ebb (patch) | |
| tree | 2e450f7b4e864e232d06df43ad1aba1b62be4f4c /src/routes/+page.server.ts | |
| parent | 8224c7d6572db6ec76c4224eec1df8a538b47ad4 (diff) | |
feat: separate categories table + /categories management page
- Categories table (id, name unique) with FK from groceries.category_id
- /categories page for add/delete categories
- Main page uses native <select> dropdown for category
- Categories grouped by name in list/catalog views
- Regenerated drizzle migrations from scratch
Diffstat (limited to 'src/routes/+page.server.ts')
| -rw-r--r-- | src/routes/+page.server.ts | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index c57578f..e77b27f 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,22 +1,31 @@ import { fail } from '@sveltejs/kit'; import { db } from '$lib/server/db'; -import { groceries } from '$lib/server/db/schema'; +import { groceries, categories } from '$lib/server/db/schema'; import { eq, desc } from 'drizzle-orm'; import type { Actions, PageServerLoad } from './$types'; export const load: PageServerLoad = async () => { - const items = await db - .select() - .from(groceries) - .orderBy(desc(groceries.createdAt)); + const [items, cats] = await Promise.all([ + db.select().from(groceries).orderBy(desc(groceries.createdAt)), + db.select().from(categories).orderBy(desc(categories.name)), + ]); - return { items }; + const catMap = new Map(cats.map((c) => [c.id, c.name])); + + return { + items: items.map((i) => ({ + ...i, + categoryName: i.categoryId ? (catMap.get(i.categoryId) ?? null) : null, + })), + categories: cats, + }; }; export const actions: Actions = { add: async ({ request }) => { const data = await request.formData(); const name = data.get('name')?.toString().trim(); + const categoryId = data.get('category_id')?.toString() || null; if (!name) { return fail(400, { error: 'Name is required' }); @@ -31,11 +40,15 @@ export const actions: Actions = { if (existing) { await db .update(groceries) - .set({ checked: false }) + .set({ + checked: false, + categoryId: categoryId ? Number(categoryId) : existing.categoryId, + }) .where(eq(groceries.id, existing.id)); } else { await db.insert(groceries).values({ name, + categoryId: categoryId ? Number(categoryId) : null, createdAt: new Date().toISOString(), }); } |
