From 08744f966ae566e237bd51fc112b78f067f00405 Mon Sep 17 00:00:00 2001 From: dblythy Date: Thu, 20 Aug 2020 01:16:42 +1000 Subject: [PATCH 1/2] Fix beforeSubscribe --- spec/ParseLiveQuery.spec.js | 89 +++++++++++++++++++++++++++++++++++++ src/triggers.js | 7 ++- 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js index 80eebaa733..baa335bd57 100644 --- a/spec/ParseLiveQuery.spec.js +++ b/spec/ParseLiveQuery.spec.js @@ -115,6 +115,95 @@ describe('ParseLiveQuery', function () { }); }); + it('can handle mutate beforeSubscribe query', async done => { + await reconfigureServer({ + liveQuery: { + classNames: ['TestObject'], + }, + startLiveQueryServer: true, + verbose: false, + silent: true, + }); + Parse.Cloud.beforeSubscribe(TestObject, request => { + const query = request.query; + query.equalTo('yolo', 'abc'); + }); + + const object = new TestObject(); + await object.save(); + + const query = new Parse.Query(TestObject); + query.equalTo('objectId', object.id); + const subscription = await query.subscribe(); + + subscription.on('update', () => { + fail(); + }); + object.set({ foo: 'bar' }); + await object.save(); + setTimeout(async () => { + done(); + }, 1000); + }); + + it('can return a new beforeSubscribe query', async done => { + await reconfigureServer({ + liveQuery: { + classNames: ['TestObject'], + }, + startLiveQueryServer: true, + verbose: false, + silent: true, + }); + Parse.Cloud.beforeSubscribe(TestObject, () => { + const query = new Parse.Query(TestObject); + query.equalTo('foo', 'yolo'); + return query; + }); + + const query = new Parse.Query(TestObject); + query.equalTo('foo', 'bar'); + const subscription = await query.subscribe(); + + subscription.on('create', object => { + expect(object.get('foo')).toBe('yolo'); + done(); + }); + const object = new TestObject(); + object.set({ foo: 'yolo' }); + await object.save(); + }); + + it('can handle select beforeSubscribe query', async done => { + await reconfigureServer({ + liveQuery: { + classNames: ['TestObject'], + }, + startLiveQueryServer: true, + verbose: false, + silent: true, + }); + Parse.Cloud.beforeSubscribe(TestObject, request => { + const query = request.query; + query.select('yolo'); + }); + + const object = new TestObject(); + await object.save(); + + const query = new Parse.Query(TestObject); + query.equalTo('objectId', object.id); + const subscription = await query.subscribe(); + + subscription.on('update', object => { + expect(object.get('foo')).toBeUndefined(); + expect(object.get('yolo')).toBe('abc'); + done(); + }); + object.set({ foo: 'bar', yolo: 'abc' }); + await object.save(); + }); + it('handle invalid websocket payload length', async done => { await reconfigureServer({ liveQuery: { diff --git a/src/triggers.js b/src/triggers.js index 96dcb65e47..3850ef40c5 100644 --- a/src/triggers.js +++ b/src/triggers.js @@ -794,7 +794,12 @@ export async function maybeRunSubscribeTrigger( parseQuery.withJSON(request.query); request.query = parseQuery; request.user = await userForSessionToken(request.sessionToken); - return trigger(request); + const result = (await trigger(request)) || request.query; + const query = result.toJSON(); + if (query.keys) { + query.fields = query.keys.split(','); + } + request.query = query; } async function userForSessionToken(sessionToken) { From 31bbbf2ae4f185fbb0308f65ebe8fa4b3ab275ff Mon Sep 17 00:00:00 2001 From: dblythy Date: Thu, 20 Aug 2020 20:13:50 +1000 Subject: [PATCH 2/2] Remove return value --- spec/ParseLiveQuery.spec.js | 4 ++-- src/triggers.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js index baa335bd57..5e2321229f 100644 --- a/spec/ParseLiveQuery.spec.js +++ b/spec/ParseLiveQuery.spec.js @@ -155,10 +155,10 @@ describe('ParseLiveQuery', function () { verbose: false, silent: true, }); - Parse.Cloud.beforeSubscribe(TestObject, () => { + Parse.Cloud.beforeSubscribe(TestObject, request => { const query = new Parse.Query(TestObject); query.equalTo('foo', 'yolo'); - return query; + request.query = query; }); const query = new Parse.Query(TestObject); diff --git a/src/triggers.js b/src/triggers.js index 3850ef40c5..de9856841e 100644 --- a/src/triggers.js +++ b/src/triggers.js @@ -794,8 +794,8 @@ export async function maybeRunSubscribeTrigger( parseQuery.withJSON(request.query); request.query = parseQuery; request.user = await userForSessionToken(request.sessionToken); - const result = (await trigger(request)) || request.query; - const query = result.toJSON(); + await trigger(request); + const query = request.query.toJSON(); if (query.keys) { query.fields = query.keys.split(','); }