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;