From e1c475512c60931cb7c6a69f2e2624ba68a6e504 Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Wed, 16 Mar 2016 23:48:52 -0400 Subject: [PATCH] Returns updated keys when running with beforeSave --- spec/ParseAPI.spec.js | 13 ++++++++++ src/Controllers/DatabaseController.js | 34 +++++++++++++++++---------- src/RestWrite.js | 17 ++++++++++---- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/spec/ParseAPI.spec.js b/spec/ParseAPI.spec.js index 4cf3f7a5..0edcc2f4 100644 --- a/spec/ParseAPI.spec.js +++ b/spec/ParseAPI.spec.js @@ -224,6 +224,19 @@ describe('miscellaneous', function() { }); }); + it('test beforeSave returns value on create and update', (done) => { + var obj = new Parse.Object('BeforeSaveChanged'); + obj.set('foo', 'bing'); + obj.save().then(() => { + expect(obj.get('foo')).toEqual('baz'); + obj.set('foo', 'bar'); + return obj.save().then(() => { + expect(obj.get('foo')).toEqual('baz'); + done(); + }) + }) + }); + it('test afterSave ran and created an object', function(done) { var obj = new Parse.Object('AfterSaveTest'); obj.save(); diff --git a/src/Controllers/DatabaseController.js b/src/Controllers/DatabaseController.js index 51f18811..7494cc88 100644 --- a/src/Controllers/DatabaseController.js +++ b/src/Controllers/DatabaseController.js @@ -179,21 +179,27 @@ DatabaseController.prototype.update = function(className, query, update, options return Promise.reject(new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Object not found.')); } - - let response = {}; - Object.keys(originalUpdate).forEach(key => { - let keyUpdate = originalUpdate[key]; - // determine if that was an op - if (keyUpdate && typeof keyUpdate === 'object' && keyUpdate.__op - && ['Add', 'AddUnique', 'Remove', 'Increment'].indexOf(keyUpdate.__op) > -1) { - // only valid ops that produce an actionable result - response[key] = result[key]; - } - }); - return response; + return sanitizeDatabaseResult(originalUpdate, result); }); }; +function sanitizeDatabaseResult(originalObject, result) { + let response = {}; + if (!result) { + return Promise.resolve(response); + } + Object.keys(originalObject).forEach(key => { + let keyUpdate = originalObject[key]; + // determine if that was an op + if (keyUpdate && typeof keyUpdate === 'object' && keyUpdate.__op + && ['Add', 'AddUnique', 'Remove', 'Increment'].indexOf(keyUpdate.__op) > -1) { + // only valid ops that produce an actionable result + response[key] = result[key]; + } + }); + return Promise.resolve(response); +} + // Processes relation-updating operations from a REST-format update. // Returns a promise that resolves successfully when these are // processed. @@ -318,6 +324,7 @@ DatabaseController.prototype.destroy = function(className, query, options = {}) // Returns a promise that resolves successfully iff the object saved. DatabaseController.prototype.create = function(className, object, options) { // Make a copy of the object, so we don't mutate the incoming data. + let originalObject = object; object = deepcopy(object); var schema; @@ -338,6 +345,9 @@ DatabaseController.prototype.create = function(className, object, options) { .then(coll => { var mongoObject = transform.transformCreate(schema, className, object); return coll.insertOne(mongoObject); + }) + .then(result => { + return sanitizeDatabaseResult(originalObject, result.ops[0]); }); }; diff --git a/src/RestWrite.js b/src/RestWrite.js index e241a988..e0f1f5d5 100644 --- a/src/RestWrite.js +++ b/src/RestWrite.js @@ -711,6 +711,12 @@ RestWrite.prototype.runDatabaseOperation = function() { return this.config.database.update( this.className, this.query, this.data, this.runOptions).then((resp) => { resp.updatedAt = this.updatedAt; + if (this.storage['changedByTrigger']) { + resp = Object.keys(this.data).reduce((memo, key) => { + memo[key] = resp[key] || this.data[key]; + return memo; + }, resp); + } this.response = { response: resp }; @@ -725,13 +731,16 @@ RestWrite.prototype.runDatabaseOperation = function() { } // Run a create return this.config.database.create(this.className, this.data, this.runOptions) - .then(() => { - var resp = { + .then((resp) => { + Object.assign(resp, { objectId: this.data.objectId, createdAt: this.data.createdAt - }; + }); if (this.storage['changedByTrigger']) { - Object.assign(resp, this.data); + resp = Object.keys(this.data).reduce((memo, key) => { + memo[key] = resp[key] || this.data[key]; + return memo; + }, resp); } if (this.storage['token']) { resp.sessionToken = this.storage['token'];