Merge pull request #983 from CartoDB/tilejson-url-apikey
tiles base urls with api keys
This commit is contained in:
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user