Windshaft-cartodb/lib/cartodb/api/template/admin-template-controller.js

212 lines
6.5 KiB
JavaScript
Raw Normal View History

const { templateName } = require('../../backends/template_maps');
const credentials = require('../middlewares/credentials');
const rateLimit = require('../middlewares/rate-limit');
const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit;
/**
2018-04-10 00:08:56 +08:00
* @param {AuthBackend} authBackend
* @param {PgConnection} pgConnection
2015-10-01 00:00:54 +08:00
* @param {TemplateMaps} templateMaps
* @constructor
*/
function AdminTemplateController(authBackend, templateMaps, userLimitsBackend) {
2018-04-10 00:08:56 +08:00
this.authBackend = authBackend;
2015-10-01 00:00:54 +08:00
this.templateMaps = templateMaps;
this.userLimitsBackend = userLimitsBackend;
}
module.exports = AdminTemplateController;
AdminTemplateController.prototype.register = function (templateRouter) {
templateRouter.options(`/:template_id`);
2018-03-28 00:46:54 +08:00
templateRouter.post(
`/`,
2018-03-16 23:28:50 +08:00
credentials(),
2018-04-10 00:08:56 +08:00
authorizedByAPIKey({ authBackend: this.authBackend, action: 'create', label: 'POST TEMPLATE' }),
rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_CREATE),
checkContentType({ action: 'POST', label: 'POST TEMPLATE' }),
createTemplate({ templateMaps: this.templateMaps })
2017-10-05 18:12:21 +08:00
);
2018-03-28 00:46:54 +08:00
templateRouter.put(
`/:template_id`,
2018-03-16 23:28:50 +08:00
credentials(),
2018-04-10 00:08:56 +08:00
authorizedByAPIKey({ authBackend: this.authBackend, action: 'update', label: 'PUT TEMPLATE' }),
rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_UPDATE),
checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }),
updateTemplate({ templateMaps: this.templateMaps })
2017-10-05 18:12:21 +08:00
);
2018-03-28 00:46:54 +08:00
templateRouter.get(
`/:template_id`,
2018-03-16 23:28:50 +08:00
credentials(),
2018-04-10 00:08:56 +08:00
authorizedByAPIKey({ authBackend: this.authBackend, action: 'get', label: 'GET TEMPLATE' }),
rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_GET),
retrieveTemplate({ templateMaps: this.templateMaps })
2017-10-05 18:12:21 +08:00
);
2018-03-28 00:46:54 +08:00
templateRouter.delete(
`/:template_id`,
2018-03-16 23:28:50 +08:00
credentials(),
2018-04-10 00:08:56 +08:00
authorizedByAPIKey({ authBackend: this.authBackend, action: 'delete', label: 'DELETE TEMPLATE' }),
rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_DELETE),
destroyTemplate({ templateMaps: this.templateMaps })
2017-10-05 18:12:21 +08:00
);
2018-03-28 00:46:54 +08:00
templateRouter.get(
`/`,
2018-03-16 23:28:50 +08:00
credentials(),
2018-04-10 00:08:56 +08:00
authorizedByAPIKey({ authBackend: this.authBackend, action: 'list', label: 'GET TEMPLATE LIST' }),
rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_LIST),
listTemplates({ templateMaps: this.templateMaps })
);
};
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);
}
2018-03-13 20:31:49 +08:00
next();
};
}
2018-04-10 00:08:56 +08:00
function authorizedByAPIKey ({ authBackend, action, label }) {
2017-12-29 22:19:52 +08:00
return function authorizedByAPIKeyMiddleware (req, res, next) {
const { user } = res.locals;
authBackend.authorizedByAPIKey(user, res, (err, authenticated, apikey) => {
2017-12-29 22:19:52 +08:00
if (err) {
return next(err);
}
if (!authenticated) {
const error = new Error(`Only authenticated user can ${action} templated maps`);
error.http_status = 403;
error.label = label;
return next(error);
}
if (apikey.type !== 'master') {
const error = new Error('Forbidden');
error.type = 'auth';
error.subtype = 'api-key-does-not-grant-access';
error.http_status = 403;
return next(error);
}
2017-12-29 22:19:52 +08:00
next();
});
};
}
2017-12-29 22:19:52 +08:00
2018-03-15 00:31:37 +08:00
function createTemplate ({ templateMaps }) {
return function createTemplateMiddleware (req, res, next) {
2017-12-30 01:34:54 +08:00
const { user } = res.locals;
2017-12-29 23:30:42 +08:00
const template = req.body;
templateMaps.addTemplate(user, template, (err, templateId) => {
if (err) {
return next(err);
}
res.statusCode = 200;
2018-03-13 20:31:49 +08:00
res.body = { template_id: templateId };
2018-03-13 20:31:49 +08:00
next();
});
};
}
2018-03-15 00:31:37 +08:00
function updateTemplate ({ templateMaps }) {
return function updateTemplateMiddleware (req, res, next) {
2017-12-29 23:30:42 +08:00
const { user } = res.locals;
const template = req.body;
2017-12-29 23:30:42 +08:00
const templateId = templateName(req.params.template_id);
templateMaps.updTemplate(user, templateId, template, (err) => {
if (err) {
return next(err);
}
res.statusCode = 200;
2018-03-13 20:31:49 +08:00
res.body = { template_id: templateId };
2018-03-13 20:31:49 +08:00
next();
});
};
}
2018-03-15 00:31:37 +08:00
function retrieveTemplate ({ templateMaps }) {
2018-01-03 20:15:11 +08:00
return function retrieveTemplateMiddleware (req, res, next) {
req.profiler.start('windshaft-cartodb.get_template');
2017-12-30 01:34:54 +08:00
const { user } = res.locals;
2017-12-29 23:30:42 +08:00
const templateId = templateName(req.params.template_id);
2017-12-29 22:17:29 +08:00
templateMaps.getTemplate(user, templateId, (err, template) => {
if (err) {
return next(err);
}
2017-12-29 22:17:29 +08:00
2017-12-29 23:30:42 +08:00
if (!template) {
2017-12-30 01:34:54 +08:00
const error = new Error(`Cannot find template '${templateId}' of user '${user}'`);
error.http_status = 404;
return next(error);
}
// auth_id was added by ourselves,
// so we remove it before returning to the user
2017-12-29 23:30:42 +08:00
delete template.auth_id;
2017-12-29 22:17:29 +08:00
res.statusCode = 200;
2018-03-13 20:31:49 +08:00
res.body = { template };
2017-12-29 22:17:29 +08:00
2018-03-13 20:31:49 +08:00
next();
});
};
}
2018-03-15 00:31:37 +08:00
function destroyTemplate ({ templateMaps }) {
return function destroyTemplateMiddleware (req, res, next) {
req.profiler.start('windshaft-cartodb.delete_template');
2017-12-29 23:30:42 +08:00
const { user } = res.locals;
const templateId = templateName(req.params.template_id);
templateMaps.delTemplate(user, templateId, (err/* , tpl_val */) => {
if (err) {
return next(err);
}
2017-12-29 22:17:29 +08:00
2018-03-13 20:31:49 +08:00
res.statusCode = 204;
res.body = '';
2017-12-29 22:17:29 +08:00
2018-03-13 20:31:49 +08:00
next();
});
};
}
2018-03-15 00:31:37 +08:00
function listTemplates ({ templateMaps }) {
return function listTemplatesMiddleware (req, res, next) {
req.profiler.start('windshaft-cartodb.get_template_list');
2017-12-29 23:30:42 +08:00
const { user } = res.locals;
templateMaps.listTemplates(user, (err, templateIds) => {
if (err) {
return next(err);
}
res.statusCode = 200;
2018-03-13 20:31:49 +08:00
res.body = { template_ids: templateIds };
2018-03-13 20:31:49 +08:00
next();
});
};
}