2016-01-28 10:58:12 -08:00
|
|
|
// triggers.js
|
2016-02-05 14:38:09 -05:00
|
|
|
var Parse = require('parse/node').Parse,
|
|
|
|
|
cache = require('./cache');
|
2016-01-28 10:58:12 -08:00
|
|
|
|
|
|
|
|
var Types = {
|
|
|
|
|
beforeSave: 'beforeSave',
|
|
|
|
|
afterSave: 'afterSave',
|
|
|
|
|
beforeDelete: 'beforeDelete',
|
|
|
|
|
afterDelete: 'afterDelete'
|
|
|
|
|
};
|
|
|
|
|
|
2016-02-05 14:38:09 -05:00
|
|
|
var BaseStore = function() {
|
|
|
|
|
this.Functions = {}
|
|
|
|
|
this.Validators = {}
|
|
|
|
|
this.Triggers = Object.keys(Types).reduce(function(base, key){
|
|
|
|
|
base[key] = {};
|
|
|
|
|
return base;
|
|
|
|
|
}, {});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var _triggerStore = {};
|
|
|
|
|
|
|
|
|
|
function addFunction(functionName, handler, validationHandler, applicationId) {
|
|
|
|
|
applicationId = applicationId || Parse.applicationId;
|
|
|
|
|
_triggerStore[applicationId] = _triggerStore[applicationId] || new BaseStore();
|
|
|
|
|
_triggerStore[applicationId].Functions[functionName] = handler;
|
|
|
|
|
_triggerStore[applicationId].Validators[functionName] = validationHandler;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function addTrigger(type, className, handler, applicationId) {
|
|
|
|
|
applicationId = applicationId || Parse.applicationId;
|
|
|
|
|
_triggerStore[applicationId] = _triggerStore[applicationId] || new BaseStore();
|
|
|
|
|
_triggerStore[applicationId].Triggers[type][className] = handler;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function removeFunction(functionName, applicationId) {
|
|
|
|
|
applicationId = applicationId || Parse.applicationId;
|
|
|
|
|
delete _triggerStore[applicationId].Functions[functionName]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function removeTrigger(type, className, applicationId) {
|
|
|
|
|
applicationId = applicationId || Parse.applicationId;
|
|
|
|
|
delete _triggerStore[applicationId].Triggers[type][className]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _unregister(a,b,c,d) {
|
|
|
|
|
if (d) {
|
|
|
|
|
removeTrigger(c,d,a);
|
|
|
|
|
delete _triggerStore[a][b][c][d];
|
|
|
|
|
} else {
|
|
|
|
|
delete _triggerStore[a][b][c];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var getTrigger = function(className, triggerType, applicationId) {
|
|
|
|
|
if (!applicationId) {
|
|
|
|
|
throw "Missing ApplicationID";
|
|
|
|
|
}
|
|
|
|
|
var manager = _triggerStore[applicationId]
|
|
|
|
|
if (manager
|
|
|
|
|
&& manager.Triggers
|
|
|
|
|
&& manager.Triggers[triggerType]
|
|
|
|
|
&& manager.Triggers[triggerType][className]) {
|
|
|
|
|
return manager.Triggers[triggerType][className];
|
2016-01-28 10:58:12 -08:00
|
|
|
}
|
|
|
|
|
return undefined;
|
|
|
|
|
};
|
|
|
|
|
|
2016-02-24 00:05:03 -08:00
|
|
|
function triggerExists(className: string, type: string): boolean {
|
|
|
|
|
return (getTrigger(className, type) != undefined);
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-05 14:38:09 -05:00
|
|
|
var getFunction = function(functionName, applicationId) {
|
|
|
|
|
var manager = _triggerStore[applicationId];
|
|
|
|
|
if (manager && manager.Functions) {
|
|
|
|
|
return manager.Functions[functionName];
|
|
|
|
|
};
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var getValidator = function(functionName, applicationId) {
|
|
|
|
|
var manager = _triggerStore[applicationId];
|
|
|
|
|
if (manager && manager.Validators) {
|
|
|
|
|
return manager.Validators[functionName];
|
|
|
|
|
};
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-28 10:58:12 -08:00
|
|
|
var getRequestObject = function(triggerType, auth, parseObject, originalParseObject) {
|
|
|
|
|
var request = {
|
|
|
|
|
triggerName: triggerType,
|
|
|
|
|
object: parseObject,
|
|
|
|
|
master: false
|
|
|
|
|
};
|
|
|
|
|
if (originalParseObject) {
|
|
|
|
|
request.original = originalParseObject;
|
|
|
|
|
}
|
|
|
|
|
if (!auth) {
|
|
|
|
|
return request;
|
|
|
|
|
}
|
|
|
|
|
if (auth.isMaster) {
|
|
|
|
|
request['master'] = true;
|
|
|
|
|
}
|
|
|
|
|
if (auth.user) {
|
|
|
|
|
request['user'] = auth.user;
|
|
|
|
|
}
|
|
|
|
|
// TODO: Add installation to Auth?
|
|
|
|
|
if (auth.installationId) {
|
|
|
|
|
request['installationId'] = auth.installationId;
|
|
|
|
|
}
|
|
|
|
|
return request;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Creates the response object, and uses the request object to pass data
|
|
|
|
|
// The API will call this with REST API formatted objects, this will
|
|
|
|
|
// transform them to Parse.Object instances expected by Cloud Code.
|
|
|
|
|
// Any changes made to the object in a beforeSave will be included.
|
|
|
|
|
var getResponseObject = function(request, resolve, reject) {
|
|
|
|
|
return {
|
2016-02-05 14:38:09 -05:00
|
|
|
success: function(response) {
|
|
|
|
|
// Use the JSON response
|
|
|
|
|
if (response && request.triggerName === Types.beforeSave) {
|
|
|
|
|
return resolve(response);
|
|
|
|
|
}
|
|
|
|
|
response = {};
|
2016-01-28 10:58:12 -08:00
|
|
|
if (request.triggerName === Types.beforeSave) {
|
2016-02-24 00:00:25 -08:00
|
|
|
response['object'] = request.object._getSaveJSON();
|
2016-01-28 10:58:12 -08:00
|
|
|
}
|
|
|
|
|
return resolve(response);
|
|
|
|
|
},
|
|
|
|
|
error: function(error) {
|
2016-02-03 01:47:05 -08:00
|
|
|
var scriptError = new Parse.Error(Parse.Error.SCRIPT_FAILED, error);
|
|
|
|
|
return reject(scriptError);
|
2016-01-28 10:58:12 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// To be used as part of the promise chain when saving/deleting an object
|
|
|
|
|
// Will resolve successfully if no trigger is configured
|
|
|
|
|
// Resolves to an object, empty or containing an object key. A beforeSave
|
|
|
|
|
// trigger will set the object key to the rest format object to save.
|
|
|
|
|
// originalParseObject is optional, we only need that for befote/afterSave functions
|
2016-02-05 14:38:09 -05:00
|
|
|
var maybeRunTrigger = function(triggerType, auth, parseObject, originalParseObject, applicationId) {
|
2016-01-28 10:58:12 -08:00
|
|
|
if (!parseObject) {
|
|
|
|
|
return Promise.resolve({});
|
|
|
|
|
}
|
|
|
|
|
return new Promise(function (resolve, reject) {
|
2016-02-05 14:38:09 -05:00
|
|
|
var trigger = getTrigger(parseObject.className, triggerType, applicationId);
|
|
|
|
|
if (!trigger) return resolve();
|
2016-01-28 10:58:12 -08:00
|
|
|
var request = getRequestObject(triggerType, auth, parseObject, originalParseObject);
|
|
|
|
|
var response = getResponseObject(request, resolve, reject);
|
2016-02-05 14:38:09 -05:00
|
|
|
// Force the current Parse app before the trigger
|
|
|
|
|
Parse.applicationId = applicationId;
|
|
|
|
|
Parse.javascriptKey = cache.apps[applicationId].javascriptKey || '';
|
|
|
|
|
Parse.masterKey = cache.apps[applicationId].masterKey;
|
2016-01-28 10:58:12 -08:00
|
|
|
trigger(request, response);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Converts a REST-format object to a Parse.Object
|
|
|
|
|
// data is either className or an object
|
|
|
|
|
function inflate(data, restObject) {
|
|
|
|
|
var copy = typeof data == 'object' ? data : {className: data};
|
|
|
|
|
for (var key in restObject) {
|
|
|
|
|
copy[key] = restObject[key];
|
|
|
|
|
}
|
|
|
|
|
return Parse.Object.fromJSON(copy);
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-05 14:38:09 -05:00
|
|
|
<<<<<<< 5fae41183ed476976ff29a4c247aa78b00b83a9e
|
2016-01-28 10:58:12 -08:00
|
|
|
module.exports = {
|
|
|
|
|
getTrigger: getTrigger,
|
|
|
|
|
getRequestObject: getRequestObject,
|
|
|
|
|
inflate: inflate,
|
|
|
|
|
maybeRunTrigger: maybeRunTrigger,
|
2016-02-24 00:05:03 -08:00
|
|
|
triggerExists: triggerExists,
|
2016-01-28 10:58:12 -08:00
|
|
|
Types: Types
|
|
|
|
|
};
|
2016-02-05 14:38:09 -05:00
|
|
|
=======
|
|
|
|
|
var TriggerManager = {};
|
|
|
|
|
|
|
|
|
|
TriggerManager.getTrigger = getTrigger;
|
|
|
|
|
TriggerManager.getRequestObject = getRequestObject;
|
|
|
|
|
TriggerManager.inflate = inflate;
|
|
|
|
|
TriggerManager.maybeRunTrigger = maybeRunTrigger;
|
|
|
|
|
TriggerManager.Types = Types;
|
|
|
|
|
TriggerManager.addFunction = addFunction;
|
|
|
|
|
TriggerManager.getFunction = getFunction;
|
|
|
|
|
TriggerManager.removeTrigger = removeTrigger;
|
|
|
|
|
TriggerManager.removeFunction = removeFunction;
|
|
|
|
|
TriggerManager.getValidator = getValidator;
|
|
|
|
|
TriggerManager.addTrigger = addTrigger;
|
|
|
|
|
TriggerManager._unregister = _unregister;
|
|
|
|
|
|
|
|
|
|
module.exports = TriggerManager;
|
|
|
|
|
>>>>>>> Adds Hooks API
|