diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-12-31 20:34:27 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-12-31 20:34:27 +0900 |
| commit | e3a84df9fcae8f25c8ea1d527638c2bfaafb942e (patch) | |
| tree | 605f909c78e8b4510b7110d57749c1c0fe566360 /src/server/repositories/sync.ts | |
| parent | b69fd1353c449baa3262016c2bb8f653932bd932 (diff) | |
| download | kioku-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.ts | 12 |
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), |
