diff --git a/lib/cartodb/controllers/named_maps_admin.js b/lib/cartodb/controllers/named_maps_admin.js index 0728b38c..986fef5c 100644 --- a/lib/cartodb/controllers/named_maps_admin.js +++ b/lib/cartodb/controllers/named_maps_admin.js @@ -26,9 +26,10 @@ NamedMapsAdminController.prototype.register = function (app) { userMiddleware(), localsMiddleware(), credentialsMiddleware(), - this.checkContentType('POST', 'POST TEMPLATE'), - this.authorizedByAPIKey('create', 'POST TEMPLATE'), - this.create() + checkContentType({ action: 'POST', label: 'POST TEMPLATE' }), + authorizedByAPIKey({ authApi: this.authApi, action: 'create', label: 'POST TEMPLATE' }), + createTemplate({ templateMaps: this.templateMaps }), + sendResponse() ); app.put( @@ -37,9 +38,10 @@ NamedMapsAdminController.prototype.register = function (app) { userMiddleware(), localsMiddleware(), credentialsMiddleware(), - this.checkContentType('PUT', 'PUT TEMPLATE'), - this.authorizedByAPIKey('update', 'PUT TEMPLATE'), - this.update() + checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }), + authorizedByAPIKey({ authApi: this.authApi, action: 'update', label: 'PUT TEMPLATE' }), + updateTemplate({ templateMaps: this.templateMaps }), + sendResponse() ); app.get( @@ -48,8 +50,9 @@ NamedMapsAdminController.prototype.register = function (app) { userMiddleware(), localsMiddleware(), credentialsMiddleware(), - this.authorizedByAPIKey('get', 'GET TEMPLATE'), - this.retrieve() + authorizedByAPIKey({ authApi: this.authApi, action: 'get', label: 'GET TEMPLATE' }), + retrieveTemplate({ templateMaps: this.templateMaps }), + sendResponse() ); app.delete( @@ -58,8 +61,9 @@ NamedMapsAdminController.prototype.register = function (app) { userMiddleware(), localsMiddleware(), credentialsMiddleware(), - this.authorizedByAPIKey('delete', 'DELETE TEMPLATE'), - this.destroy() + authorizedByAPIKey({ authApi: this.authApi, action: 'delete', label: 'DELETE TEMPLATE' }), + destroyTemplate({ templateMaps: this.templateMaps }), + sendResponse() ); app.get( @@ -68,8 +72,9 @@ NamedMapsAdminController.prototype.register = function (app) { userMiddleware(), localsMiddleware(), credentialsMiddleware(), - this.authorizedByAPIKey('list', 'GET TEMPLATE LIST'), - this.list() + authorizedByAPIKey({ authApi: this.authApi, action: 'list', label: 'GET TEMPLATE LIST' }), + listTemplates({ templateMaps: this.templateMaps }), + sendResponse() ); app.options( @@ -78,10 +83,23 @@ NamedMapsAdminController.prototype.register = function (app) { ); }; -NamedMapsAdminController.prototype.authorizedByAPIKey = function (action, label) { +function checkContentType ({ action, label }) { + return function checkContentTypeMiddleware (req, res, next) { + if (!req.is('application/json')) { + const error = new Error(`template ${action} data must be of type application/json`); + error.label = label; + return next(error); + } + + next(); + }; +} + +function authorizedByAPIKey ({ authApi, action, label }) { return function authorizedByAPIKeyMiddleware (req, res, next) { const { user } = res.locals; - this.authApi.authorizedByAPIKey(user, res, (err, authenticated) => { + + authApi.authorizedByAPIKey(user, res, (err, authenticated) => { if (err) { return next(err); } @@ -95,65 +113,52 @@ NamedMapsAdminController.prototype.authorizedByAPIKey = function (action, label) next(); }); - }.bind(this); -}; - -NamedMapsAdminController.prototype.checkContentType = function (action, label) { - return function checkContentTypeMiddleware (req, res, next) { - if (!req.is('application/json')) { - const error = new Error(`template ${action} data must be of type application/json`); - error.label = label; - return next(error); - } - next(); }; -}; +} -NamedMapsAdminController.prototype.create = function () { +function createTemplate ({ templateMaps }) { return function createTemplateMiddleware (req, res, next) { const { user } = res.locals; const template = req.body; - this.templateMaps.addTemplate(user, template, (err, templateId) => { + templateMaps.addTemplate(user, template, (err, templateId) => { if (err) { return next(err); } - res.status(200); + res.body = { template_id: templateId }; - const method = req.query.callback ? 'jsonp' : 'json'; - res[method]({ template_id: templateId }); + next(); }); - }.bind(this); -}; + }; +} -NamedMapsAdminController.prototype.update = function () { +function updateTemplate ({ templateMaps }) { return function updateTemplateMiddleware (req, res, next) { const { user } = res.locals; const template = req.body; const templateId = templateName(req.params.template_id); - this.templateMaps.updTemplate(user, templateId, template, (err) => { + templateMaps.updTemplate(user, templateId, template, (err) => { if (err) { return next(err); } - res.status(200); + res.body = { template_id: templateId }; - const method = req.query.callback ? 'jsonp' : 'json'; - res[method]({ template_id: templateId }); + next(); }); - }.bind(this); -}; + }; +} -NamedMapsAdminController.prototype.retrieve = function () { +function retrieveTemplate ({ templateMaps }) { return function retrieveTemplateMiddleware (req, res, next) { req.profiler.start('windshaft-cartodb.get_template'); const { user } = res.locals; const templateId = templateName(req.params.template_id); - this.templateMaps.getTemplate(user, templateId, (err, template) => { + templateMaps.getTemplate(user, templateId, (err, template) => { if (err) { return next(err); } @@ -167,49 +172,56 @@ NamedMapsAdminController.prototype.retrieve = function () { // so we remove it before returning to the user delete template.auth_id; - res.status(200); + res.body = { template }; - const method = req.query.callback ? 'jsonp' : 'json'; - res[method]({ template }); + next(); }); - }.bind(this); -}; + }; +} -NamedMapsAdminController.prototype.destroy = function () { +function destroyTemplate ({ templateMaps }) { return function destroyTemplateMiddleware (req, res, next) { req.profiler.start('windshaft-cartodb.delete_template'); const { user } = res.locals; const templateId = templateName(req.params.template_id); - this.templateMaps.delTemplate(user, templateId, (err/* , tpl_val */) => { + templateMaps.delTemplate(user, templateId, (err/* , tpl_val */) => { if (err) { return next(err); } - res.status(204); + res.statusCode = 204; + res.body = ''; - const method = req.query.callback ? 'jsonp' : 'json'; - res[method](''); + next(); }); - }.bind(this); -}; + }; +} -NamedMapsAdminController.prototype.list = function () { +function listTemplates ({ templateMaps }) { return function listTemplatesMiddleware (req, res, next) { req.profiler.start('windshaft-cartodb.get_template_list'); const { user } = res.locals; - this.templateMaps.listTemplates(user, (err, templateIds) => { + templateMaps.listTemplates(user, (err, templateIds) => { if (err) { return next(err); } - res.status(200); + res.body = { template_ids: templateIds }; - const method = req.query.callback ? 'jsonp' : 'json'; - res[method]({ template_ids: templateIds }); + next(); }); - }.bind(this); -}; + }; +} + +function sendResponse () { + return function sendResponseMiddleware (req, res) { + res.status(res.statusCode || 200); + + const method = req.query.callback ? 'jsonp' : 'json'; + res[method](res.body); + }; +}