Skip to content

Commit

Permalink
fix: Cloud Code trigger beforeSave does not work with Parse.Role (p…
Browse files Browse the repository at this point in the history
  • Loading branch information
dblythy authored Nov 19, 2022
1 parent 4b1d46f commit f29d972
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 8 deletions.
16 changes: 16 additions & 0 deletions spec/CloudCode.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1558,6 +1558,22 @@ describe('Cloud Code', () => {
expect(obj.get('foo')).toBe('bar');
});

it('create role with name and ACL and a beforeSave', async () => {
Parse.Cloud.beforeSave(Parse.Role, ({ object }) => {
return object;
});

const obj = new Parse.Role('TestRole', new Parse.ACL({ '*': { read: true, write: true } }));
await obj.save();

expect(obj.getACL()).toEqual(new Parse.ACL({ '*': { read: true, write: true } }));
expect(obj.get('name')).toEqual('TestRole');
await obj.fetch();

expect(obj.getACL()).toEqual(new Parse.ACL({ '*': { read: true, write: true } }));
expect(obj.get('name')).toEqual('TestRole');
});

it('can unset in afterSave', async () => {
Parse.Cloud.beforeSave('TestObject', ({ object }) => {
if (!object.existed()) {
Expand Down
21 changes: 13 additions & 8 deletions src/RestWrite.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,10 @@ function RestWrite(config, auth, className, query, data, originalData, clientSDK
// Shared SchemaController to be reused to reduce the number of loadSchema() calls per request
// Once set the schemaData should be immutable
this.validSchemaController = null;
this.pendingOps = {};
this.pendingOps = {
operations: null,
identifier: null,
};
}

// A convenient method to perform all the steps of processing the
Expand Down Expand Up @@ -227,10 +230,13 @@ RestWrite.prototype.runBeforeSaveTrigger = function () {
}

const { originalObject, updatedObject } = this.buildParseObjects();

const identifier = updatedObject._getStateIdentifier();
const stateController = Parse.CoreManager.getObjectStateController();
const [pending] = stateController.getPendingOps(updatedObject._getStateIdentifier());
this.pendingOps = { ...pending };
const [pending] = stateController.getPendingOps(identifier);
this.pendingOps = {
operations: { ...pending },
identifier,
};

return Promise.resolve()
.then(() => {
Expand Down Expand Up @@ -1586,7 +1592,7 @@ RestWrite.prototype.runAfterSaveTrigger = function () {
.then(result => {
const jsonReturned = result && !result._toFullJSON;
if (jsonReturned) {
this.pendingOps = {};
this.pendingOps.operations = {};
this.response.response = result;
} else {
this.response.response = this._updateResponseWithData(
Expand Down Expand Up @@ -1690,10 +1696,9 @@ RestWrite.prototype.cleanUserAuthData = function () {
};

RestWrite.prototype._updateResponseWithData = function (response, data) {
const { updatedObject } = this.buildParseObjects();
const stateController = Parse.CoreManager.getObjectStateController();
const [pending] = stateController.getPendingOps(updatedObject._getStateIdentifier());
for (const key in this.pendingOps) {
const [pending] = stateController.getPendingOps(this.pendingOps.identifier);
for (const key in this.pendingOps.operations) {
if (!pending[key]) {
data[key] = this.originalData ? this.originalData[key] : { __op: 'Delete' };
this.storage.fieldsChangedByTrigger.push(key);
Expand Down

0 comments on commit f29d972

Please sign in to comment.