Skip to content

Commit 1053adf

Browse files
committed
Merge pull request #784 from ParsePlatform/nlutsenko.afterSave
Flatten custom operations in request.object in afterSave hooks.
2 parents 2cc9600 + 358a7ae commit 1053adf

File tree

3 files changed

+60
-8
lines changed

3 files changed

+60
-8
lines changed

spec/OneSignalPushAdapter.spec.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
'use strict';
12

23
var OneSignalPushAdapter = require('../src/Adapters/Push/OneSignalPushAdapter');
34
var classifyInstallations = require('../src/Adapters/Push/PushAdapterUtils').classifyInstallations;
@@ -210,7 +211,7 @@ describe('OneSignalPushAdapter', () => {
210211
expect(write).toHaveBeenCalled();
211212

212213
// iOS
213-
args = write.calls.first().args;
214+
let args = write.calls.first().args;
214215
expect(args[0]).toEqual(JSON.stringify({
215216
'contents': { 'en':'Example content'},
216217
'content_available':true,
@@ -219,7 +220,7 @@ describe('OneSignalPushAdapter', () => {
219220
'app_id':'APP ID'
220221
}));
221222

222-
// Android
223+
// Android
223224
args = write.calls.mostRecent().args;
224225
expect(args[0]).toEqual(JSON.stringify({
225226
'contents': { 'en':'Example content'},

spec/ParseAPI.spec.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,46 @@ describe('miscellaneous', function() {
692692
});
693693
});
694694

695+
it('afterSave flattens custom operations', done => {
696+
var triggerTime = 0;
697+
// Register a mock beforeSave hook
698+
Parse.Cloud.afterSave('GameScore', function(req, res) {
699+
let object = req.object;
700+
expect(object instanceof Parse.Object).toBeTruthy();
701+
let originalObject = req.original;
702+
if (triggerTime == 0) {
703+
// Create
704+
expect(object.get('yolo')).toEqual(1);
705+
} else if (triggerTime == 1) {
706+
// Update
707+
expect(object.get('yolo')).toEqual(2);
708+
// Check the originalObject
709+
expect(originalObject.get('yolo')).toEqual(1);
710+
} else {
711+
res.error();
712+
}
713+
triggerTime++;
714+
res.success();
715+
});
716+
717+
var obj = new Parse.Object('GameScore');
718+
obj.increment('yolo', 1);
719+
obj.save().then(() => {
720+
obj.increment('yolo', 1);
721+
return obj.save();
722+
}).then(() => {
723+
// Make sure the checking has been triggered
724+
expect(triggerTime).toBe(2);
725+
// Clear mock afterSave
726+
Parse.Cloud._removeHook("Triggers", "afterSave", "GameScore");
727+
done();
728+
}, error => {
729+
console.error(error);
730+
fail(error);
731+
done();
732+
});
733+
});
734+
695735
it('test cloud function error handling', (done) => {
696736
// Register a function which will fail
697737
Parse.Cloud.define('willFail', (req, res) => {

src/RestWrite.js

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -816,22 +816,33 @@ RestWrite.prototype.runDatabaseOperation = function() {
816816

817817
// Returns nothing - doesn't wait for the trigger.
818818
RestWrite.prototype.runAfterTrigger = function() {
819+
if (!this.response || !this.response.response) {
820+
return;
821+
}
822+
823+
// Avoid doing any setup for triggers if there is no 'afterSave' trigger for this class.
824+
if (!triggers.triggerExists(this.className, triggers.Types.afterSave, this.config.applicationId)) {
825+
return Promise.resolve();
826+
}
827+
819828
var extraData = {className: this.className};
820829
if (this.query && this.query.objectId) {
821830
extraData.objectId = this.query.objectId;
822831
}
823832

824-
// Build the inflated object, different from beforeSave, originalData is not empty
825-
// since developers can change data in the beforeSave.
826-
var inflatedObject = triggers.inflate(extraData, this.originalData);
827-
inflatedObject._finishFetch(this.data);
828833
// Build the original object, we only do this for a update write.
829-
var originalObject;
834+
let originalObject;
830835
if (this.query && this.query.objectId) {
831836
originalObject = triggers.inflate(extraData, this.originalData);
832837
}
833838

834-
triggers.maybeRunTrigger(triggers.Types.afterSave, this.auth, inflatedObject, originalObject, this.config.applicationId);
839+
// Build the inflated object, different from beforeSave, originalData is not empty
840+
// since developers can change data in the beforeSave.
841+
let updatedObject = triggers.inflate(extraData, this.originalData);
842+
updatedObject.set(Parse._decode(undefined, this.data));
843+
updatedObject._handleSaveResponse(this.response.response, this.response.status || 200);
844+
845+
triggers.maybeRunTrigger(triggers.Types.afterSave, this.auth, updatedObject, originalObject, this.config.applicationId);
835846
};
836847

837848
// A helper to figure out what location this operation happens at.

0 commit comments

Comments
 (0)