aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/repositories/sync.ts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-12-31 20:34:27 +0900
committernsfisis <nsfisis@gmail.com>2025-12-31 20:34:27 +0900
commite3a84df9fcae8f25c8ea1d527638c2bfaafb942e (patch)
tree605f909c78e8b4510b7110d57749c1c0fe566360 /src/server/repositories/sync.ts
parentb69fd1353c449baa3262016c2bb8f653932bd932 (diff)
downloadkioku-e3a84df9fcae8f25c8ea1d527638c2bfaafb942e.tar.gz
kioku-e3a84df9fcae8f25c8ea1d527638c2bfaafb942e.tar.zst
kioku-e3a84df9fcae8f25c8ea1d527638c2bfaafb942e.zip
feat(db): add ORDER BY to repository SELECT queries
Ensures deterministic ordering for all multi-row SELECT queries: - deck/note/noteType findByUserId/findByDeckId: order by createdAt - card findByNoteId: order by isReversed (normal card first) - note field values: order by noteFieldTypeId - sync pull queries: order by id This guarantees consistent UI display and sync results regardless of PostgreSQL's internal row ordering. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/server/repositories/sync.ts')
-rw-r--r--src/server/repositories/sync.ts12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/server/repositories/sync.ts b/src/server/repositories/sync.ts
index 188bd1b..ca4c208 100644
--- a/src/server/repositories/sync.ts
+++ b/src/server/repositories/sync.ts
@@ -896,7 +896,8 @@ export const syncRepository: SyncRepository = {
const cardResults = await db
.select()
.from(cards)
- .where(gt(cards.syncVersion, lastSyncVersion));
+ .where(gt(cards.syncVersion, lastSyncVersion))
+ .orderBy(cards.id);
// Filter cards that belong to user's decks
pulledCards = cardResults.filter((c) => deckIdList.includes(c.deckId));
@@ -938,7 +939,8 @@ export const syncRepository: SyncRepository = {
const fieldTypeResults = await db
.select()
.from(noteFieldTypes)
- .where(gt(noteFieldTypes.syncVersion, lastSyncVersion));
+ .where(gt(noteFieldTypes.syncVersion, lastSyncVersion))
+ .orderBy(noteFieldTypes.id);
pulledNoteFieldTypes = fieldTypeResults.filter((ft) =>
noteTypeIdList.includes(ft.noteTypeId),
@@ -951,7 +953,8 @@ export const syncRepository: SyncRepository = {
const noteResults = await db
.select()
.from(notes)
- .where(gt(notes.syncVersion, lastSyncVersion));
+ .where(gt(notes.syncVersion, lastSyncVersion))
+ .orderBy(notes.id);
pulledNotes = noteResults.filter((n) => deckIdList.includes(n.deckId));
}
@@ -973,7 +976,8 @@ export const syncRepository: SyncRepository = {
const fieldValueResults = await db
.select()
.from(noteFieldValues)
- .where(gt(noteFieldValues.syncVersion, lastSyncVersion));
+ .where(gt(noteFieldValues.syncVersion, lastSyncVersion))
+ .orderBy(noteFieldValues.id);
pulledNoteFieldValues = fieldValueResults.filter((fv) =>
allUserNoteIds.includes(fv.noteId),