diff --git a/NEWS.md b/NEWS.md index eb9626fe..311a4842 100644 --- a/NEWS.md +++ b/NEWS.md @@ -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. diff --git a/lib/cartodb/api/middlewares/layergroup-metadata.js b/lib/cartodb/api/middlewares/layergroup-metadata.js index bbb1fbe4..a9cec443 100644 --- a/lib/cartodb/api/middlewares/layergroup-metadata.js +++ b/lib/cartodb/api/middlewares/layergroup-metadata.js @@ -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(); }; diff --git a/lib/cartodb/utils/layergroup-metadata.js b/lib/cartodb/utils/layergroup-metadata.js index 41c3c9af..ee2e78c4 100644 --- a/lib/cartodb/utils/layergroup-metadata.js +++ b/lib/cartodb/utils/layergroup-metadata.js @@ -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) ); diff --git a/test/acceptance/layergroup-metadata.js b/test/acceptance/layergroup-metadata.js new file mode 100644 index 00000000..4da60ef4 --- /dev/null +++ b/test/acceptance/layergroup-metadata.js @@ -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); + }); + }); + }); +});