import { Parse } from 'parse/node'; import PromiseRouter from '../PromiseRouter'; import * as middleware from '../middlewares'; export class HooksRouter extends PromiseRouter { createHook(aHook, config) { return config.hooksController .createHook(aHook) .then(hook => ({ response: hook })); } updateHook(aHook, config) { return config.hooksController .updateHook(aHook) .then(hook => ({ response: hook })); } handlePost(req) { return this.createHook(req.body, req.config); } handleGetFunctions(req) { var hooksController = req.config.hooksController; if (req.params.functionName) { return hooksController .getFunction(req.params.functionName) .then(foundFunction => { if (!foundFunction) { throw new Parse.Error( 143, `no function named: ${req.params.functionName} is defined` ); } return Promise.resolve({ response: foundFunction }); }); } return hooksController.getFunctions().then( functions => { return { response: functions || [] }; }, err => { throw err; } ); } handleGetTriggers(req) { var hooksController = req.config.hooksController; if (req.params.className && req.params.triggerName) { return hooksController .getTrigger(req.params.className, req.params.triggerName) .then(foundTrigger => { if (!foundTrigger) { throw new Parse.Error( 143, `class ${req.params.className} does not exist` ); } return Promise.resolve({ response: foundTrigger }); }); } return hooksController .getTriggers() .then(triggers => ({ response: triggers || [] })); } handleDelete(req) { var hooksController = req.config.hooksController; if (req.params.functionName) { return hooksController .deleteFunction(req.params.functionName) .then(() => ({ response: {} })); } else if (req.params.className && req.params.triggerName) { return hooksController .deleteTrigger(req.params.className, req.params.triggerName) .then(() => ({ response: {} })); } return Promise.resolve({ response: {} }); } handleUpdate(req) { var hook; if (req.params.functionName && req.body.url) { hook = {}; hook.functionName = req.params.functionName; hook.url = req.body.url; } else if (req.params.className && req.params.triggerName && req.body.url) { hook = {}; hook.className = req.params.className; hook.triggerName = req.params.triggerName; hook.url = req.body.url; } else { throw new Parse.Error(143, 'invalid hook declaration'); } return this.updateHook(hook, req.config); } handlePut(req) { var body = req.body; if (body.__op == 'Delete') { return this.handleDelete(req); } else { return this.handleUpdate(req); } } mountRoutes() { this.route( 'GET', '/hooks/functions', middleware.promiseEnforceMasterKeyAccess, this.handleGetFunctions.bind(this) ); this.route( 'GET', '/hooks/triggers', middleware.promiseEnforceMasterKeyAccess, this.handleGetTriggers.bind(this) ); this.route( 'GET', '/hooks/functions/:functionName', middleware.promiseEnforceMasterKeyAccess, this.handleGetFunctions.bind(this) ); this.route( 'GET', '/hooks/triggers/:className/:triggerName', middleware.promiseEnforceMasterKeyAccess, this.handleGetTriggers.bind(this) ); this.route( 'POST', '/hooks/functions', middleware.promiseEnforceMasterKeyAccess, this.handlePost.bind(this) ); this.route( 'POST', '/hooks/triggers', middleware.promiseEnforceMasterKeyAccess, this.handlePost.bind(this) ); this.route( 'PUT', '/hooks/functions/:functionName', middleware.promiseEnforceMasterKeyAccess, this.handlePut.bind(this) ); this.route( 'PUT', '/hooks/triggers/:className/:triggerName', middleware.promiseEnforceMasterKeyAccess, this.handlePut.bind(this) ); } } export default HooksRouter;