Merge pull request #983 from CartoDB/tilejson-url-apikey

tiles base urls with api keys
This commit is contained in:
Simon Martín
2018-06-26 10:37:04 +02:00
committed by GitHub
4 changed files with 58 additions and 8 deletions
+1
View File
@@ -38,6 +38,7 @@ New features:
- strftime: 0.10.0
- Optional instantiation metadata stats (https://github.com/CartoDB/Windshaft-cartodb/pull/952)
- Experimental dates_as_numbers support
- Tiles base urls with api key
Bug Fixes:
- Validates tile coordinates (z/x/y) from request params to be a valid integer value.
@@ -1,6 +1,6 @@
module.exports = function setMetadataToLayergroup (layergroupMetadata, includeQuery) {
return function setMetadataToLayergroupMiddleware (req, res, next) {
const { user, mapConfig, analysesResults = [], context } = res.locals;
const { user, mapConfig, analysesResults = [], context, api_key: userApiKey } = res.locals;
const layergroup = res.body;
layergroupMetadata.addDataviewsAndWidgetsUrls(user, layergroup, mapConfig.obj());
@@ -8,7 +8,7 @@ module.exports = function setMetadataToLayergroup (layergroupMetadata, includeQu
layergroupMetadata.addTurboCartoContextMetadata(layergroup, mapConfig.obj(), context);
layergroupMetadata.addAggregationContextMetadata(layergroup, mapConfig.obj(), context);
layergroupMetadata.addDateWrappingMetadata (layergroup, mapConfig.obj());
layergroupMetadata.addTileJsonMetadata(layergroup, user, mapConfig);
layergroupMetadata.addTileJsonMetadata(layergroup, user, mapConfig, userApiKey);
next();
};
+9 -6
View File
@@ -1,4 +1,5 @@
const dateWrapper = require('./date-wrapper');
const querystring = require('querystring');
module.exports = class LayergroupMetadata {
constructor (resourceLocator) {
@@ -84,16 +85,18 @@ module.exports = class LayergroupMetadata {
}
}
addTileJsonMetadata (layergroup, user, mapconfig) {
addTileJsonMetadata (layergroup, user, mapconfig, userApiKey = null) {
const isVectorOnlyMapConfig = mapconfig.isVectorOnlyMapConfig();
let hasMapnikLayers = false;
const apiKey = userApiKey ? '?' + querystring.stringify({api_key: userApiKey}) : '';
layergroup.metadata.layers.forEach((layerMetadata, index) => {
const layerId = mapconfig.getLayerId(index);
const rasterResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.png`;
const rasterResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.png${apiKey}`;
if (mapconfig.layerType(index) === 'mapnik') {
hasMapnikLayers = true;
const vectorResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.mvt`;
const vectorResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.mvt${apiKey}`;
const layerTilejson = {
vector: this._getTilejson(this.resourceLocator.getTileUrls(user, vectorResource))
};
@@ -101,7 +104,7 @@ module.exports = class LayergroupMetadata {
let grids = null;
const layer = mapconfig.getLayer(index);
if (layer.options.interactivity) {
const gridResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.grid.json`;
const gridResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.grid.json${apiKey}`;
grids = this.resourceLocator.getTileUrls(user, gridResource);
}
layerTilejson.raster = this._getTilejson(
@@ -121,14 +124,14 @@ module.exports = class LayergroupMetadata {
const url = {};
if (hasMapnikLayers) {
const vectorResource = `${layergroup.layergroupid}/{z}/{x}/{y}.mvt`;
const vectorResource = `${layergroup.layergroupid}/{z}/{x}/{y}.mvt${apiKey}`;
tilejson.vector = this._getTilejson(
this.resourceLocator.getTileUrls(user, vectorResource)
);
url.vector = this._getTemplateUrl(this.resourceLocator.getTemplateUrls(user, vectorResource));
if (!isVectorOnlyMapConfig) {
const rasterResource = `${layergroup.layergroupid}/{z}/{x}/{y}.png`;
const rasterResource = `${layergroup.layergroupid}/{z}/{x}/{y}.png${apiKey}`;
tilejson.raster = this._getTilejson(
this.resourceLocator.getTileUrls(user, rasterResource)
);
+46
View File
@@ -0,0 +1,46 @@
require('../support/test_helper');
const assert = require('../support/assert');
const TestClient = require('../support/test-client');
describe('layergroup metadata', function () {
[1234, 'default_public', false].forEach(api_key => {
it(`tiles base urls ${api_key ? `with api key: ${api_key}` : 'without api key'}`, function (done) {
const mapConfig = {
version: '1.7.0',
layers: [
{
type: 'cartodb',
options: {
sql: 'select * from populated_places_simple_reduced',
}
}
]
};
const host = `https://localhost.localhost.lan:${global.environment.port}`;
const testClient = new TestClient(mapConfig, api_key);
testClient.getLayergroup((err, body) => {
if (err) {
return done(err);
}
let urlLayer = `${host}/api/v1/map/${body.layergroupid}/layer0/{z}/{x}/{y}.mvt`;
let urlNoLayer = `${host}/api/v1/map/${body.layergroupid}/{z}/{x}/{y}.mvt`;
if (api_key) {
urlLayer += `?api_key=${api_key}`;
urlNoLayer += `?api_key=${api_key}`;
}
assert.ok(body.layergroupid);
assert.equal(body.metadata.layers[0].tilejson.vector.tiles[0], urlLayer);
assert.equal(body.metadata.tilejson.vector.tiles[0], urlNoLayer);
assert.equal(body.metadata.url.vector.urlTemplate, urlNoLayer);
testClient.drain(done);
});
});
});
});