From 8d168dc330c3ff9f11dbdaceea9f330e9668da0d Mon Sep 17 00:00:00 2001 From: Henry Heino <46334387+personalizedrefrigerator@users.noreply.github.com> Date: Thu, 12 Mar 2026 05:22:26 -0700 Subject: [PATCH] Server: Fix delta API can return changes in wrong order (#14713) --- packages/server/src/models/ChangeModel.test.ts | 10 +++++----- packages/server/src/models/ChangeModel.ts | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/server/src/models/ChangeModel.test.ts b/packages/server/src/models/ChangeModel.test.ts index 4155bee714..a1fb7b59a7 100644 --- a/packages/server/src/models/ChangeModel.test.ts +++ b/packages/server/src/models/ChangeModel.test.ts @@ -51,17 +51,17 @@ describe('ChangeModel', () => { expect(allUncompressedChanges.length).toBe(8); { - // When we get all the changes, we get DELETE 1, CREATE 2, and CREATE 3: + // When we get all the changes, we get CREATE 2, DELETE 1, and CREATE 3: // - We don't get CREATE 1 since CREATE 1 -> DELETE 1 was compressed to // DELETE 1. // - We don't get any UPDATE event since they've been compressed // down to the CREATE events. const changes = (await changeModel.delta(user.id)).items; expect(changes.length).toBe(3); - expect(changes[0].item_id).toBe(item1.id); - expect(changes[0].type).toBe(ChangeType.Delete); - expect(changes[1].item_id).toBe(item2.id); - expect(changes[1].type).toBe(ChangeType.Create); + expect(changes[0].item_id).toBe(item2.id); + expect(changes[0].type).toBe(ChangeType.Create); + expect(changes[1].item_id).toBe(item1.id); + expect(changes[1].type).toBe(ChangeType.Delete); expect(changes[2].item_id).toBe(item3.id); expect(changes[2].type).toBe(ChangeType.Create); } diff --git a/packages/server/src/models/ChangeModel.ts b/packages/server/src/models/ChangeModel.ts index e166b2f569..a04afef6d2 100644 --- a/packages/server/src/models/ChangeModel.ts +++ b/packages/server/src/models/ChangeModel.ts @@ -282,10 +282,6 @@ export default class ChangeModel extends BaseModel { // returns the rows directly; const output: Change[] = results.rows ? results.rows : results; - // This property is present only for the purpose of ordering the results - // and can be removed afterwards. - for (const change of output) delete change.counter; - return output; } @@ -324,6 +320,10 @@ export default class ChangeModel extends BaseModel { return deltaChange; }); + // This property is present only for the purpose of ordering the results + // and can be removed afterwards. + for (const change of finalChanges) delete change.counter; + return { items: finalChanges, // If we have changes, we return the ID of the latest changes from which delta sync can resume.