2015-07-08 19:11:57 +08:00
|
|
|
var templateName = require('../backends/template_maps').templateName;
|
2015-09-16 22:18:26 +08:00
|
|
|
|
2015-07-08 19:27:56 +08:00
|
|
|
var cors = require('../middleware/cors');
|
2015-09-30 23:17:01 +08:00
|
|
|
var userMiddleware = require('../middleware/user');
|
2015-07-08 19:11:57 +08:00
|
|
|
|
2015-07-13 21:05:03 +08:00
|
|
|
/**
|
|
|
|
* @param {AuthApi} authApi
|
2015-09-16 22:18:26 +08:00
|
|
|
* @param {PgConnection} pgConnection
|
2015-10-01 00:00:54 +08:00
|
|
|
* @param {TemplateMaps} templateMaps
|
2015-07-13 21:05:03 +08:00
|
|
|
* @constructor
|
|
|
|
*/
|
2017-09-26 01:40:27 +08:00
|
|
|
function NamedMapsAdminController(authApi, templateMaps) {
|
2015-07-13 21:05:03 +08:00
|
|
|
this.authApi = authApi;
|
2015-10-01 00:00:54 +08:00
|
|
|
this.templateMaps = templateMaps;
|
2015-07-08 19:11:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = NamedMapsAdminController;
|
|
|
|
|
2017-10-05 18:12:21 +08:00
|
|
|
NamedMapsAdminController.prototype.register = function (app) {
|
|
|
|
app.post(
|
|
|
|
app.base_url_templated + '/',
|
|
|
|
cors(),
|
|
|
|
userMiddleware,
|
2017-12-29 20:05:01 +08:00
|
|
|
this.checkContentType('POST', 'POST TEMPLATE'),
|
|
|
|
this.authorizedByAPIKey('create', 'POST TEMPLATE'),
|
2017-10-05 18:12:21 +08:00
|
|
|
this.create.bind(this)
|
|
|
|
);
|
|
|
|
|
|
|
|
app.put(
|
|
|
|
app.base_url_templated + '/:template_id',
|
|
|
|
cors(),
|
|
|
|
userMiddleware,
|
2017-12-29 20:05:01 +08:00
|
|
|
this.checkContentType('PUT', 'PUT TEMPLATE'),
|
|
|
|
this.authorizedByAPIKey('update', 'PUT TEMPLATE'),
|
2017-10-05 18:12:21 +08:00
|
|
|
this.update.bind(this)
|
|
|
|
);
|
|
|
|
|
|
|
|
app.get(
|
|
|
|
app.base_url_templated + '/:template_id',
|
|
|
|
cors(),
|
|
|
|
userMiddleware,
|
2017-12-29 20:05:01 +08:00
|
|
|
this.authorizedByAPIKey('get', 'GET TEMPLATE'),
|
2017-10-05 18:12:21 +08:00
|
|
|
this.retrieve.bind(this)
|
|
|
|
);
|
|
|
|
|
|
|
|
app.delete(
|
|
|
|
app.base_url_templated + '/:template_id',
|
|
|
|
cors(),
|
|
|
|
userMiddleware,
|
2017-12-29 20:05:01 +08:00
|
|
|
this.authorizedByAPIKey('delete', 'DELETE TEMPLATE'),
|
2017-10-05 18:12:21 +08:00
|
|
|
this.destroy.bind(this)
|
|
|
|
);
|
2017-09-22 22:45:34 +08:00
|
|
|
|
2017-10-05 18:12:21 +08:00
|
|
|
app.get(
|
|
|
|
app.base_url_templated + '/',
|
2017-09-22 22:45:34 +08:00
|
|
|
cors(),
|
2017-10-05 18:12:21 +08:00
|
|
|
userMiddleware,
|
2017-12-29 20:05:01 +08:00
|
|
|
this.authorizedByAPIKey('list', 'GET TEMPLATE LIST'),
|
2017-10-05 18:12:21 +08:00
|
|
|
this.list.bind(this)
|
2017-09-22 22:45:34 +08:00
|
|
|
);
|
|
|
|
|
2017-10-05 18:12:21 +08:00
|
|
|
app.options(
|
|
|
|
app.base_url_templated + '/:template_id',
|
|
|
|
cors('Content-Type')
|
|
|
|
);
|
2015-07-08 19:11:57 +08:00
|
|
|
};
|
|
|
|
|
2017-12-29 22:19:52 +08:00
|
|
|
NamedMapsAdminController.prototype.authorizedByAPIKey = function (action, label) {
|
|
|
|
return function authorizedByAPIKeyMiddleware (req, res, next) {
|
|
|
|
const { user } = res.locals;
|
|
|
|
|
|
|
|
this.authApi.authorizedByAPIKey(user, req, (err, authenticated) => {
|
|
|
|
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();
|
|
|
|
});
|
|
|
|
}.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();
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2017-09-21 17:46:31 +08:00
|
|
|
NamedMapsAdminController.prototype.create = function(req, res, next) {
|
2017-12-29 22:17:29 +08:00
|
|
|
const cdbuser = res.locals.user;
|
|
|
|
const cfg = req.body;
|
2015-07-08 19:11:57 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
this.templateMaps.addTemplate(cdbuser, cfg, (err, tpl_id) => {
|
|
|
|
if (err) {
|
|
|
|
return next(err);
|
|
|
|
}
|
2017-12-29 22:04:44 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
res.status(200);
|
2017-12-29 22:04:44 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
const method = req.query.callback ? 'jsonp' : 'json';
|
|
|
|
res[method]({ template_id: tpl_id });
|
|
|
|
});
|
2015-07-08 19:11:57 +08:00
|
|
|
};
|
|
|
|
|
2017-09-21 17:46:31 +08:00
|
|
|
NamedMapsAdminController.prototype.update = function(req, res, next) {
|
2017-12-29 22:17:29 +08:00
|
|
|
const cdbuser = res.locals.user;
|
|
|
|
const template = req.body;
|
|
|
|
const tpl_id = templateName(req.params.template_id);
|
2016-03-11 18:06:51 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
this.templateMaps.updTemplate(cdbuser, tpl_id, template, (err) => {
|
|
|
|
if (err) {
|
|
|
|
return next(err);
|
|
|
|
}
|
2015-07-08 19:11:57 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
res.status(200);
|
2017-12-29 22:04:44 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
const method = req.query.callback ? 'jsonp' : 'json';
|
|
|
|
res[method]({ template_id: tpl_id });
|
|
|
|
});
|
2015-07-08 19:11:57 +08:00
|
|
|
};
|
|
|
|
|
2017-09-21 17:46:31 +08:00
|
|
|
NamedMapsAdminController.prototype.retrieve = function(req, res, next) {
|
2017-03-31 02:31:53 +08:00
|
|
|
req.profiler.start('windshaft-cartodb.get_template');
|
2015-07-08 19:11:57 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
const cdbuser = res.locals.user;
|
|
|
|
const tpl_id = templateName(req.params.template_id);
|
|
|
|
|
|
|
|
this.templateMaps.getTemplate(cdbuser, tpl_id, (err, tpl_val) => {
|
|
|
|
if (err) {
|
|
|
|
return next(err);
|
2017-12-29 22:04:44 +08:00
|
|
|
}
|
2017-12-29 22:17:29 +08:00
|
|
|
|
|
|
|
if (!tpl_val) {
|
|
|
|
const error = new Error(`Cannot find template '${tpl_id}' of user '${cdbuser}'`);
|
|
|
|
error.http_status = 404;
|
|
|
|
return next(error);
|
|
|
|
}
|
|
|
|
// auth_id was added by ourselves,
|
|
|
|
// so we remove it before returning to the user
|
|
|
|
delete tpl_val.auth_id;
|
|
|
|
|
|
|
|
res.status(200);
|
|
|
|
|
|
|
|
const method = req.query.callback ? 'jsonp' : 'json';
|
|
|
|
res[method]({ template: tpl_val });
|
|
|
|
});
|
2015-07-08 19:11:57 +08:00
|
|
|
};
|
|
|
|
|
2017-09-21 17:46:31 +08:00
|
|
|
NamedMapsAdminController.prototype.destroy = function(req, res, next) {
|
2017-03-31 02:31:53 +08:00
|
|
|
req.profiler.start('windshaft-cartodb.delete_template');
|
2015-07-08 19:11:57 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
const cdbuser = res.locals.user;
|
|
|
|
const tpl_id = templateName(req.params.template_id);
|
2017-12-29 22:04:44 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
this.templateMaps.delTemplate(cdbuser, tpl_id, (err/*, tpl_val*/) => {
|
|
|
|
if (err) {
|
|
|
|
return next(err);
|
2017-12-29 22:04:44 +08:00
|
|
|
}
|
2017-12-29 22:17:29 +08:00
|
|
|
|
|
|
|
res.status(204);
|
|
|
|
|
|
|
|
const method = req.query.callback ? 'jsonp' : 'json';
|
|
|
|
res[method]('');
|
|
|
|
});
|
2015-07-08 19:11:57 +08:00
|
|
|
};
|
|
|
|
|
2017-09-21 17:46:31 +08:00
|
|
|
NamedMapsAdminController.prototype.list = function(req, res, next) {
|
2017-03-31 02:31:53 +08:00
|
|
|
req.profiler.start('windshaft-cartodb.get_template_list');
|
2015-07-08 19:11:57 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
const cdbuser = res.locals.user;
|
2015-07-08 19:11:57 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
this.templateMaps.listTemplates(cdbuser, (err, tpl_ids) => {
|
|
|
|
if (err) {
|
|
|
|
return next(err);
|
|
|
|
}
|
2017-12-29 22:04:44 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
res.status(200);
|
2017-12-29 22:04:44 +08:00
|
|
|
|
2017-12-29 22:17:29 +08:00
|
|
|
const method = req.query.callback ? 'jsonp' : 'json';
|
|
|
|
res[method]({ template_ids: tpl_ids });
|
|
|
|
});
|
2015-07-08 19:11:57 +08:00
|
|
|
};
|