added afterLogout trigger (#6217)

* added afterLogout trigger

* added verification of session object in tests

* removed obsolete code

* removed unsued code

* improved tests to verify user ID
This commit is contained in:
Manuel Trezza
2019-11-16 04:52:57 +01:00
committed by Diamond Lewis
parent 5cfaaf059a
commit 5ed0885440
5 changed files with 114 additions and 6 deletions

View File

@@ -302,6 +302,7 @@ export class UsersRouter extends ClassesRouter {
records.results[0].objectId
)
.then(() => {
this._runAfterLogoutTrigger(req, records.results[0]);
return Promise.resolve(success);
});
}
@@ -311,6 +312,17 @@ export class UsersRouter extends ClassesRouter {
return Promise.resolve(success);
}
_runAfterLogoutTrigger(req, session) {
// After logout trigger
maybeRunTrigger(
TriggerTypes.afterLogout,
req.auth,
Parse.Session.fromJSON(Object.assign({ className: '_Session' }, session)),
null,
req.config
);
}
_throwOnBadEmailConfig(req) {
try {
Config.validateEmailConfiguration({

View File

@@ -165,6 +165,41 @@ ParseCloud.beforeLogin = function(handler) {
);
};
/**
*
* Registers the after logout function.
*
* **Available in Cloud Code only.**
*
* This function is triggered after a user logs out.
*
* ```
* Parse.Cloud.afterLogout((request) => {
* // code here
* })
*
* ```
*
* @method afterLogout
* @name Parse.Cloud.afterLogout
* @param {Function} func The function to run after a logout. This function can be async and should take one parameter a {@link Parse.Cloud.TriggerRequest};
*/
ParseCloud.afterLogout = function(handler) {
let className = '_Session';
if (typeof handler === 'string' || isParseObjectConstructor(handler)) {
// validation will occur downstream, this is to maintain internal
// code consistency with the other hook types.
className = getClassName(handler);
handler = arguments[1];
}
triggers.addTrigger(
triggers.Types.afterLogout,
className,
handler,
Parse.applicationId
);
};
/**
* Registers an after save function.
*

View File

@@ -4,6 +4,7 @@ import { logger } from './logger';
export const Types = {
beforeLogin: 'beforeLogin',
afterLogout: 'afterLogout',
beforeSave: 'beforeSave',
afterSave: 'afterSave',
beforeDelete: 'beforeDelete',
@@ -32,10 +33,6 @@ const baseStore = function() {
};
function validateClassNameForTriggers(className, type) {
const restrictedClassNames = ['_Session'];
if (restrictedClassNames.indexOf(className) != -1) {
throw `Triggers are not supported for ${className} class.`;
}
if (type == Types.beforeSave && className === '_PushStatus') {
// _PushStatus uses undocumented nested key increment ops
// allowing beforeSave would mess up the objects big time
@@ -47,6 +44,16 @@ function validateClassNameForTriggers(className, type) {
// than this anti-pattern of throwing strings
throw 'Only the _User class is allowed for the beforeLogin trigger';
}
if (type === Types.afterLogout && className !== '_Session') {
// TODO: check if upstream code will handle `Error` instance rather
// than this anti-pattern of throwing strings
throw 'Only the _Session class is allowed for the afterLogout trigger.';
}
if (className === '_Session' && type !== Types.afterLogout) {
// TODO: check if upstream code will handle `Error` instance rather
// than this anti-pattern of throwing strings
throw 'Only the afterLogout trigger is allowed for the _Session class.';
}
return className;
}