Skip to content

Commit defcde6

Browse files
committed
fixing suggested changes
1 parent cdb82b4 commit defcde6

File tree

3 files changed

+43
-45
lines changed

3 files changed

+43
-45
lines changed

spec/CloudCodeReadonlyTriggers.spec.js

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ describe('CloudCode ReadonlyTrigger tests', () => {
99
expect(sessionObject.get('sessionToken')).toBeDefined();
1010
expect(sessionObject.get('createdWith')).toBeDefined();
1111
expect(sessionObject.get('user')).toBeDefined();
12-
expect(sessionObject.get('user').toEqual(jasmine.any(Parse.User)));
12+
expect(sessionObject.get('user')).toEqual(jasmine.any(Parse.User));
1313
});
1414
try {
1515
// signup a user (internally creates a session)
@@ -18,7 +18,7 @@ describe('CloudCode ReadonlyTrigger tests', () => {
1818
user.setPassword('password');
1919
await user.signUp();
2020
} catch (error) {
21-
throw 'Should not have failed';
21+
throw error;
2222
}
2323
});
2424
it('readonly-beforeSave should disregard any changes', async () => {
@@ -45,36 +45,45 @@ describe('CloudCode ReadonlyTrigger tests', () => {
4545
expect(sessionObject.get('user').id).toBe(user.id);
4646
expect(sessionObject.get('sessionToken')).toBeDefined();
4747
});
48-
it('readonly-beforeSave should ignore any thrown errors during signup', async () => {
49-
const name = 'some username we dont like';
48+
it('readonly-beforeSave should not affect user creation flow during signup', async () => {
5049
let user;
5150
Parse.Cloud.beforeSave('_Session', async () => {
51+
// reject the session
5252
throw new Parse.Error(12345678, 'Sorry, we dont like this username');
5353
});
54+
Parse.Cloud.beforeSave('_User', async req => {
55+
// make sure this runs correctly
56+
req.object.set('firstName', 'abcd');
57+
});
58+
Parse.Cloud.afterSave('_User', async req => {
59+
if (req.object.has('lastName')) {
60+
return;
61+
}
62+
// make sure this runs correctly
63+
req.object.set('lastName', '1234');
64+
await req.object.save({}, { useMasterKey: true });
65+
});
5466
try {
5567
user = new Parse.User();
56-
user.setUsername(name);
57-
user.setPassword('password');
68+
user.setUsername('user-name');
69+
user.setPassword('user-password');
5870
await user.signUp();
5971
} catch (error) {
60-
throw 'Should not have failed';
72+
expect(error.code).toBe(12345678);
73+
expect(error.message).toBe('Sorry, we dont like this username');
6174
}
62-
// get the user
63-
const query = new Parse.Query('_User');
64-
query.equalTo('username', name);
65-
const createdUser = await query.first({
66-
useMasterKey: true,
67-
});
68-
expect(createdUser).toBeDefined();
75+
await delay(200); // just so that afterSave has time to run
76+
await user.fetch({ useMasterKey: true });
77+
expect(user.get('username')).toBe('user-name');
78+
expect(user.get('firstName')).toBe('abcd');
79+
expect(user.get('lastName')).toBe('1234');
6980
// get the session
7081
const query2 = new Parse.Query('_Session');
71-
query2.equalTo('user', createdUser);
82+
query2.equalTo('user', user);
7283
const sessionObject = await query2.first({
7384
useMasterKey: true,
7485
});
75-
expect(sessionObject).toBeDefined();
76-
expect(sessionObject.get('sessionToken')).toBeDefined();
77-
expect(sessionObject.get('sessionToken')).toBe(user.getSessionToken());
86+
expect(sessionObject).toBeUndefined();
7887
});
7988
it('readonly-beforeSave should fail and prevent login on throw', async () => {
8089
Parse.Cloud.beforeSave('_Session', async req => {

src/RestWrite.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,16 @@ RestWrite.prototype.createSessionToken = function() {
745745
this.response.response.sessionToken = sessionData.sessionToken;
746746
}
747747

748-
return createSession();
748+
return createSession().catch(e => {
749+
// we need to swallow the error during a signup
750+
// this is to make sure the .execute() chain continues normally for the user.
751+
// we dont need to kwow about any errors when signing a user up.
752+
if (!this.storage['authProvider']) {
753+
return Promise.resolve();
754+
}
755+
// on login proppagate errors
756+
throw e;
757+
});
749758
};
750759

751760
// Delete email reset tokens if user is changing password or email.

src/triggers.js

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,6 @@ export const Types = {
1111
afterFind: 'afterFind',
1212
};
1313

14-
const ReadOnlyTriggers = Object.freeze(['_Session']);
15-
16-
function isReadonlyTrigger(className) {
17-
return ReadOnlyTriggers.indexOf(className) > -1;
18-
}
19-
2014
const baseStore = function() {
2115
const Validators = {};
2216
const Functions = {};
@@ -37,10 +31,6 @@ const baseStore = function() {
3731
};
3832

3933
function validateClassNameForTriggers(className, type) {
40-
const restrictedClassNames = [];
41-
if (restrictedClassNames.indexOf(className) != -1) {
42-
throw `Triggers are not supported for ${className} class.`;
43-
}
4434
if (type == Types.beforeSave && className === '_PushStatus') {
4535
// _PushStatus uses undocumented nested key increment ops
4636
// allowing beforeSave would mess up the objects big time
@@ -253,7 +243,7 @@ export function getRequestQueryObject(
253243
// Any changes made to the object in a beforeSave will be included.
254244
export function getResponseObject(request, resolve, reject) {
255245
const className = request.object ? request.object.className : null;
256-
const isReadOnlyTrigger = isReadonlyTrigger(className);
246+
const isSessionTrigger = className === '_Session';
257247
return {
258248
success: function(response) {
259249
if (request.triggerName === Types.afterFind) {
@@ -265,8 +255,8 @@ export function getResponseObject(request, resolve, reject) {
265255
});
266256
return resolve(response);
267257
}
268-
// ignore edited object in readonly triggers
269-
if (isReadOnlyTrigger) {
258+
// ignore edited object in session triggers
259+
if (isSessionTrigger) {
270260
return resolve();
271261
}
272262
// Use the JSON response
@@ -284,19 +274,9 @@ export function getResponseObject(request, resolve, reject) {
284274
return resolve(response);
285275
},
286276
error: function(error) {
287-
// handle special readOnlyTriggers cases
288-
if (isReadOnlyTrigger) {
289-
// Ignore thrown errors in beforeDelete & during login.
290-
// We should prevent login from breaking if an error is thrown during the process,
291-
// this can be accomplished with beforeSave on users.
292-
if (
293-
request.triggerName === Types.beforeDelete ||
294-
(request.triggerName === Types.beforeSave &&
295-
request.object.className === '_Session' &&
296-
request.object.get('createdWith').action === 'signup')
297-
) {
298-
return resolve();
299-
}
277+
// ignore errors thrown in before-delete (during logout for example)
278+
if (isSessionTrigger && request.triggerName === Types.beforeDelete) {
279+
return resolve();
300280
}
301281
if (error instanceof Parse.Error) {
302282
reject(error);

0 commit comments

Comments
 (0)