aboutsummaryrefslogtreecommitdiff
path: root/src/routes/+page.server.ts
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-07-27 18:31:26 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-07-27 18:31:26 +0200
commite14717b2e7853705469275d64023bb902b195ebb (patch)
tree2e450f7b4e864e232d06df43ad1aba1b62be4f4c /src/routes/+page.server.ts
parent8224c7d6572db6ec76c4224eec1df8a538b47ad4 (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.ts27
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(),
});
}