Skip to content

Commit 8fcead8

Browse files
committed
Fix dirtyKeys() and dirty(key:) on beforeSave when updating objects.
1 parent b1c2d9d commit 8fcead8

File tree

2 files changed

+52
-6
lines changed

2 files changed

+52
-6
lines changed

spec/ParseAPI.spec.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,47 @@ describe('miscellaneous', function() {
429429
});
430430
});
431431

432+
it('test beforeSave get dirtyKeys on update', function(done) {
433+
var triggerTime = 0;
434+
// Register a mock beforeSave hook
435+
Parse.Cloud.beforeSave('GameScore', function(req, res) {
436+
var object = req.object;
437+
expect(object instanceof Parse.Object).toBeTruthy();
438+
expect(object.get('fooAgain')).toEqual('barAgain');
439+
if (triggerTime == 0) {
440+
// Create
441+
expect(object.get('foo')).toEqual('bar');
442+
} else if (triggerTime == 1) {
443+
// Update
444+
expect(object.dirtyKeys()).toEqual(['foo']);
445+
expect(object.dirty('foo')).toBeTruthy();
446+
expect(object.get('foo')).toEqual('baz');
447+
} else {
448+
res.error();
449+
}
450+
triggerTime++;
451+
res.success();
452+
});
453+
454+
var obj = new Parse.Object('GameScore');
455+
obj.set('foo', 'bar');
456+
obj.set('fooAgain', 'barAgain');
457+
obj.save().then(function() {
458+
// We only update foo
459+
obj.set('foo', 'baz');
460+
return obj.save();
461+
}).then(function() {
462+
// Make sure the checking has been triggered
463+
expect(triggerTime).toBe(2);
464+
// Clear mock beforeSave
465+
delete Parse.Cloud.Triggers.beforeSave.GameScore;
466+
done();
467+
}, function(error) {
468+
fail(error);
469+
done();
470+
});
471+
});
472+
432473
it('test afterSave get full object on create and update', function(done) {
433474
var triggerTime = 0;
434475
// Register a mock beforeSave hook

src/RestWrite.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,18 +116,23 @@ RestWrite.prototype.runBeforeTrigger = function() {
116116
if (this.query && this.query.objectId) {
117117
extraData.objectId = this.query.objectId;
118118
}
119-
// Build the inflated object, for a create write, originalData is empty
120-
var inflatedObject = triggers.inflate(extraData, this.originalData);;
121-
inflatedObject._finishFetch(this.data);
122-
// Build the original object, we only do this for a update write
123-
var originalObject;
119+
120+
let originalObject = null;
121+
let updatedObject = null;
124122
if (this.query && this.query.objectId) {
123+
// This is an update for existing object.
125124
originalObject = triggers.inflate(extraData, this.originalData);
125+
updatedObject = triggers.inflate(extraData, this.originalData);
126+
updatedObject.set(Parse._decode(undefined, this.data));
127+
} else {
128+
// This is create of an object, so no original object exists.
129+
// TODO: (nlutsenko) Use the same flow as for creation, when _Session triggers support is removed.
130+
updatedObject = triggers.inflate(extraData, this.data);
126131
}
127132

128133
return Promise.resolve().then(() => {
129134
return triggers.maybeRunTrigger(
130-
'beforeSave', this.auth, inflatedObject, originalObject);
135+
'beforeSave', this.auth, updatedObject, originalObject);
131136
}).then((response) => {
132137
if (response && response.object) {
133138
this.data = response.object;

0 commit comments

Comments
 (0)