diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js index 6c56dc99531..bff98dfe4dd 100644 --- a/spec/CloudCode.spec.js +++ b/spec/CloudCode.spec.js @@ -1211,6 +1211,7 @@ describe('beforeFind hooks', () => { expect(jsonQuery.include).toEqual('otherKey,otherValue'); expect(jsonQuery.limit).toEqual(100); expect(jsonQuery.skip).toBe(undefined); + expect(req.isGet).toEqual(false); }); const query = new Parse.Query('MyObject'); @@ -1305,6 +1306,34 @@ describe('beforeFind hooks', () => { done(); }); }); + + it('should add beforeFind trigger using get API',(done) => { + const hook = { + method: function(req) { + expect(req.isGet).toEqual(true); + return Promise.resolve(); + } + }; + spyOn(hook, 'method').and.callThrough(); + Parse.Cloud.beforeFind('MyObject', hook.method); + const obj = new Parse.Object('MyObject'); + obj.set('secretField', 'SSID'); + obj.save().then(function() { + rp({ + method: 'GET', + uri: 'http://localhost:8378/1/classes/MyObject/' + obj.id, + headers: { + 'X-Parse-Application-Id': 'test', + 'X-Parse-REST-API-Key': 'rest' + }, + json: true, + }).then(body => { + expect(body.secretField).toEqual('SSID'); + expect(hook.method).toHaveBeenCalled(); + done(); + }); + }); + }); }); describe('afterFind hooks', () => { diff --git a/src/rest.js b/src/rest.js index 2b4098fe063..220497fa0f1 100644 --- a/src/rest.js +++ b/src/rest.js @@ -37,9 +37,14 @@ function find(config, auth, className, restWhere, restOptions, clientSDK) { // get is just like find but only queries an objectId. const get = (config, auth, className, objectId, restOptions, clientSDK) => { + var restWhere = { objectId }; enforceRoleSecurity('get', className, auth); - const query = new RestQuery(config, auth, className, { objectId }, restOptions, clientSDK); - return query.execute(); + return triggers.maybeRunQueryTrigger(triggers.Types.beforeFind, className, restWhere, restOptions, config, auth, true).then((result) => { + restWhere = result.restWhere || restWhere; + restOptions = result.restOptions || restOptions; + const query = new RestQuery(config, auth, className, restWhere, restOptions, clientSDK); + return query.execute(); + }); } // Returns a promise that doesn't resolve to any useful value. diff --git a/src/triggers.js b/src/triggers.js index 5495f6c2240..42026b2b97c 100644 --- a/src/triggers.js +++ b/src/triggers.js @@ -155,13 +155,16 @@ export function getRequestObject(triggerType, auth, parseObject, originalParseOb return request; } -export function getRequestQueryObject(triggerType, auth, query, count, config) { +export function getRequestQueryObject(triggerType, auth, query, count, config, isGet) { + isGet = !!isGet; + var request = { triggerName: triggerType, query, master: false, count, - log: config.loggerController + log: config.loggerController, + isGet }; if (!auth) { @@ -286,7 +289,7 @@ export function maybeRunAfterFindTrigger(triggerType, auth, className, objects, }); } -export function maybeRunQueryTrigger(triggerType, className, restWhere, restOptions, config, auth) { +export function maybeRunQueryTrigger(triggerType, className, restWhere, restOptions, config, auth, isGet) { const trigger = getTrigger(className, triggerType, config.applicationId); if (!trigger) { return Promise.resolve({ @@ -312,7 +315,7 @@ export function maybeRunQueryTrigger(triggerType, className, restWhere, restOpti } count = !!restOptions.count; } - const requestObject = getRequestQueryObject(triggerType, auth, parseQuery, count, config); + const requestObject = getRequestQueryObject(triggerType, auth, parseQuery, count, config, isGet); return Promise.resolve().then(() => { return trigger(requestObject); }).then((result) => {