From d537e109e54bbe0dbc186c98458f3c94d8a0fef9 Mon Sep 17 00:00:00 2001 From: dblythy Date: Fri, 4 Dec 2020 08:55:30 +1100 Subject: [PATCH 1/6] feat: include user in onLiveQueryEvent --- spec/ParseLiveQuery.spec.js | 29 ++++++++++++++++++++++++ src/LiveQuery/ParseLiveQueryServer.js | 1 + src/triggers.js | 32 ++++++++++++++++++++------- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js index dcbde3fb55..5c03fad5f8 100644 --- a/spec/ParseLiveQuery.spec.js +++ b/spec/ParseLiveQuery.spec.js @@ -6,6 +6,35 @@ const validatorFail = () => { }; describe('ParseLiveQuery', function () { + it('access user on onLiveQueryEvent disconnect', async done => { + await reconfigureServer({ + liveQuery: { + classNames: ['TestObject'], + }, + startLiveQueryServer: true, + verbose: false, + silent: true, + }); + const requestedUser = new Parse.User(); + requestedUser.setUsername('username'); + requestedUser.setPassword('password'); + Parse.Cloud.onLiveQueryEvent(async req => { + const { event, sessionToken, user } = req; + if (event === 'ws_disconnect') { + expect(user).toBeDefined(); + expect(user.id).toBe(requestedUser.id); + expect(user.get('username')).toBe('username'); + expect(sessionToken).toBeDefined(); + expect(sessionToken).toBe(requestedUser.getSessionToken()); + done(); + } + }); + await requestedUser.signUp(); + const query = new Parse.Query(TestObject); + await query.subscribe(); + const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient(); + client.close(); + }); it('can subscribe to query', async done => { await reconfigureServer({ liveQuery: { diff --git a/src/LiveQuery/ParseLiveQueryServer.js b/src/LiveQuery/ParseLiveQueryServer.js index fc31df46b8..0f00635cab 100644 --- a/src/LiveQuery/ParseLiveQueryServer.js +++ b/src/LiveQuery/ParseLiveQueryServer.js @@ -423,6 +423,7 @@ class ParseLiveQueryServer { subscriptions: this.subscriptions.size, useMasterKey: client.hasMasterKey, installationId: client.installationId, + sessionToken: client.sessionToken, }); }); diff --git a/src/triggers.js b/src/triggers.js index 1168fe1767..6d548c4194 100644 --- a/src/triggers.js +++ b/src/triggers.js @@ -845,10 +845,21 @@ export function inflate(data, restObject) { return Parse.Object.fromJSON(copy); } -export function runLiveQueryEventHandlers(data, applicationId = Parse.applicationId) { - if (!_triggerStore || !_triggerStore[applicationId] || !_triggerStore[applicationId].LiveQuery) { +export async function runLiveQueryEventHandlers(data, applicationId = Parse.applicationId) { + if ( + !_triggerStore || + !_triggerStore[applicationId] || + !_triggerStore[applicationId].LiveQuery || + _triggerStore[applicationId].LiveQuery.length == 0 + ) { return; } + if (data.sessionToken && !data.user) { + data.user = await userForSessionToken(data.sessionToken); + if (!data.user) { + data.sessionToken = undefined; + } + } _triggerStore[applicationId].LiveQuery.forEach(handler => handler(data)); } @@ -915,6 +926,9 @@ export async function maybeRunConnectTrigger(triggerType, request) { return; } request.user = await userForSessionToken(request.sessionToken); + if (!request.user) { + request.sessionToken = undefined; + } await maybeRunValidator(request, `${triggerType}.${ConnectClassName}`); if (request.skipWithMasterKey) { return; @@ -931,6 +945,9 @@ export async function maybeRunSubscribeTrigger(triggerType, className, request) parseQuery.withJSON(request.query); request.query = parseQuery; request.user = await userForSessionToken(request.sessionToken); + if (!request.user) { + request.sessionToken = undefined; + } await maybeRunValidator(request, `${triggerType}.${className}`); if (request.skipWithMasterKey) { return; @@ -955,6 +972,9 @@ export async function maybeRunAfterEventTrigger(triggerType, className, request) request.original = Parse.Object.fromJSON(request.original); } request.user = await userForSessionToken(request.sessionToken); + if (!request.user) { + request.sessionToken = undefined; + } await maybeRunValidator(request, `${triggerType}.${className}`); if (request.skipWithMasterKey) { return; @@ -968,14 +988,10 @@ async function userForSessionToken(sessionToken) { } const q = new Parse.Query('_Session'); q.equalTo('sessionToken', sessionToken); + q.include('user'); const session = await q.first({ useMasterKey: true }); if (!session) { return; } - const user = session.get('user'); - if (!user) { - return; - } - await user.fetch({ useMasterKey: true }); - return user; + return session.get('user'); } From c2864c5435dbe760cfc783984bd14a81f6061a26 Mon Sep 17 00:00:00 2001 From: dblythy Date: Fri, 4 Dec 2020 08:57:57 +1100 Subject: [PATCH 2/6] Update ParseLiveQuery.spec.js --- spec/ParseLiveQuery.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js index 5c03fad5f8..83bd92772d 100644 --- a/spec/ParseLiveQuery.spec.js +++ b/spec/ParseLiveQuery.spec.js @@ -18,7 +18,7 @@ describe('ParseLiveQuery', function () { const requestedUser = new Parse.User(); requestedUser.setUsername('username'); requestedUser.setPassword('password'); - Parse.Cloud.onLiveQueryEvent(async req => { + Parse.Cloud.onLiveQueryEvent(req => { const { event, sessionToken, user } = req; if (event === 'ws_disconnect') { expect(user).toBeDefined(); From 2b63f857a026ac6059764d7583b45beec266be5a Mon Sep 17 00:00:00 2001 From: dblythy Date: Fri, 4 Dec 2020 09:15:46 +1100 Subject: [PATCH 3/6] increase coverage --- spec/ParseLiveQuery.spec.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js index 83bd92772d..56aa6e29df 100644 --- a/spec/ParseLiveQuery.spec.js +++ b/spec/ParseLiveQuery.spec.js @@ -35,6 +35,33 @@ describe('ParseLiveQuery', function () { const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient(); client.close(); }); + it('remove user on onLiveQueryEvent after session token is deleted', async done => { + await reconfigureServer({ + liveQuery: { + classNames: ['TestObject'], + }, + startLiveQueryServer: true, + verbose: false, + silent: true, + }); + const requestedUser = new Parse.User(); + requestedUser.setUsername('username'); + requestedUser.setPassword('password'); + Parse.Cloud.onLiveQueryEvent(req => { + const { event, sessionToken, user } = req; + if (event === 'ws_disconnect') { + expect(user).toBe(undefined); + expect(sessionToken).toBe(undefined); + done(); + } + }); + await requestedUser.signUp(); + const query = new Parse.Query(TestObject); + await query.subscribe(); + await Parse.User.logOut(); + const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient(); + client.close(); + }); it('can subscribe to query', async done => { await reconfigureServer({ liveQuery: { From 1f065d721732a491696f964841e7e6e93e687b85 Mon Sep 17 00:00:00 2001 From: dblythy Date: Fri, 4 Dec 2020 09:22:59 +1100 Subject: [PATCH 4/6] add space --- spec/ParseLiveQuery.spec.js | 29 ++--------------------------- src/triggers.js | 12 ------------ 2 files changed, 2 insertions(+), 39 deletions(-) diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js index 56aa6e29df..6179ac4719 100644 --- a/spec/ParseLiveQuery.spec.js +++ b/spec/ParseLiveQuery.spec.js @@ -35,33 +35,7 @@ describe('ParseLiveQuery', function () { const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient(); client.close(); }); - it('remove user on onLiveQueryEvent after session token is deleted', async done => { - await reconfigureServer({ - liveQuery: { - classNames: ['TestObject'], - }, - startLiveQueryServer: true, - verbose: false, - silent: true, - }); - const requestedUser = new Parse.User(); - requestedUser.setUsername('username'); - requestedUser.setPassword('password'); - Parse.Cloud.onLiveQueryEvent(req => { - const { event, sessionToken, user } = req; - if (event === 'ws_disconnect') { - expect(user).toBe(undefined); - expect(sessionToken).toBe(undefined); - done(); - } - }); - await requestedUser.signUp(); - const query = new Parse.Query(TestObject); - await query.subscribe(); - await Parse.User.logOut(); - const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient(); - client.close(); - }); + it('can subscribe to query', async done => { await reconfigureServer({ liveQuery: { @@ -84,6 +58,7 @@ describe('ParseLiveQuery', function () { object.set({ foo: 'bar' }); await object.save(); }); + it('expect afterEvent create', async done => { await reconfigureServer({ liveQuery: { diff --git a/src/triggers.js b/src/triggers.js index 6d548c4194..fee5f1843d 100644 --- a/src/triggers.js +++ b/src/triggers.js @@ -856,9 +856,6 @@ export async function runLiveQueryEventHandlers(data, applicationId = Parse.appl } if (data.sessionToken && !data.user) { data.user = await userForSessionToken(data.sessionToken); - if (!data.user) { - data.sessionToken = undefined; - } } _triggerStore[applicationId].LiveQuery.forEach(handler => handler(data)); } @@ -926,9 +923,6 @@ export async function maybeRunConnectTrigger(triggerType, request) { return; } request.user = await userForSessionToken(request.sessionToken); - if (!request.user) { - request.sessionToken = undefined; - } await maybeRunValidator(request, `${triggerType}.${ConnectClassName}`); if (request.skipWithMasterKey) { return; @@ -945,9 +939,6 @@ export async function maybeRunSubscribeTrigger(triggerType, className, request) parseQuery.withJSON(request.query); request.query = parseQuery; request.user = await userForSessionToken(request.sessionToken); - if (!request.user) { - request.sessionToken = undefined; - } await maybeRunValidator(request, `${triggerType}.${className}`); if (request.skipWithMasterKey) { return; @@ -972,9 +963,6 @@ export async function maybeRunAfterEventTrigger(triggerType, className, request) request.original = Parse.Object.fromJSON(request.original); } request.user = await userForSessionToken(request.sessionToken); - if (!request.user) { - request.sessionToken = undefined; - } await maybeRunValidator(request, `${triggerType}.${className}`); if (request.skipWithMasterKey) { return; From 4ae439d9126c60f461734bd30dd7d84fcb053d45 Mon Sep 17 00:00:00 2001 From: dblythy Date: Fri, 4 Dec 2020 09:35:02 +1100 Subject: [PATCH 5/6] Update ParseLiveQuery.spec.js --- spec/ParseLiveQuery.spec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js index 6179ac4719..929c396bc3 100644 --- a/spec/ParseLiveQuery.spec.js +++ b/spec/ParseLiveQuery.spec.js @@ -573,7 +573,6 @@ describe('ParseLiveQuery', function () { expect(req.useMasterKey).toBe(false); expect(req.installationId).toBeDefined(); expect(req.user).toBeUndefined(); - expect(req.sessionToken).toBeUndefined(); expect(req.client).toBeDefined(); }); const query = new Parse.Query(TestObject); From 371abdac76daea78f466973d2ea12dcbd02292dd Mon Sep 17 00:00:00 2001 From: dblythy Date: Fri, 4 Dec 2020 09:56:14 +1100 Subject: [PATCH 6/6] remove user from runLiveQueryEventHandlers --- spec/ParseLiveQuery.spec.js | 5 +---- src/triggers.js | 12 ++---------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/spec/ParseLiveQuery.spec.js b/spec/ParseLiveQuery.spec.js index 929c396bc3..be2da8c866 100644 --- a/spec/ParseLiveQuery.spec.js +++ b/spec/ParseLiveQuery.spec.js @@ -19,11 +19,8 @@ describe('ParseLiveQuery', function () { requestedUser.setUsername('username'); requestedUser.setPassword('password'); Parse.Cloud.onLiveQueryEvent(req => { - const { event, sessionToken, user } = req; + const { event, sessionToken } = req; if (event === 'ws_disconnect') { - expect(user).toBeDefined(); - expect(user.id).toBe(requestedUser.id); - expect(user.get('username')).toBe('username'); expect(sessionToken).toBeDefined(); expect(sessionToken).toBe(requestedUser.getSessionToken()); done(); diff --git a/src/triggers.js b/src/triggers.js index fee5f1843d..eeb86c8369 100644 --- a/src/triggers.js +++ b/src/triggers.js @@ -845,18 +845,10 @@ export function inflate(data, restObject) { return Parse.Object.fromJSON(copy); } -export async function runLiveQueryEventHandlers(data, applicationId = Parse.applicationId) { - if ( - !_triggerStore || - !_triggerStore[applicationId] || - !_triggerStore[applicationId].LiveQuery || - _triggerStore[applicationId].LiveQuery.length == 0 - ) { +export function runLiveQueryEventHandlers(data, applicationId = Parse.applicationId) { + if (!_triggerStore || !_triggerStore[applicationId] || !_triggerStore[applicationId].LiveQuery) { return; } - if (data.sessionToken && !data.user) { - data.user = await userForSessionToken(data.sessionToken); - } _triggerStore[applicationId].LiveQuery.forEach(handler => handler(data)); }