* Fix: Lint no-prototype-builtins Closes: https://github.com/parse-community/parse-server/issues/5842 Reference: https://eslint.org/docs/rules/no-prototype-builtins * replace Object.hasOwnProperty.call
364 lines
12 KiB
JavaScript
364 lines
12 KiB
JavaScript
import { Parse } from 'parse/node';
|
|
import * as triggers from '../triggers';
|
|
|
|
function isParseObjectConstructor(object) {
|
|
return (
|
|
typeof object === 'function' &&
|
|
Object.prototype.hasOwnProperty.call(object, 'className')
|
|
);
|
|
}
|
|
|
|
function getClassName(parseClass) {
|
|
if (parseClass && parseClass.className) {
|
|
return parseClass.className;
|
|
}
|
|
return parseClass;
|
|
}
|
|
|
|
/** @namespace
|
|
* @name Parse
|
|
* @description The Parse SDK.
|
|
* see [api docs](https://docs.parseplatform.org/js/api) and [guide](https://docs.parseplatform.org/js/guide)
|
|
*/
|
|
|
|
/** @namespace
|
|
* @name Parse.Cloud
|
|
* @memberof Parse
|
|
* @description The Parse Cloud Code SDK.
|
|
*/
|
|
|
|
var ParseCloud = {};
|
|
/**
|
|
* Defines a Cloud Function.
|
|
*
|
|
* **Available in Cloud Code only.**
|
|
|
|
* @static
|
|
* @memberof Parse.Cloud
|
|
* @param {String} name The name of the Cloud Function
|
|
* @param {Function} data The Cloud Function to register. This function can be an async function and should take one parameter a {@link Parse.Cloud.FunctionRequest}.
|
|
*/
|
|
ParseCloud.define = function(functionName, handler, validationHandler) {
|
|
triggers.addFunction(
|
|
functionName,
|
|
handler,
|
|
validationHandler,
|
|
Parse.applicationId
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Defines a Background Job.
|
|
*
|
|
* **Available in Cloud Code only.**
|
|
*
|
|
* @method job
|
|
* @name Parse.Cloud.job
|
|
* @param {String} name The name of the Background Job
|
|
* @param {Function} func The Background Job to register. This function can be async should take a single parameters a {@link Parse.Cloud.JobRequest}
|
|
*
|
|
*/
|
|
ParseCloud.job = function(functionName, handler) {
|
|
triggers.addJob(functionName, handler, Parse.applicationId);
|
|
};
|
|
|
|
/**
|
|
*
|
|
* Registers a before save function.
|
|
*
|
|
* **Available in Cloud Code only.**
|
|
*
|
|
* If you want to use beforeSave for a predefined class in the Parse JavaScript SDK (e.g. {@link Parse.User}), you should pass the class itself and not the String for arg1.
|
|
*
|
|
* ```
|
|
* Parse.Cloud.beforeSave('MyCustomClass', (request) => {
|
|
* // code here
|
|
* })
|
|
*
|
|
* Parse.Cloud.beforeSave(Parse.User, (request) => {
|
|
* // code here
|
|
* })
|
|
* ```
|
|
*
|
|
* @method beforeSave
|
|
* @name Parse.Cloud.beforeSave
|
|
* @param {(String|Parse.Object)} arg1 The Parse.Object subclass to register the after save function for. This can instead be a String that is the className of the subclass.
|
|
* @param {Function} func The function to run before a save. This function can be async and should take one parameter a {@link Parse.Cloud.TriggerRequest};
|
|
*/
|
|
ParseCloud.beforeSave = function(parseClass, handler) {
|
|
var className = getClassName(parseClass);
|
|
triggers.addTrigger(
|
|
triggers.Types.beforeSave,
|
|
className,
|
|
handler,
|
|
Parse.applicationId
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Registers a before delete function.
|
|
*
|
|
* **Available in Cloud Code only.**
|
|
*
|
|
* If you want to use beforeDelete for a predefined class in the Parse JavaScript SDK (e.g. {@link Parse.User}), you should pass the class itself and not the String for arg1.
|
|
* ```
|
|
* Parse.Cloud.beforeDelete('MyCustomClass', (request) => {
|
|
* // code here
|
|
* })
|
|
*
|
|
* Parse.Cloud.beforeDelete(Parse.User, (request) => {
|
|
* // code here
|
|
* })
|
|
*```
|
|
*
|
|
* @method beforeDelete
|
|
* @name Parse.Cloud.beforeDelete
|
|
* @param {(String|Parse.Object)} arg1 The Parse.Object subclass to register the before delete function for. This can instead be a String that is the className of the subclass.
|
|
* @param {Function} func The function to run before a delete. This function can be async and should take one parameter, a {@link Parse.Cloud.TriggerRequest}.
|
|
*/
|
|
ParseCloud.beforeDelete = function(parseClass, handler) {
|
|
var className = getClassName(parseClass);
|
|
triggers.addTrigger(
|
|
triggers.Types.beforeDelete,
|
|
className,
|
|
handler,
|
|
Parse.applicationId
|
|
);
|
|
};
|
|
|
|
/**
|
|
*
|
|
* Registers the before login function.
|
|
*
|
|
* **Available in Cloud Code only.**
|
|
*
|
|
* This function provides further control
|
|
* in validating a login attempt. Specifically,
|
|
* it is triggered after a user enters
|
|
* correct credentials (or other valid authData),
|
|
* but prior to a session being generated.
|
|
*
|
|
* ```
|
|
* Parse.Cloud.beforeLogin((request) => {
|
|
* // code here
|
|
* })
|
|
*
|
|
* ```
|
|
*
|
|
* @method beforeLogin
|
|
* @name Parse.Cloud.beforeLogin
|
|
* @param {Function} func The function to run before a login. This function can be async and should take one parameter a {@link Parse.Cloud.TriggerRequest};
|
|
*/
|
|
ParseCloud.beforeLogin = function(handler) {
|
|
let className = '_User';
|
|
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.beforeLogin,
|
|
className,
|
|
handler,
|
|
Parse.applicationId
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Registers an after save function.
|
|
*
|
|
* **Available in Cloud Code only.**
|
|
*
|
|
* If you want to use afterSave for a predefined class in the Parse JavaScript SDK (e.g. {@link Parse.User}), you should pass the class itself and not the String for arg1.
|
|
*
|
|
* ```
|
|
* Parse.Cloud.afterSave('MyCustomClass', async function(request) {
|
|
* // code here
|
|
* })
|
|
*
|
|
* Parse.Cloud.afterSave(Parse.User, async function(request) {
|
|
* // code here
|
|
* })
|
|
* ```
|
|
*
|
|
* @method afterSave
|
|
* @name Parse.Cloud.afterSave
|
|
* @param {(String|Parse.Object)} arg1 The Parse.Object subclass to register the after save function for. This can instead be a String that is the className of the subclass.
|
|
* @param {Function} func The function to run after a save. This function can be an async function and should take just one parameter, {@link Parse.Cloud.TriggerRequest}.
|
|
*/
|
|
ParseCloud.afterSave = function(parseClass, handler) {
|
|
var className = getClassName(parseClass);
|
|
triggers.addTrigger(
|
|
triggers.Types.afterSave,
|
|
className,
|
|
handler,
|
|
Parse.applicationId
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Registers an after delete function.
|
|
*
|
|
* **Available in Cloud Code only.**
|
|
*
|
|
* If you want to use afterDelete for a predefined class in the Parse JavaScript SDK (e.g. {@link Parse.User}), you should pass the class itself and not the String for arg1.
|
|
* ```
|
|
* Parse.Cloud.afterDelete('MyCustomClass', async (request) => {
|
|
* // code here
|
|
* })
|
|
*
|
|
* Parse.Cloud.afterDelete(Parse.User, async (request) => {
|
|
* // code here
|
|
* })
|
|
*```
|
|
*
|
|
* @method afterDelete
|
|
* @name Parse.Cloud.afterDelete
|
|
* @param {(String|Parse.Object)} arg1 The Parse.Object subclass to register the after delete function for. This can instead be a String that is the className of the subclass.
|
|
* @param {Function} func The function to run after a delete. This function can be async and should take just one parameter, {@link Parse.Cloud.TriggerRequest}.
|
|
*/
|
|
ParseCloud.afterDelete = function(parseClass, handler) {
|
|
var className = getClassName(parseClass);
|
|
triggers.addTrigger(
|
|
triggers.Types.afterDelete,
|
|
className,
|
|
handler,
|
|
Parse.applicationId
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Registers a before find function.
|
|
*
|
|
* **Available in Cloud Code only.**
|
|
*
|
|
* If you want to use beforeFind for a predefined class in the Parse JavaScript SDK (e.g. {@link Parse.User}), you should pass the class itself and not the String for arg1.
|
|
* ```
|
|
* Parse.Cloud.beforeFind('MyCustomClass', async (request) => {
|
|
* // code here
|
|
* })
|
|
*
|
|
* Parse.Cloud.beforeFind(Parse.User, async (request) => {
|
|
* // code here
|
|
* })
|
|
*```
|
|
*
|
|
* @method beforeFind
|
|
* @name Parse.Cloud.beforeFind
|
|
* @param {(String|Parse.Object)} arg1 The Parse.Object subclass to register the before find function for. This can instead be a String that is the className of the subclass.
|
|
* @param {Function} func The function to run before a find. This function can be async and should take just one parameter, {@link Parse.Cloud.BeforeFindRequest}.
|
|
*/
|
|
ParseCloud.beforeFind = function(parseClass, handler) {
|
|
var className = getClassName(parseClass);
|
|
triggers.addTrigger(
|
|
triggers.Types.beforeFind,
|
|
className,
|
|
handler,
|
|
Parse.applicationId
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Registers an after find function.
|
|
*
|
|
* **Available in Cloud Code only.**
|
|
*
|
|
* If you want to use afterFind for a predefined class in the Parse JavaScript SDK (e.g. {@link Parse.User}), you should pass the class itself and not the String for arg1.
|
|
* ```
|
|
* Parse.Cloud.afterFind('MyCustomClass', async (request) => {
|
|
* // code here
|
|
* })
|
|
*
|
|
* Parse.Cloud.afterFind(Parse.User, async (request) => {
|
|
* // code here
|
|
* })
|
|
*```
|
|
*
|
|
* @method afterFind
|
|
* @name Parse.Cloud.afterFind
|
|
* @param {(String|Parse.Object)} arg1 The Parse.Object subclass to register the after find function for. This can instead be a String that is the className of the subclass.
|
|
* @param {Function} func The function to run before a find. This function can be async and should take just one parameter, {@link Parse.Cloud.AfterFindRequest}.
|
|
*/
|
|
ParseCloud.afterFind = function(parseClass, handler) {
|
|
const className = getClassName(parseClass);
|
|
triggers.addTrigger(
|
|
triggers.Types.afterFind,
|
|
className,
|
|
handler,
|
|
Parse.applicationId
|
|
);
|
|
};
|
|
|
|
ParseCloud.onLiveQueryEvent = function(handler) {
|
|
triggers.addLiveQueryEventHandler(handler, Parse.applicationId);
|
|
};
|
|
|
|
ParseCloud._removeAllHooks = () => {
|
|
triggers._unregisterAll();
|
|
};
|
|
|
|
ParseCloud.useMasterKey = () => {
|
|
// eslint-disable-next-line
|
|
console.warn(
|
|
'Parse.Cloud.useMasterKey is deprecated (and has no effect anymore) on parse-server, please refer to the cloud code migration notes: http://docs.parseplatform.org/parse-server/guide/#master-key-must-be-passed-explicitly'
|
|
);
|
|
};
|
|
|
|
ParseCloud.httpRequest = require('./httpRequest');
|
|
|
|
module.exports = ParseCloud;
|
|
|
|
/**
|
|
* @interface Parse.Cloud.TriggerRequest
|
|
* @property {String} installationId If set, the installationId triggering the request.
|
|
* @property {Boolean} master If true, means the master key was used.
|
|
* @property {Parse.User} user If set, the user that made the request.
|
|
* @property {Parse.Object} object The object triggering the hook.
|
|
* @property {String} ip The IP address of the client making the request.
|
|
* @property {Object} headers The original HTTP headers for the request.
|
|
* @property {String} triggerName The name of the trigger (`beforeSave`, `afterSave`, ...)
|
|
* @property {Object} log The current logger inside Parse Server.
|
|
* @property {Parse.Object} original If set, the object, as currently stored.
|
|
*/
|
|
|
|
/**
|
|
* @interface Parse.Cloud.BeforeFindRequest
|
|
* @property {String} installationId If set, the installationId triggering the request.
|
|
* @property {Boolean} master If true, means the master key was used.
|
|
* @property {Parse.User} user If set, the user that made the request.
|
|
* @property {Parse.Query} query The query triggering the hook.
|
|
* @property {String} ip The IP address of the client making the request.
|
|
* @property {Object} headers The original HTTP headers for the request.
|
|
* @property {String} triggerName The name of the trigger (`beforeSave`, `afterSave`, ...)
|
|
* @property {Object} log The current logger inside Parse Server.
|
|
* @property {Boolean} isGet wether the query a `get` or a `find`
|
|
*/
|
|
|
|
/**
|
|
* @interface Parse.Cloud.AfterFindRequest
|
|
* @property {String} installationId If set, the installationId triggering the request.
|
|
* @property {Boolean} master If true, means the master key was used.
|
|
* @property {Parse.User} user If set, the user that made the request.
|
|
* @property {Parse.Query} query The query triggering the hook.
|
|
* @property {Array<Parse.Object>} results The results the query yielded.
|
|
* @property {String} ip The IP address of the client making the request.
|
|
* @property {Object} headers The original HTTP headers for the request.
|
|
* @property {String} triggerName The name of the trigger (`beforeSave`, `afterSave`, ...)
|
|
* @property {Object} log The current logger inside Parse Server.
|
|
*/
|
|
|
|
/**
|
|
* @interface Parse.Cloud.FunctionRequest
|
|
* @property {String} installationId If set, the installationId triggering the request.
|
|
* @property {Boolean} master If true, means the master key was used.
|
|
* @property {Parse.User} user If set, the user that made the request.
|
|
* @property {Object} params The params passed to the cloud function.
|
|
*/
|
|
|
|
/**
|
|
* @interface Parse.Cloud.JobRequest
|
|
* @property {Object} params The params passed to the background job.
|
|
* @property {function} message If message is called with a string argument, will update the current message to be stored in the job status.
|
|
*/
|