Windshaft-cartodb/lib/cartodb/controllers/named_maps_admin.js

217 lines
6.2 KiB
JavaScript
Raw Normal View History

2017-12-29 22:22:17 +08:00
const { templateName } = require('../backends/template_maps');
const cors = require('../middleware/cors');
const userMiddleware = require('../middleware/user');
const localsMiddleware = require('../middleware/context/locals');
2018-03-01 02:20:51 +08:00
const credentialsMiddleware = require('../middleware/context/credentials');
/**
* @param {AuthApi} authApi
* @param {PgConnection} pgConnection
2015-10-01 00:00:54 +08:00
* @param {TemplateMaps} templateMaps
* @constructor
*/
function NamedMapsAdminController(authApi, templateMaps) {
this.authApi = authApi;
2015-10-01 00:00:54 +08:00
this.templateMaps = templateMaps;
}
module.exports = NamedMapsAdminController;
2017-10-05 18:12:21 +08:00
NamedMapsAdminController.prototype.register = function (app) {
2017-12-29 23:24:19 +08:00
const { base_url_templated } = app;
2017-12-29 23:19:00 +08:00
2017-10-05 18:12:21 +08:00
app.post(
2017-12-29 23:24:19 +08:00
`${base_url_templated}/`,
2017-10-05 18:12:21 +08:00
cors(),
userMiddleware(),
localsMiddleware(),
2018-03-01 02:46:46 +08:00
credentialsMiddleware(),
checkContentType('POST', 'POST TEMPLATE'),
authorizedByAPIKey(this.authApi, 'create', 'POST TEMPLATE'),
2018-03-13 20:21:40 +08:00
createTemplate(this.templateMaps)
2017-10-05 18:12:21 +08:00
);
app.put(
2017-12-29 23:24:19 +08:00
`${base_url_templated}/:template_id`,
2017-10-05 18:12:21 +08:00
cors(),
userMiddleware(),
localsMiddleware(),
2018-03-01 02:46:46 +08:00
credentialsMiddleware(),
checkContentType('PUT', 'PUT TEMPLATE'),
authorizedByAPIKey(this.authApi, 'update', 'PUT TEMPLATE'),
2018-03-13 20:21:40 +08:00
updateTemplate(this.templateMaps)
2017-10-05 18:12:21 +08:00
);
app.get(
2017-12-29 23:24:19 +08:00
`${base_url_templated}/:template_id`,
2017-10-05 18:12:21 +08:00
cors(),
userMiddleware(),
localsMiddleware(),
2018-03-01 02:46:46 +08:00
credentialsMiddleware(),
authorizedByAPIKey(this.authApi, 'get', 'GET TEMPLATE'),
2018-03-13 20:21:40 +08:00
retrieveTemplate(this.templateMaps)
2017-10-05 18:12:21 +08:00
);
app.delete(
2017-12-29 23:24:19 +08:00
`${base_url_templated}/:template_id`,
2017-10-05 18:12:21 +08:00
cors(),
userMiddleware(),
localsMiddleware(),
2018-03-01 02:46:46 +08:00
credentialsMiddleware(),
authorizedByAPIKey(this.authApi, 'delete', 'DELETE TEMPLATE'),
2018-03-13 20:21:40 +08:00
destroyTemplate(this.templateMaps)
2017-10-05 18:12:21 +08:00
);
2017-10-05 18:12:21 +08:00
app.get(
2017-12-29 23:24:19 +08:00
`${base_url_templated}/`,
cors(),
userMiddleware(),
localsMiddleware(),
2018-03-01 02:46:46 +08:00
credentialsMiddleware(),
authorizedByAPIKey(this.authApi, 'list', 'GET TEMPLATE LIST'),
2018-03-13 20:21:40 +08:00
listTemplates(this.templateMaps)
);
2017-10-05 18:12:21 +08:00
app.options(
2017-12-29 23:24:19 +08:00
`${base_url_templated}/:template_id`,
2017-10-05 18:12:21 +08:00
cors('Content-Type')
);
};
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) {
2017-12-29 22:19:52 +08:00
return function authorizedByAPIKeyMiddleware (req, res, next) {
const { user } = res.locals;
authApi.authorizedByAPIKey(user, res, (err, authenticated) => {
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);
}
next();
});
};
}
2017-12-29 22:19:52 +08:00
2018-03-13 20:21:40 +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.status(200);
const method = req.query.callback ? 'jsonp' : 'json';
2017-12-29 23:30:42 +08:00
res[method]({ template_id: templateId });
});
};
}
2018-03-13 20:21:40 +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.status(200);
const method = req.query.callback ? 'jsonp' : 'json';
2017-12-29 23:30:42 +08:00
res[method]({ template_id: templateId });
});
};
}
2018-03-13 20:21:40 +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.status(200);
2017-12-29 22:17:29 +08:00
const method = req.query.callback ? 'jsonp' : 'json';
2017-12-29 23:30:42 +08:00
res[method]({ template });
});
};
}
2018-03-13 20:21:40 +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
res.status(204);
2017-12-29 22:17:29 +08:00
const method = req.query.callback ? 'jsonp' : 'json';
res[method]('');
});
};
}
2018-03-13 20:21:40 +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.status(200);
const method = req.query.callback ? 'jsonp' : 'json';
2017-12-29 23:30:42 +08:00
res[method]({ template_ids: templateIds });
});
};
}