2018-09-01 13:58:06 -04:00
import { Parse } from 'parse/node' ;
2016-02-25 20:01:52 -08:00
import * as triggers from '../triggers' ;
2016-02-05 14:38:09 -05:00
2019-04-23 16:24:20 +01:00
function isParseObjectConstructor ( object ) {
2019-08-14 16:57:00 -05:00
return (
typeof object === 'function' &&
Object . prototype . hasOwnProperty . call ( object , 'className' )
) ;
2019-04-23 16:24:20 +01:00
}
2016-02-05 14:38:09 -05:00
function getClassName ( parseClass ) {
if ( parseClass && parseClass . className ) {
2017-09-18 15:01:07 -04:00
return parseClass . className ;
2016-02-05 14:38:09 -05:00
}
2017-09-18 15:01:07 -04:00
return parseClass ;
2016-02-05 14:38:09 -05:00
}
2018-08-09 16:20:13 -04:00
/ * * @ n a m e s p a c e
* @ name Parse
* @ description The Parse SDK .
* see [ api docs ] ( https : //docs.parseplatform.org/js/api) and [guide](https://docs.parseplatform.org/js/guide)
* /
/ * * @ n a m e s p a c e
* @ name Parse . Cloud
* @ memberof Parse
* @ description The Parse Cloud Code SDK .
* /
2016-02-05 14:38:09 -05:00
var ParseCloud = { } ;
2018-08-09 16:20:13 -04:00
/ * *
* 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 } .
* /
2016-02-05 14:38:09 -05:00
ParseCloud . define = function ( functionName , handler , validationHandler ) {
2018-09-01 13:58:06 -04:00
triggers . addFunction (
functionName ,
handler ,
validationHandler ,
Parse . applicationId
) ;
2016-02-05 14:38:09 -05:00
} ;
2018-08-09 16:20:13 -04:00
/ * *
* 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 }
*
* /
2016-08-30 07:19:21 -04:00
ParseCloud . job = function ( functionName , handler ) {
triggers . addJob ( functionName , handler , Parse . applicationId ) ;
} ;
2018-08-09 16:20:13 -04:00
/ * *
*
* 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 } ;
* /
2016-02-05 14:38:09 -05:00
ParseCloud . beforeSave = function ( parseClass , handler ) {
var className = getClassName ( parseClass ) ;
2018-09-01 13:58:06 -04:00
triggers . addTrigger (
triggers . Types . beforeSave ,
className ,
handler ,
Parse . applicationId
) ;
2016-02-05 14:38:09 -05:00
} ;
2018-08-09 16:20:13 -04:00
/ * *
* 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 } .
* /
2016-02-05 14:38:09 -05:00
ParseCloud . beforeDelete = function ( parseClass , handler ) {
var className = getClassName ( parseClass ) ;
2018-09-01 13:58:06 -04:00
triggers . addTrigger (
triggers . Types . beforeDelete ,
className ,
handler ,
Parse . applicationId
) ;
2016-02-05 14:38:09 -05:00
} ;
2019-04-23 16:24:20 +01:00
/ * *
*
* 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
) ;
} ;
2018-08-09 16:20:13 -04:00
/ * *
* 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 } .
* /
2016-02-05 14:38:09 -05:00
ParseCloud . afterSave = function ( parseClass , handler ) {
var className = getClassName ( parseClass ) ;
2018-09-01 13:58:06 -04:00
triggers . addTrigger (
triggers . Types . afterSave ,
className ,
handler ,
Parse . applicationId
) ;
2016-02-05 14:38:09 -05:00
} ;
2018-08-09 16:20:13 -04:00
/ * *
* 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 } .
* /
2016-02-05 14:38:09 -05:00
ParseCloud . afterDelete = function ( parseClass , handler ) {
var className = getClassName ( parseClass ) ;
2018-09-01 13:58:06 -04:00
triggers . addTrigger (
triggers . Types . afterDelete ,
className ,
handler ,
Parse . applicationId
) ;
2016-02-05 14:38:09 -05:00
} ;
2016-05-19 13:38:16 -07:00
2018-08-09 16:20:13 -04:00
/ * *
* 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 } .
* /
2016-09-17 16:52:35 -04:00
ParseCloud . beforeFind = function ( parseClass , handler ) {
var className = getClassName ( parseClass ) ;
2018-09-01 13:58:06 -04:00
triggers . addTrigger (
triggers . Types . beforeFind ,
className ,
handler ,
Parse . applicationId
) ;
2016-09-17 16:52:35 -04:00
} ;
2018-08-09 16:20:13 -04:00
/ * *
* 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 } .
* /
2016-11-12 09:35:34 -08:00
ParseCloud . afterFind = function ( parseClass , handler ) {
const className = getClassName ( parseClass ) ;
2018-09-01 13:58:06 -04:00
triggers . addTrigger (
triggers . Types . afterFind ,
className ,
handler ,
Parse . applicationId
) ;
2016-11-12 09:35:34 -08:00
} ;
2017-09-15 17:20:51 -04:00
ParseCloud . onLiveQueryEvent = function ( handler ) {
triggers . addLiveQueryEventHandler ( handler , Parse . applicationId ) ;
} ;
2016-05-19 13:38:16 -07:00
ParseCloud . _removeAllHooks = ( ) => {
triggers . _unregisterAll ( ) ;
2018-09-01 13:58:06 -04:00
} ;
2016-05-19 13:38:16 -07:00
2016-12-07 18:35:22 -05:00
ParseCloud . useMasterKey = ( ) => {
// eslint-disable-next-line
2018-09-01 13:58:06 -04:00
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'
) ;
} ;
2016-12-07 18:35:22 -05:00
2018-09-01 13:58:06 -04:00
ParseCloud . httpRequest = require ( './httpRequest' ) ;
2016-02-05 14:38:09 -05:00
module . exports = ParseCloud ;
2018-08-09 16:20:13 -04:00
/ * *
2018-08-10 15:51:31 -04:00
* @ interface Parse . Cloud . TriggerRequest
2018-08-09 16:20:13 -04:00
* @ 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 .
* /
/ * *
2018-08-10 15:51:31 -04:00
* @ interface Parse . Cloud . BeforeFindRequest
2018-08-09 16:20:13 -04:00
* @ 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 `
* /
/ * *
2018-08-10 15:51:31 -04:00
* @ interface Parse . Cloud . AfterFindRequest
2018-08-09 16:20:13 -04:00
* @ 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 .
* /
/ * *
2018-08-10 15:51:31 -04:00
* @ interface Parse . Cloud . FunctionRequest
2018-08-09 16:20:13 -04:00
* @ 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 .
* /
/ * *
2018-08-10 15:51:31 -04:00
* @ interface Parse . Cloud . JobRequest
2018-08-09 16:20:13 -04:00
* @ 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 .
* /