Skip to content

Commit 7e8bb1a

Browse files
committed
Include metadata and previous values in CRUD entry JSON
1 parent 10ab29e commit 7e8bb1a

File tree

3 files changed

+36
-11
lines changed

3 files changed

+36
-11
lines changed

.changeset/slimy-cougars-rush.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@powersync/common': patch
3+
---
4+
5+
Include metadata and previous values when serializing CRUD entries to JSON.

packages/common/src/client/sync/bucket/CrudEntry.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ type CrudEntryOutputJSON = {
4242
id: string;
4343
tx_id?: number;
4444
data?: Record<string, any>;
45+
old?: Record<string, any>;
46+
metadata?: string;
4547
};
4648

4749
/**
@@ -132,7 +134,9 @@ export class CrudEntry {
132134
type: this.table,
133135
id: this.id,
134136
tx_id: this.transactionId,
135-
data: this.opData
137+
data: this.opData,
138+
old: this.previousValues,
139+
metadata: this.metadata
136140
};
137141
}
138142

@@ -154,6 +158,15 @@ export class CrudEntry {
154158
* Generates an array for use in deep comparison operations
155159
*/
156160
toComparisonArray() {
157-
return [this.transactionId, this.clientId, this.op, this.table, this.id, this.opData];
161+
return [
162+
this.transactionId,
163+
this.clientId,
164+
this.op,
165+
this.table,
166+
this.id,
167+
this.opData,
168+
this.previousValues,
169+
this.metadata
170+
];
158171
}
159172
}

packages/node/tests/crud.test.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ databaseTest('include metadata', async ({ database }) => {
1414
});
1515
await database.updateSchema(schema);
1616
await database.execute('INSERT INTO lists (id, name, _metadata) VALUES (uuid(), ?, ?);', ['entry', 'so meta']);
17-
17+
1818
const batch = await database.getNextCrudTransaction();
1919
expect(batch?.crud[0].metadata).toBe('so meta');
20+
expect(JSON.stringify(batch?.crud[0])).toContain('"metadata":"so meta"');
2021
});
2122

2223
databaseTest('include old values', async ({ database }) => {
@@ -30,12 +31,18 @@ databaseTest('include old values', async ({ database }) => {
3031
)
3132
});
3233
await database.updateSchema(schema);
33-
await database.execute('INSERT INTO lists (id, name) VALUES (uuid(), ?);', ['entry']);
34+
await database.execute('INSERT INTO lists (id, name) VALUES (?, ?);', [
35+
'a185b7e1-dffa-4a9a-888c-15c0f0cac4b3',
36+
'entry'
37+
]);
3438
await database.execute('DELETE FROM ps_crud;');
3539
await database.execute('UPDATE lists SET name = ?', ['new name']);
36-
40+
3741
const batch = await database.getNextCrudTransaction();
38-
expect(batch?.crud[0].previousValues).toStrictEqual({name: 'entry'});
42+
expect(batch?.crud[0].previousValues).toStrictEqual({ name: 'entry' });
43+
expect(JSON.stringify(batch?.crud[0])).toBe(
44+
'{"op_id":2,"op":"PATCH","type":"lists","id":"a185b7e1-dffa-4a9a-888c-15c0f0cac4b3","tx_id":2,"data":{"name":"new name"},"old":{"name":"entry"}}'
45+
);
3946
});
4047

4148
databaseTest('include old values with column filter', async ({ database }) => {
@@ -53,9 +60,9 @@ databaseTest('include old values with column filter', async ({ database }) => {
5360
await database.execute('INSERT INTO lists (id, name, content) VALUES (uuid(), ?, ?);', ['name', 'content']);
5461
await database.execute('DELETE FROM ps_crud;');
5562
await database.execute('UPDATE lists SET name = ?, content = ?', ['new name', 'new content']);
56-
63+
5764
const batch = await database.getNextCrudTransaction();
58-
expect(batch?.crud[0].previousValues).toStrictEqual({name: 'name'});
65+
expect(batch?.crud[0].previousValues).toStrictEqual({ name: 'name' });
5966
});
6067

6168
databaseTest('include old values when changed', async ({ database }) => {
@@ -73,9 +80,9 @@ databaseTest('include old values when changed', async ({ database }) => {
7380
await database.execute('INSERT INTO lists (id, name, content) VALUES (uuid(), ?, ?);', ['name', 'content']);
7481
await database.execute('DELETE FROM ps_crud;');
7582
await database.execute('UPDATE lists SET name = ?', ['new name']);
76-
83+
7784
const batch = await database.getNextCrudTransaction();
78-
expect(batch?.crud[0].previousValues).toStrictEqual({name: 'name'});
85+
expect(batch?.crud[0].previousValues).toStrictEqual({ name: 'name' });
7986
});
8087

8188
databaseTest('ignore empty update', async ({ database }) => {
@@ -92,7 +99,7 @@ databaseTest('ignore empty update', async ({ database }) => {
9299
await database.execute('INSERT INTO lists (id, name) VALUES (uuid(), ?);', ['name']);
93100
await database.execute('DELETE FROM ps_crud;');
94101
await database.execute('UPDATE lists SET name = ?', ['name']);
95-
102+
96103
const batch = await database.getNextCrudTransaction();
97104
expect(batch).toBeNull();
98105
});

0 commit comments

Comments
 (0)