aboutsummaryrefslogtreecommitdiff
path: root/src/lib/server/services/references.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/server/services/references.ts')
-rw-r--r--src/lib/server/services/references.ts34
1 files changed, 32 insertions, 2 deletions
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<void> {
+ 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(