From c19180c141db3485ac1c226eb8cbdfa984fcb4c2 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Fri, 22 Nov 2019 19:25:03 -0600 Subject: [PATCH 1/2] beforeFind: Improve request.query object Closes: https://github.com/parse-community/parse-server/issues/6164 --- spec/CloudCode.spec.js | 16 +++++++++++++++- src/triggers.js | 16 ++++------------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js index d9a6be30f9..8dc93cdff5 100644 --- a/spec/CloudCode.spec.js +++ b/spec/CloudCode.spec.js @@ -878,7 +878,10 @@ describe('Cloud Code', () => { url: 'https://some.url', }), array: ['a', 'b', 'c'], - arrayOfArray: [['a', 'b', 'c'], ['d', 'e', 'f']], + arrayOfArray: [ + ['a', 'b', 'c'], + ['d', 'e', 'f'], + ], }; Parse.Cloud.run('params', params).then(() => { done(); @@ -1763,8 +1766,15 @@ describe('beforeFind hooks', () => { expect(jsonQuery.where.key).toEqual('value'); expect(jsonQuery.where.some).toEqual({ $gt: 10 }); expect(jsonQuery.include).toEqual('otherKey,otherValue'); + expect(jsonQuery.excludeKeys).toBe('exclude'); expect(jsonQuery.limit).toEqual(100); expect(jsonQuery.skip).toBe(undefined); + expect(jsonQuery.order).toBe('key'); + expect(jsonQuery.keys).toBe('select'); + expect(jsonQuery.readPreference).toBe('PRIMARY'); + expect(jsonQuery.includeReadPreference).toBe('SECONDARY'); + expect(jsonQuery.subqueryReadPreference).toBe('SECONDARY_PREFERRED'); + expect(req.isGet).toEqual(false); }); @@ -1773,6 +1783,10 @@ describe('beforeFind hooks', () => { query.greaterThan('some', 10); query.include('otherKey'); query.include('otherValue'); + query.ascending('key'); + query.select('select'); + query.exclude('exclude'); + query.readPreference('PRIMARY', 'SECONDARY', 'SECONDARY_PREFERRED'); query.find().then(() => { done(); }); diff --git a/src/triggers.js b/src/triggers.js index 85108a4225..93313827af 100644 --- a/src/triggers.js +++ b/src/triggers.js @@ -451,22 +451,14 @@ export function maybeRunQueryTrigger( restOptions, }); } + const json = Object.assign({}, restOptions); + json.where = restWhere; const parseQuery = new Parse.Query(className); - if (restWhere) { - parseQuery._where = restWhere; - } + parseQuery.withJSON(json); + let count = false; if (restOptions) { - if (restOptions.include && restOptions.include.length > 0) { - parseQuery._include = restOptions.include.split(','); - } - if (restOptions.skip) { - parseQuery._skip = restOptions.skip; - } - if (restOptions.limit) { - parseQuery._limit = restOptions.limit; - } count = !!restOptions.count; } const requestObject = getRequestQueryObject( From e7a30a291790f0cff2b5142ecfd84a67a9f40fb1 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Fri, 22 Nov 2019 19:54:14 -0600 Subject: [PATCH 2/2] can modify exclude query --- spec/CloudCode.spec.js | 19 +++++++++++++++++++ src/triggers.js | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js index 8dc93cdff5..eb80c986f2 100644 --- a/spec/CloudCode.spec.js +++ b/spec/CloudCode.spec.js @@ -1838,6 +1838,25 @@ describe('beforeFind hooks', () => { }); }); + it('should use the modified exclude query', async () => { + Parse.Cloud.beforeFind('MyObject', req => { + const q = req.query; + q.exclude('number'); + }); + + const obj = new Parse.Object('MyObject'); + obj.set('number', 100); + obj.set('string', 'hello'); + await obj.save(); + + const query = new Parse.Query('MyObject'); + query.equalTo('objectId', obj.id); + const results = await query.find(); + expect(results.length).toBe(1); + expect(results[0].get('number')).toBeUndefined(); + expect(results[0].get('string')).toBe('hello'); + }); + it('should reject queries', done => { Parse.Cloud.beforeFind('MyObject', () => { return Promise.reject('Do not run that query'); diff --git a/src/triggers.js b/src/triggers.js index 93313827af..b340a4619c 100644 --- a/src/triggers.js +++ b/src/triggers.js @@ -495,6 +495,10 @@ export function maybeRunQueryTrigger( restOptions = restOptions || {}; restOptions.include = jsonQuery.include; } + if (jsonQuery.excludeKeys) { + restOptions = restOptions || {}; + restOptions.excludeKeys = jsonQuery.excludeKeys; + } if (jsonQuery.keys) { restOptions = restOptions || {}; restOptions.keys = jsonQuery.keys;