diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-06 00:46:53 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-10-06 00:46:53 +0200 |
| commit | c915f91fbe8d97201d813c792f4e1fe8c4401e15 (patch) | |
| tree | 7b341e4d7548205776557437bd2245ec59bf0a57 /src/lib/server/services/groceries.ts | |
| parent | f7366834ee41bbb4ac8a9a252224241a884af41b (diff) | |
fix: make grocery and reference ordering deterministic
Every list query lacked a tiebreak, so rows sharing a sort key (same-ms
createdAt inserts, tied or NULL quality scores) came back in unspecified
order and bestRef flipped between loads. Add explicit tiebreaks: items
createdAt desc, id desc (newest first); references qualityScore desc,
id asc (first inserted wins ties). Categories were already total
(order, name unique).
Pin the rules with service tests.
Diffstat (limited to 'src/lib/server/services/groceries.ts')
| -rw-r--r-- | src/lib/server/services/groceries.ts | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/lib/server/services/groceries.ts b/src/lib/server/services/groceries.ts index 9aa8102..fc66300 100644 --- a/src/lib/server/services/groceries.ts +++ b/src/lib/server/services/groceries.ts @@ -20,12 +20,15 @@ export async function loadUnchecked( .select() .from(groceries) .where(eq(groceries.checked, false)) - .orderBy(desc(groceries.createdAt)), + .orderBy(desc(groceries.createdAt), desc(groceries.id)), db .select() .from(categories) .orderBy(asc(categories.order), asc(categories.name)), - db.select().from(references).orderBy(desc(references.qualityScore)), + db + .select() + .from(references) + .orderBy(desc(references.qualityScore), asc(references.id)), ]); return { @@ -38,12 +41,18 @@ export async function loadAll( db = defaultDb, ): Promise<{ items: EnrichedGrocery[]; categories: Category[] }> { const [items, cats, refs] = await Promise.all([ - db.select().from(groceries).orderBy(desc(groceries.createdAt)), + db + .select() + .from(groceries) + .orderBy(desc(groceries.createdAt), desc(groceries.id)), db .select() .from(categories) .orderBy(asc(categories.order), asc(categories.name)), - db.select().from(references).orderBy(desc(references.qualityScore)), + db + .select() + .from(references) + .orderBy(desc(references.qualityScore), asc(references.id)), ]); return { |
