Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions spec/CloudCode.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,61 @@ describe('Cloud Code', () => {
}
});

it('beforeFind can short circuit', async () => {
Parse.Cloud.beforeFind('beforeFind', () => {
return new Parse.Object('TestObject', { foo: 'bar' });
});
Parse.Cloud.afterFind('beforeFind', () => {
throw 'afterFind should not run';
});
const obj = new Parse.Object('beforeFind');
await obj.save();
const newObj = await new Parse.Query('beforeFind').first();
expect(newObj.className).toBe('TestObject');
expect(newObj.toJSON()).toEqual({ foo: 'bar' });
});

it('beforeFind can short circuit arrays', async () => {
Parse.Cloud.beforeFind('beforeFind', () => {
return [new Parse.Object('TestObject', { foo: 'bar' })];
});
Parse.Cloud.afterFind('beforeFind', () => {
throw 'afterFind should not run';
});
const obj = new Parse.Object('beforeFind');
await obj.save();
const newObj = await new Parse.Query('beforeFind').first();
expect(newObj.className).toBe('TestObject');
expect(newObj.toJSON()).toEqual({ foo: 'bar' });
});

it('beforeFind can short circuit get', async () => {
Parse.Cloud.beforeFind('beforeFind', () => {
return [new Parse.Object('TestObject', { foo: 'bar' })];
});
Parse.Cloud.afterFind('beforeFind', () => {
throw 'afterFind should not run';
});
const obj = new Parse.Object('beforeFind');
await obj.save();
const newObj = await new Parse.Query('beforeFind').get(obj.id);
expect(newObj.className).toBe('TestObject');
expect(newObj.toJSON()).toEqual({ foo: 'bar' });
});

it('beforeFind can short circuit empty array', async () => {
Parse.Cloud.beforeFind('beforeFind', () => {
return [];
});
Parse.Cloud.afterFind('beforeFind', () => {
throw 'afterFind should not run';
});
const obj = new Parse.Object('beforeFind');
await obj.save();
const newObj = await new Parse.Query('beforeFind').first();
expect(newObj).toBeUndefined();
});

it('beforeSave rejection with custom error code', function (done) {
Parse.Cloud.beforeSave('BeforeSaveFailWithErrorCode', function () {
throw new Parse.Error(999, 'Nope');
Expand Down
10 changes: 10 additions & 0 deletions src/rest.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ function find(config, auth, className, restWhere, restOptions, clientSDK, contex
.then(result => {
restWhere = result.restWhere || restWhere;
restOptions = result.restOptions || restOptions;
if (result?.objects) {
return {
results: result.objects.map(row => row._toFullJSON()),
};
}
const query = new RestQuery(
config,
auth,
Expand Down Expand Up @@ -71,6 +76,11 @@ const get = (config, auth, className, objectId, restOptions, clientSDK, context)
.then(result => {
restWhere = result.restWhere || restWhere;
restOptions = result.restOptions || restOptions;
if (result?.objects) {
return {
results: result.objects.map(row => row._toFullJSON()),
};
}
const query = new RestQuery(
config,
auth,
Expand Down
10 changes: 10 additions & 0 deletions src/triggers.js
Original file line number Diff line number Diff line change
Expand Up @@ -586,9 +586,19 @@ export function maybeRunQueryTrigger(
restOptions = restOptions || {};
restOptions.subqueryReadPreference = requestObject.subqueryReadPreference;
}
let objects = undefined;
if (result instanceof Parse.Object) {
objects = [result];
} else if (
Array.isArray(result) &&
(!result.length || result.some(obj => obj instanceof Parse.Object))
) {
objects = result;
}
return {
restWhere,
restOptions,
objects,
};
},
err => {
Expand Down