From 66939bab93cdcb9b7732c45d7bc3b99b6951fe15 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Wed, 7 Oct 2026 19:17:14 +0200 Subject: feat: promote a reference as the primary shown in lists Add an is_primary flag to references; the promoted ref sorts first on the item page and is the one shown under the item in the list and catalog. Item page gets a star toggle per reference. --- src/lib/server/services/references.ts | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) (limited to 'src/lib/server/services/references.ts') diff --git a/src/lib/server/services/references.ts b/src/lib/server/services/references.ts index c5b6630..d48fb9b 100644 --- a/src/lib/server/services/references.ts +++ b/src/lib/server/services/references.ts @@ -1,9 +1,16 @@ import { db as defaultDb } from '$lib/server/db'; import { references } from '$lib/server/db/schema'; -import { eq, desc, asc } from 'drizzle-orm'; +import { eq, ne, and, desc, asc } from 'drizzle-orm'; import type { AppDatabase } from './groceries'; import type { Reference } from './types'; +/** Primary refs first, then best score, then insertion order. */ +export const referenceOrder = [ + desc(references.isPrimary), + desc(references.qualityScore), + asc(references.id), +]; + export async function loadForGrocery( groceryId: number, db = defaultDb, @@ -12,7 +19,30 @@ export async function loadForGrocery( .select() .from(references) .where(eq(references.groceryId, groceryId)) - .orderBy(desc(references.qualityScore), asc(references.id)); + .orderBy(...referenceOrder); +} + +/** + * Marks `id` as the primary ref of its grocery, clearing any sibling primary + * so at most one ref per grocery is promoted. + */ +export async function promote(id: number, db = defaultDb): Promise { + const [target] = await db + .select() + .from(references) + .where(eq(references.id, id)); + if (!target) throw new Error('Reference not found'); + + await db + .update(references) + .set({ isPrimary: true }) + .where(eq(references.id, id)); + await db + .update(references) + .set({ isPrimary: false }) + .where( + and(eq(references.groceryId, target.groceryId), ne(references.id, id)), + ); } export async function add( -- cgit v1.3