From 74b2f305eac25bc88bbc907e242df500b7f57787 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 7 Mar 2018 19:09:52 +0100 Subject: [PATCH 1/7] Extract initProfiler middleware from map-controller --- lib/cartodb/controllers/map.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index a9077339..9c2168d5 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -72,7 +72,7 @@ MapController.prototype.composeCreateMapMiddleware = function (useTemplate = fal userMiddleware(), allowQueryParams(['aggregation']), this.prepareContext, - this.initProfiler(isTemplateInstantiation), + initProfiler(isTemplateInstantiation), this.checkJsonContentType(), useTemplate ? this.checkInstantiteLayergroup() : this.checkCreateLayergroup(), useTemplate ? this.getTemplate() : this.prepareAdapterMapConfig(), @@ -97,7 +97,7 @@ MapController.prototype.composeCreateMapMiddleware = function (useTemplate = fal ]; }; -MapController.prototype.initProfiler = function (isTemplateInstantiation) { +function initProfiler (isTemplateInstantiation) { const operation = isTemplateInstantiation ? 'instance_template' : 'createmap'; return function initProfilerMiddleware (req, res, next) { @@ -105,7 +105,7 @@ MapController.prototype.initProfiler = function (isTemplateInstantiation) { req.profiler.done(`${operation}.initProfilerMiddleware`); next(); }; -}; +} MapController.prototype.checkJsonContentType = function () { return function checkJsonContentTypeMiddleware(req, res, next) { From d26910ba9c31fce342a5a21e235a3ec7e289d583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 7 Mar 2018 19:11:03 +0100 Subject: [PATCH 2/7] Extract checkJsonContentType middleware from MapController class --- lib/cartodb/controllers/map.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 9c2168d5..6650fd20 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -73,7 +73,7 @@ MapController.prototype.composeCreateMapMiddleware = function (useTemplate = fal allowQueryParams(['aggregation']), this.prepareContext, initProfiler(isTemplateInstantiation), - this.checkJsonContentType(), + checkJsonContentType(), useTemplate ? this.checkInstantiteLayergroup() : this.checkCreateLayergroup(), useTemplate ? this.getTemplate() : this.prepareAdapterMapConfig(), useTemplate ? this.instantiateLayergroup() : this.createLayergroup(), @@ -107,7 +107,7 @@ function initProfiler (isTemplateInstantiation) { }; } -MapController.prototype.checkJsonContentType = function () { +function checkJsonContentType () { return function checkJsonContentTypeMiddleware(req, res, next) { if (req.method === 'POST' && !req.is('application/json')) { return next(new Error('POST data must be of type application/json')); @@ -117,7 +117,7 @@ MapController.prototype.checkJsonContentType = function () { next(); }; -}; +} MapController.prototype.checkInstantiteLayergroup = function () { return function checkInstantiteLayergroupMiddleware(req, res, next) { From 363cb0b6792d8a4a212d0e7fcb9fadaf00a64ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Thu, 8 Mar 2018 12:16:24 +0100 Subject: [PATCH 3/7] Extract middlewares from map-controller class --- lib/cartodb/controllers/map.js | 359 +++++++++++++++++---------------- 1 file changed, 186 insertions(+), 173 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 6650fd20..94e74657 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -74,26 +74,38 @@ MapController.prototype.composeCreateMapMiddleware = function (useTemplate = fal this.prepareContext, initProfiler(isTemplateInstantiation), checkJsonContentType(), - useTemplate ? this.checkInstantiteLayergroup() : this.checkCreateLayergroup(), - useTemplate ? this.getTemplate() : this.prepareAdapterMapConfig(), - useTemplate ? this.instantiateLayergroup() : this.createLayergroup(), - this.incrementMapViewCount(), - this.augmentLayergroupData(), - this.getAffectedTables(), - this.setCacheChannel(), - this.setLastModified(), - this.setLastUpdatedTimeToLayergroup(), - this.setCacheControl(), - this.setLayerStats(), - this.setLayergroupIdHeader(useTemplateHash), - this.setDataviewsAndWidgetsUrlsToLayergroupMetadata(), - this.setAnalysesMetadataToLayergroup(includeQuery), - this.setTurboCartoMetadataToLayergroup(), - this.setAggregationMetadataToLayergroup(), - this.setTilejsonMetadataToLayergroup(), - this.setSurrogateKeyHeader(), - this.sendResponse(), - this.augmentError({ label, addContext }) + useTemplate ? + checkInstantiteLayergroup() : + checkCreateLayergroup(), + useTemplate ? + getTemplate( + this.templateMaps, + this.pgConnection, + this.metadataBackend, + this.userLimitsApi, + this.mapConfigAdapter + ) : + prepareAdapterMapConfig(this.mapConfigAdapter), + useTemplate ? + instantiateLayergroup(this.mapBackend, this.userLimitsApi) : + createLayergroup (this.mapBackend, this.userLimitsApi), + incrementMapViewCount(this.metadataBackend), + augmentLayergroupData(), + getAffectedTables(this.pgConnection, this.layergroupAffectedTables), + setCacheChannel(), + setLastModified(), + setLastUpdatedTimeToLayergroup(), + setCacheControl(), + setLayerStats(this.pgConnection, this.statsBackend), + setLayergroupIdHeader(this.templateMaps ,useTemplateHash), + setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.resourceLocator), + setAnalysesMetadataToLayergroup(this.resourceLocator, includeQuery), + setTurboCartoMetadataToLayergroup(), + setAggregationMetadataToLayergroup(), + setTilejsonMetadataToLayergroup(this.resourceLocator), + setSurrogateKeyHeader(this.surrogateKeysCache), + sendResponse(), + augmentError({ label, addContext }) ]; }; @@ -119,7 +131,7 @@ function checkJsonContentType () { }; } -MapController.prototype.checkInstantiteLayergroup = function () { +function checkInstantiteLayergroup () { return function checkInstantiteLayergroupMiddleware(req, res, next) { if (req.method === 'GET') { const { callback, config } = req.query; @@ -141,9 +153,9 @@ MapController.prototype.checkInstantiteLayergroup = function () { return next(); }; -}; +} -MapController.prototype.checkCreateLayergroup = function () { +function checkCreateLayergroup () { return function checkCreateLayergroupMiddleware (req, res, next) { if (req.method === 'GET') { const { config } = res.locals; @@ -162,19 +174,19 @@ MapController.prototype.checkCreateLayergroup = function () { req.profiler.done('checkCreateLayergroup'); return next(); }; -}; +} -MapController.prototype.getTemplate = function () { +function getTemplate (templateMaps, pgConnection, metadataBackend, userLimitsApi, mapConfigAdapter) { return function getTemplateMiddleware (req, res, next) { const templateParams = req.body; const { user } = res.locals; const mapconfigProvider = new NamedMapMapConfigProvider( - this.templateMaps, - this.pgConnection, - this.metadataBackend, - this.userLimitsApi, - this.mapConfigAdapter, + templateMaps, + pgConnection, + metadataBackend, + userLimitsApi, + mapConfigAdapter, user, req.params.template_id, templateParams, @@ -194,10 +206,10 @@ MapController.prototype.getTemplate = function () { next(); }); - }.bind(this); -}; + }; +} -MapController.prototype.prepareAdapterMapConfig = function () { +function prepareAdapterMapConfig (mapConfigAdapter) { return function prepareAdapterMapConfigMiddleware(req, res, next) { const requestMapConfig = req.body; const { user, dbhost, dbport, dbname, dbuser, dbpassword, api_key } = res.locals; @@ -219,7 +231,7 @@ MapController.prototype.prepareAdapterMapConfig = function () { } }; - this.mapConfigAdapter.getMapConfig(user, requestMapConfig, res.locals, context, (err, requestMapConfig) => { + mapConfigAdapter.getMapConfig(user, requestMapConfig, res.locals, context, (err, requestMapConfig) => { req.profiler.done('anonymous.getMapConfig'); if (err) { return next(err); @@ -230,22 +242,22 @@ MapController.prototype.prepareAdapterMapConfig = function () { next(); }); - }.bind(this); -}; + }; +} -MapController.prototype.createLayergroup = function () { +function createLayergroup (mapBackend, userLimitsApi) { return function createLayergroupMiddleware (req, res, next) { const requestMapConfig = req.body; const { context, user } = res.locals; const datasource = context.datasource || Datasource.EmptyDatasource(); const mapconfig = new MapConfig(requestMapConfig, datasource); const mapconfigProvider = - new CreateLayergroupMapConfigProvider(mapconfig, user, this.userLimitsApi, res.locals); + new CreateLayergroupMapConfigProvider(mapconfig, user, userLimitsApi, res.locals); res.locals.mapconfig = mapconfig; res.locals.analysesResults = context.analysesResults; - this.mapBackend.createLayergroup(mapconfig, res.locals, mapconfigProvider, (err, layergroup) => { + mapBackend.createLayergroup(mapconfig, res.locals, mapconfigProvider, (err, layergroup) => { req.profiler.done('createLayergroup'); if (err) { return next(err); @@ -255,16 +267,16 @@ MapController.prototype.createLayergroup = function () { next(); }); - }.bind(this); -}; + }; +} -MapController.prototype.instantiateLayergroup = function () { +function instantiateLayergroup (mapBackend, userLimitsApi) { return function instantiateLayergroupMiddleware (req, res, next) { const { user, mapconfig, rendererParams } = res.locals; const mapconfigProvider = - new CreateLayergroupMapConfigProvider(mapconfig, user, this.userLimitsApi, rendererParams); + new CreateLayergroupMapConfigProvider(mapconfig, user, userLimitsApi, rendererParams); - this.mapBackend.createLayergroup(mapconfig, rendererParams, mapconfigProvider, (err, layergroup) => { + mapBackend.createLayergroup(mapconfig, rendererParams, mapconfigProvider, (err, layergroup) => { req.profiler.done('createLayergroup'); if (err) { return next(err); @@ -281,15 +293,15 @@ MapController.prototype.instantiateLayergroup = function () { next(); }); - }.bind(this); -}; + }; +} -MapController.prototype.incrementMapViewCount = function () { +function incrementMapViewCount (metadataBackend) { return function incrementMapViewCountMiddleware(req, res, next) { const { mapconfig, user } = res.locals; // Error won't blow up, just be logged. - this.metadataBackend.incMapviewCount(user, mapconfig.obj().stat_tag, (err) => { + metadataBackend.incMapviewCount(user, mapconfig.obj().stat_tag, (err) => { req.profiler.done('incMapviewCount'); if (err) { @@ -298,10 +310,10 @@ MapController.prototype.incrementMapViewCount = function () { next(); }); - }.bind(this); -}; + }; +} -MapController.prototype.augmentLayergroupData = function () { +function augmentLayergroupData () { return function augmentLayergroupDataMiddleware (req, res, next) { const { layergroup } = res.locals; @@ -312,7 +324,7 @@ MapController.prototype.augmentLayergroupData = function () { next(); }; -}; +} function getTemplateUrl(url) { return url.https || url.http; @@ -331,72 +343,11 @@ function getTilejson(tiles, grids) { return tilejson; } -MapController.prototype.setTilejsonMetadataToLayergroup = function () { - return function augmentLayergroupTilejsonMiddleware (req, res, next) { - const { layergroup, user, mapconfig } = res.locals; - - const isVectorOnlyMapConfig = mapconfig.isVectorOnlyMapConfig(); - let hasMapnikLayers = false; - layergroup.metadata.layers.forEach((layerMetadata, index) => { - const layerId = mapconfig.getLayerId(index); - const rasterResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.png`; - if (mapconfig.layerType(index) === 'mapnik') { - hasMapnikLayers = true; - const vectorResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.mvt`; - const layerTilejson = { - vector: getTilejson(this.resourceLocator.getTileUrls(user, vectorResource)) - }; - if (!isVectorOnlyMapConfig) { - let grids = null; - const layer = mapconfig.getLayer(index); - if (layer.options.interactivity) { - const gridResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.grid.json`; - grids = this.resourceLocator.getTileUrls(user, gridResource); - } - layerTilejson.raster = getTilejson( - this.resourceLocator.getTileUrls(user, rasterResource), - grids - ); - } - layerMetadata.tilejson = layerTilejson; - } else { - layerMetadata.tilejson = { - raster: getTilejson(this.resourceLocator.getTileUrls(user, rasterResource)) - }; - } - }); - - const tilejson = {}; - const url = {}; - - if (hasMapnikLayers) { - const vectorResource = `${layergroup.layergroupid}/{z}/{x}/{y}.mvt`; - tilejson.vector = getTilejson( - this.resourceLocator.getTileUrls(user, vectorResource) - ); - url.vector = getTemplateUrl(this.resourceLocator.getTemplateUrls(user, vectorResource)); - - if (!isVectorOnlyMapConfig) { - const rasterResource = `${layergroup.layergroupid}/{z}/{x}/{y}.png`; - tilejson.raster = getTilejson( - this.resourceLocator.getTileUrls(user, rasterResource) - ); - url.raster = getTemplateUrl(this.resourceLocator.getTemplateUrls(user, rasterResource)); - } - } - - layergroup.metadata.tilejson = tilejson; - layergroup.metadata.url = url; - - next(); - }.bind(this); -}; - -MapController.prototype.getAffectedTables = function () { +function getAffectedTables (pgConnection, layergroupAffectedTables) { return function getAffectedTablesMiddleware (req, res, next) { const { dbname, layergroup, user, mapconfig } = res.locals; - this.pgConnection.getConnection(user, (err, connection) => { + pgConnection.getConnection(user, (err, connection) => { if (err) { return next(err); } @@ -418,17 +369,17 @@ MapController.prototype.getAffectedTables = function () { } // feed affected tables cache so it can be reused from, for instance, layergroup controller - this.layergroupAffectedTables.set(dbname, layergroup.layergroupId, affectedTables); + layergroupAffectedTables.set(dbname, layergroup.layergroupId, affectedTables); res.locals.affectedTables = affectedTables; next(); }); }); - }.bind(this); -}; + }; +} -MapController.prototype.setCacheChannel = function () { +function setCacheChannel () { return function setCacheChannelMiddleware (req, res, next) { const { affectedTables } = res.locals; @@ -438,9 +389,9 @@ MapController.prototype.setCacheChannel = function () { next(); }; -}; +} -MapController.prototype.setLastModified = function () { +function setLastModified () { return function setLastModifiedMiddleware (req, res, next) { if (req.method === 'GET') { res.set('Last-Modified', (new Date()).toUTCString()); @@ -448,9 +399,9 @@ MapController.prototype.setLastModified = function () { next(); }; -}; +} -MapController.prototype.setLastUpdatedTimeToLayergroup = function () { +function setLastUpdatedTimeToLayergroup () { return function setLastUpdatedTimeToLayergroupMiddleware (req, res, next) { const { affectedTables, layergroup, analysesResults } = res.locals; @@ -464,7 +415,7 @@ MapController.prototype.setLastUpdatedTimeToLayergroup = function () { next(); }; -}; +} function getLastUpdatedTime(analysesResults, lastUpdateTime) { if (!Array.isArray(analysesResults)) { @@ -479,7 +430,7 @@ function getLastUpdatedTime(analysesResults, lastUpdateTime) { }, lastUpdateTime); } -MapController.prototype.setCacheControl = function () { +function setCacheControl () { return function setCacheControlMiddleware (req, res, next) { if (req.method === 'GET') { var ttl = global.environment.varnish.layergroupTtl || 86400; @@ -488,18 +439,18 @@ MapController.prototype.setCacheControl = function () { next(); }; -}; +} -MapController.prototype.setLayerStats = function () { +function setLayerStats (pgConnection, statsBackend) { return function setLayerStatsMiddleware(req, res, next) { const { user, mapconfig, layergroup } = res.locals; - this.pgConnection.getConnection(user, (err, connection) => { + pgConnection.getConnection(user, (err, connection) => { if (err) { return next(err); } - this.statsBackend.getStats(mapconfig, connection, function(err, layersStats) { + statsBackend.getStats(mapconfig, connection, function(err, layersStats) { if (err) { return next(err); } @@ -513,53 +464,54 @@ MapController.prototype.setLayerStats = function () { next(); }); }); - }.bind(this); -}; + }; +} -MapController.prototype.setLayergroupIdHeader = function (useTemplateHash) { +function setLayergroupIdHeader (templateMaps, useTemplateHash) { return function setLayergroupIdHeaderMiddleware (req, res, next) { const { layergroup, user, template } = res.locals; if (useTemplateHash) { - var templateHash = this.templateMaps.fingerPrint(template).substring(0, 8); + var templateHash = templateMaps.fingerPrint(template).substring(0, 8); layergroup.layergroupid = `${user}@${templateHash}@${layergroup.layergroupid}`; } res.set('X-Layergroup-Id', layergroup.layergroupid); next(); - }.bind(this); -}; + }; +} -MapController.prototype.setDataviewsAndWidgetsUrlsToLayergroupMetadata = function () { +function setDataviewsAndWidgetsUrlsToLayergroupMetadata (resourceLocator) { return function setDataviewsAndWidgetsUrlsToLayergroupMetadataMiddleware (req, res, next) { const { layergroup, user, mapconfig } = res.locals; - this.addDataviewsAndWidgetsUrls(user, layergroup, mapconfig.obj()); + addDataviewsAndWidgetsUrls(resourceLocator, user, layergroup, mapconfig.obj()); next(); - }.bind(this); + }; }; // TODO this should take into account several URL patterns -MapController.prototype.addDataviewsAndWidgetsUrls = function(username, layergroup, mapConfig) { - this.addDataviewsUrls(username, layergroup, mapConfig); - this.addWidgetsUrl(username, layergroup, mapConfig); -}; +function addDataviewsAndWidgetsUrls (resourceLocator, username, layergroup, mapConfig) { + addDataviewsUrls(resourceLocator, username, layergroup, mapConfig); + addWidgetsUrl(resourceLocator, username, layergroup, mapConfig); +} -MapController.prototype.addDataviewsUrls = function(username, layergroup, mapConfig) { + +function addDataviewsUrls (resourceLocator, username, layergroup, mapConfig) { layergroup.metadata.dataviews = layergroup.metadata.dataviews || {}; var dataviews = mapConfig.dataviews || {}; Object.keys(dataviews).forEach(function(dataviewName) { var resource = layergroup.layergroupid + '/dataview/' + dataviewName; layergroup.metadata.dataviews[dataviewName] = { - url: this.resourceLocator.getUrls(username, resource) + url: resourceLocator.getUrls(username, resource) }; - }.bind(this)); -}; + }); +} -MapController.prototype.addWidgetsUrl = function(username, layergroup, mapConfig) { +function addWidgetsUrl (resourceLocator, username, layergroup, mapConfig) { if (layergroup.metadata && Array.isArray(layergroup.metadata.layers) && Array.isArray(mapConfig.layers)) { layergroup.metadata.layers = layergroup.metadata.layers.map(function(layer, layerIndex) { var mapConfigLayer = mapConfig.layers[layerIndex]; @@ -569,26 +521,26 @@ MapController.prototype.addWidgetsUrl = function(username, layergroup, mapConfig var resource = layergroup.layergroupid + '/' + layerIndex + '/widget/' + widgetName; layer.widgets[widgetName] = { type: mapConfigLayer.options.widgets[widgetName].type, - url: this.resourceLocator.getUrls(username, resource) + url: resourceLocator.getUrls(username, resource) }; - }.bind(this)); + }); } return layer; - }.bind(this)); + }); } -}; +} -MapController.prototype.setAnalysesMetadataToLayergroup = function (includeQuery) { +function setAnalysesMetadataToLayergroup (resourceLocator, includeQuery) { return function setAnalysesMetadataToLayergroupMiddleware (req, res, next) { const { layergroup, user, analysesResults = [] } = res.locals; - this.addAnalysesMetadata(user, layergroup, analysesResults, includeQuery); + addAnalysesMetadata(resourceLocator, user, layergroup, analysesResults, includeQuery); next(); - }.bind(this); -}; + }; +} -MapController.prototype.addAnalysesMetadata = function(username, layergroup, analysesResults, includeQuery) { +function addAnalysesMetadata (resourceLocator, username, layergroup, analysesResults, includeQuery) { includeQuery = includeQuery || false; analysesResults = analysesResults || []; layergroup.metadata.analyses = []; @@ -601,7 +553,7 @@ MapController.prototype.addAnalysesMetadata = function(username, layergroup, ana var nodeResource = layergroup.layergroupid + '/analysis/node/' + node.id(); var nodeRepr = { status: node.getStatus(), - url: this.resourceLocator.getUrls(username, nodeResource) + url: resourceLocator.getUrls(username, nodeResource) }; if (includeQuery) { nodeRepr.query = node.getQuery(); @@ -613,12 +565,12 @@ MapController.prototype.addAnalysesMetadata = function(username, layergroup, ana } return nodesIdMap; - }.bind(this), {}) + }, {}) }); - }.bind(this)); -}; + }); +} -MapController.prototype.setTurboCartoMetadataToLayergroup = function () { +function setTurboCartoMetadataToLayergroup () { return function setTurboCartoMetadataToLayergroupMiddleware (req, res, next) { const { layergroup, mapconfig, context } = res.locals; @@ -626,7 +578,7 @@ MapController.prototype.setTurboCartoMetadataToLayergroup = function () { next(); }; -}; +} function addTurboCartoContextMetadata(layergroup, mapConfig, context) { if (layergroup.metadata && Array.isArray(layergroup.metadata.layers) && Array.isArray(mapConfig.layers)) { @@ -640,7 +592,7 @@ function addTurboCartoContextMetadata(layergroup, mapConfig, context) { } // TODO: see how evolve this function, it's a good candidate to be refactored -MapController.prototype.setAggregationMetadataToLayergroup = function () { +function setAggregationMetadataToLayergroup () { return function setAggregationMetadataToLayergroupMiddleware (req, res, next) { const { layergroup, mapconfig, context } = res.locals; @@ -648,7 +600,7 @@ MapController.prototype.setAggregationMetadataToLayergroup = function () { next(); }; -}; +} function addAggregationContextMetadata(layergroup, mapConfig, context) { if (layergroup.metadata && Array.isArray(layergroup.metadata.layers) && Array.isArray(mapConfig.layers)) { @@ -661,23 +613,84 @@ function addAggregationContextMetadata(layergroup, mapConfig, context) { } } -MapController.prototype.setSurrogateKeyHeader = function () { +function setTilejsonMetadataToLayergroup (resourceLocator) { + return function augmentLayergroupTilejsonMiddleware (req, res, next) { + const { layergroup, user, mapconfig } = res.locals; + + const isVectorOnlyMapConfig = mapconfig.isVectorOnlyMapConfig(); + let hasMapnikLayers = false; + layergroup.metadata.layers.forEach((layerMetadata, index) => { + const layerId = mapconfig.getLayerId(index); + const rasterResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.png`; + if (mapconfig.layerType(index) === 'mapnik') { + hasMapnikLayers = true; + const vectorResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.mvt`; + const layerTilejson = { + vector: getTilejson(resourceLocator.getTileUrls(user, vectorResource)) + }; + if (!isVectorOnlyMapConfig) { + let grids = null; + const layer = mapconfig.getLayer(index); + if (layer.options.interactivity) { + const gridResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.grid.json`; + grids = resourceLocator.getTileUrls(user, gridResource); + } + layerTilejson.raster = getTilejson( + resourceLocator.getTileUrls(user, rasterResource), + grids + ); + } + layerMetadata.tilejson = layerTilejson; + } else { + layerMetadata.tilejson = { + raster: getTilejson(resourceLocator.getTileUrls(user, rasterResource)) + }; + } + }); + + const tilejson = {}; + const url = {}; + + if (hasMapnikLayers) { + const vectorResource = `${layergroup.layergroupid}/{z}/{x}/{y}.mvt`; + tilejson.vector = getTilejson( + resourceLocator.getTileUrls(user, vectorResource) + ); + url.vector = getTemplateUrl(resourceLocator.getTemplateUrls(user, vectorResource)); + + if (!isVectorOnlyMapConfig) { + const rasterResource = `${layergroup.layergroupid}/{z}/{x}/{y}.png`; + tilejson.raster = getTilejson( + resourceLocator.getTileUrls(user, rasterResource) + ); + url.raster = getTemplateUrl(resourceLocator.getTemplateUrls(user, rasterResource)); + } + } + + layergroup.metadata.tilejson = tilejson; + layergroup.metadata.url = url; + + next(); + }; +} + +function setSurrogateKeyHeader (surrogateKeysCache) { return function setSurrogateKeyHeaderMiddleware(req, res, next) { const { affectedTables, user, templateName } = res.locals; if (req.method === 'GET' && affectedTables.tables && affectedTables.tables.length > 0) { - this.surrogateKeysCache.tag(res, affectedTables); + surrogateKeysCache.tag(res, affectedTables); } if (templateName) { - this.surrogateKeysCache.tag(res, new NamedMapsCacheEntry(user, templateName)); + surrogateKeysCache.tag(res, new NamedMapsCacheEntry(user, templateName)); } next(); - }.bind(this); -}; + }; +} -MapController.prototype.sendResponse = function () { +function sendResponse () { return function sendResponseMiddleware (req, res) { req.profiler.done('res'); const { layergroup } = res.locals; @@ -690,9 +703,9 @@ MapController.prototype.sendResponse = function () { res.json(layergroup); } }; -}; +} -MapController.prototype.augmentError = function (options) { +function augmentError (options) { const { addContext = false, label = 'MAPS CONTROLLER' } = options; return function augmentErrorMiddleware (err, req, res, next) { @@ -707,7 +720,7 @@ MapController.prototype.augmentError = function (options) { next(err); }; -}; +} function populateError(err, mapConfig) { var error = new Error(err.message); From 02f93f3a14ae85bcb26c9db734a7c3900714f2b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 9 Mar 2018 12:58:05 +0100 Subject: [PATCH 4/7] Extract layergroup-metadata class --- lib/cartodb/controllers/map.js | 193 +++-------------------- lib/cartodb/utils/layergroup-metadata.js | 168 ++++++++++++++++++++ 2 files changed, 186 insertions(+), 175 deletions(-) create mode 100644 lib/cartodb/utils/layergroup-metadata.js diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 94e74657..01fe461b 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -15,6 +15,7 @@ var NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); var NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); var CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider'); +const LayergroupMetadata = require('../utils/layergroup-metadata'); /** * @param {AuthApi} authApi @@ -41,7 +42,8 @@ function MapController(prepareContext, pgConnection, templateMaps, mapBackend, m this.layergroupAffectedTables = layergroupAffectedTables; this.mapConfigAdapter = mapConfigAdapter; - this.resourceLocator = new ResourceLocator(global.environment); + const resourceLocator = new ResourceLocator(global.environment); + this.layergroupMetadata = new LayergroupMetadata(resourceLocator); this.statsBackend = statsBackend; this.prepareContext = prepareContext; @@ -98,11 +100,11 @@ MapController.prototype.composeCreateMapMiddleware = function (useTemplate = fal setCacheControl(), setLayerStats(this.pgConnection, this.statsBackend), setLayergroupIdHeader(this.templateMaps ,useTemplateHash), - setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.resourceLocator), - setAnalysesMetadataToLayergroup(this.resourceLocator, includeQuery), - setTurboCartoMetadataToLayergroup(), - setAggregationMetadataToLayergroup(), - setTilejsonMetadataToLayergroup(this.resourceLocator), + setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), + setAnalysesMetadataToLayergroup(this.layergroupMetadata, includeQuery), + setTurboCartoMetadataToLayergroup(this.layergroupMetadata), + setAggregationMetadataToLayergroup(this.layergroupMetadata), + setTilejsonMetadataToLayergroup(this.layergroupMetadata), setSurrogateKeyHeader(this.surrogateKeysCache), sendResponse(), augmentError({ label, addContext }) @@ -326,23 +328,6 @@ function augmentLayergroupData () { }; } -function getTemplateUrl(url) { - return url.https || url.http; -} - -function getTilejson(tiles, grids) { - const tilejson = { - tilejson: '2.2.0', - tiles: tiles.https || tiles.http - }; - - if (grids) { - tilejson.grids = grids.https || grids.http; - } - - return tilejson; -} - function getAffectedTables (pgConnection, layergroupAffectedTables) { return function getAffectedTablesMiddleware (req, res, next) { const { dbname, layergroup, user, mapconfig } = res.locals; @@ -482,193 +467,51 @@ function setLayergroupIdHeader (templateMaps, useTemplateHash) { }; } -function setDataviewsAndWidgetsUrlsToLayergroupMetadata (resourceLocator) { +function setDataviewsAndWidgetsUrlsToLayergroupMetadata (layergroupMetadata) { return function setDataviewsAndWidgetsUrlsToLayergroupMetadataMiddleware (req, res, next) { const { layergroup, user, mapconfig } = res.locals; - addDataviewsAndWidgetsUrls(resourceLocator, user, layergroup, mapconfig.obj()); + layergroupMetadata.addDataviewsAndWidgetsUrls(user, layergroup, mapconfig.obj()); next(); }; -}; - -// TODO this should take into account several URL patterns -function addDataviewsAndWidgetsUrls (resourceLocator, username, layergroup, mapConfig) { - addDataviewsUrls(resourceLocator, username, layergroup, mapConfig); - addWidgetsUrl(resourceLocator, username, layergroup, mapConfig); } - -function addDataviewsUrls (resourceLocator, username, layergroup, mapConfig) { - layergroup.metadata.dataviews = layergroup.metadata.dataviews || {}; - var dataviews = mapConfig.dataviews || {}; - - Object.keys(dataviews).forEach(function(dataviewName) { - var resource = layergroup.layergroupid + '/dataview/' + dataviewName; - layergroup.metadata.dataviews[dataviewName] = { - url: resourceLocator.getUrls(username, resource) - }; - }); -} - -function addWidgetsUrl (resourceLocator, username, layergroup, mapConfig) { - if (layergroup.metadata && Array.isArray(layergroup.metadata.layers) && Array.isArray(mapConfig.layers)) { - layergroup.metadata.layers = layergroup.metadata.layers.map(function(layer, layerIndex) { - var mapConfigLayer = mapConfig.layers[layerIndex]; - if (mapConfigLayer.options && mapConfigLayer.options.widgets) { - layer.widgets = layer.widgets || {}; - Object.keys(mapConfigLayer.options.widgets).forEach(function(widgetName) { - var resource = layergroup.layergroupid + '/' + layerIndex + '/widget/' + widgetName; - layer.widgets[widgetName] = { - type: mapConfigLayer.options.widgets[widgetName].type, - url: resourceLocator.getUrls(username, resource) - }; - }); - } - return layer; - }); - } -} - -function setAnalysesMetadataToLayergroup (resourceLocator, includeQuery) { +function setAnalysesMetadataToLayergroup (layergroupMetadata, includeQuery) { return function setAnalysesMetadataToLayergroupMiddleware (req, res, next) { const { layergroup, user, analysesResults = [] } = res.locals; - addAnalysesMetadata(resourceLocator, user, layergroup, analysesResults, includeQuery); + layergroupMetadata.addAnalysesMetadata(user, layergroup, analysesResults, includeQuery); next(); }; } -function addAnalysesMetadata (resourceLocator, username, layergroup, analysesResults, includeQuery) { - includeQuery = includeQuery || false; - analysesResults = analysesResults || []; - layergroup.metadata.analyses = []; - - analysesResults.forEach(function(analysis) { - var nodes = analysis.getNodes(); - layergroup.metadata.analyses.push({ - nodes: nodes.reduce(function(nodesIdMap, node) { - if (node.params.id) { - var nodeResource = layergroup.layergroupid + '/analysis/node/' + node.id(); - var nodeRepr = { - status: node.getStatus(), - url: resourceLocator.getUrls(username, nodeResource) - }; - if (includeQuery) { - nodeRepr.query = node.getQuery(); - } - if (node.getStatus() === 'failed') { - nodeRepr.error_message = node.getErrorMessage(); - } - nodesIdMap[node.params.id] = nodeRepr; - } - - return nodesIdMap; - }, {}) - }); - }); -} - -function setTurboCartoMetadataToLayergroup () { +function setTurboCartoMetadataToLayergroup (layergroupMetadata) { return function setTurboCartoMetadataToLayergroupMiddleware (req, res, next) { const { layergroup, mapconfig, context } = res.locals; - addTurboCartoContextMetadata(layergroup, mapconfig.obj(), context); + layergroupMetadata.addTurboCartoContextMetadata(layergroup, mapconfig.obj(), context); next(); }; } -function addTurboCartoContextMetadata(layergroup, mapConfig, context) { - if (layergroup.metadata && Array.isArray(layergroup.metadata.layers) && Array.isArray(mapConfig.layers)) { - layergroup.metadata.layers = layergroup.metadata.layers.map(function(layer, layerIndex) { - if (context.turboCarto && Array.isArray(context.turboCarto.layers)) { - layer.meta.cartocss_meta = context.turboCarto.layers[layerIndex]; - } - return layer; - }); - } -} - -// TODO: see how evolve this function, it's a good candidate to be refactored -function setAggregationMetadataToLayergroup () { +function setAggregationMetadataToLayergroup (layergroupMetadata) { return function setAggregationMetadataToLayergroupMiddleware (req, res, next) { const { layergroup, mapconfig, context } = res.locals; - addAggregationContextMetadata(layergroup, mapconfig.obj(), context); + layergroupMetadata.addAggregationContextMetadata(layergroup, mapconfig.obj(), context); next(); }; } -function addAggregationContextMetadata(layergroup, mapConfig, context) { - if (layergroup.metadata && Array.isArray(layergroup.metadata.layers) && Array.isArray(mapConfig.layers)) { - layergroup.metadata.layers = layergroup.metadata.layers.map(function(layer, layerIndex) { - if (context.aggregation && Array.isArray(context.aggregation.layers)) { - layer.meta.aggregation = context.aggregation.layers[layerIndex]; - } - return layer; - }); - } -} - -function setTilejsonMetadataToLayergroup (resourceLocator) { +function setTilejsonMetadataToLayergroup (layergroupMetadata) { return function augmentLayergroupTilejsonMiddleware (req, res, next) { const { layergroup, user, mapconfig } = res.locals; - const isVectorOnlyMapConfig = mapconfig.isVectorOnlyMapConfig(); - let hasMapnikLayers = false; - layergroup.metadata.layers.forEach((layerMetadata, index) => { - const layerId = mapconfig.getLayerId(index); - const rasterResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.png`; - if (mapconfig.layerType(index) === 'mapnik') { - hasMapnikLayers = true; - const vectorResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.mvt`; - const layerTilejson = { - vector: getTilejson(resourceLocator.getTileUrls(user, vectorResource)) - }; - if (!isVectorOnlyMapConfig) { - let grids = null; - const layer = mapconfig.getLayer(index); - if (layer.options.interactivity) { - const gridResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.grid.json`; - grids = resourceLocator.getTileUrls(user, gridResource); - } - layerTilejson.raster = getTilejson( - resourceLocator.getTileUrls(user, rasterResource), - grids - ); - } - layerMetadata.tilejson = layerTilejson; - } else { - layerMetadata.tilejson = { - raster: getTilejson(resourceLocator.getTileUrls(user, rasterResource)) - }; - } - }); - - const tilejson = {}; - const url = {}; - - if (hasMapnikLayers) { - const vectorResource = `${layergroup.layergroupid}/{z}/{x}/{y}.mvt`; - tilejson.vector = getTilejson( - resourceLocator.getTileUrls(user, vectorResource) - ); - url.vector = getTemplateUrl(resourceLocator.getTemplateUrls(user, vectorResource)); - - if (!isVectorOnlyMapConfig) { - const rasterResource = `${layergroup.layergroupid}/{z}/{x}/{y}.png`; - tilejson.raster = getTilejson( - resourceLocator.getTileUrls(user, rasterResource) - ); - url.raster = getTemplateUrl(resourceLocator.getTemplateUrls(user, rasterResource)); - } - } - - layergroup.metadata.tilejson = tilejson; - layergroup.metadata.url = url; + layergroupMetadata.addTileJsonMetadata(layergroup, user, mapconfig); next(); }; diff --git a/lib/cartodb/utils/layergroup-metadata.js b/lib/cartodb/utils/layergroup-metadata.js new file mode 100644 index 00000000..0e5d702a --- /dev/null +++ b/lib/cartodb/utils/layergroup-metadata.js @@ -0,0 +1,168 @@ +module.exports = class LayergroupMetadata { + constructor (resourceLocator) { + this.resourceLocator = resourceLocator; + } + + // TODO this should take into account several URL patterns + addDataviewsAndWidgetsUrls (username, layergroup, mapConfig) { + this._addDataviewsUrls(username, layergroup, mapConfig); + this._addWidgetsUrl(username, layergroup, mapConfig); + } + + _addDataviewsUrls (username, layergroup, mapConfig) { + layergroup.metadata.dataviews = layergroup.metadata.dataviews || {}; + var dataviews = mapConfig.dataviews || {}; + + Object.keys(dataviews).forEach((dataviewName) => { + var resource = layergroup.layergroupid + '/dataview/' + dataviewName; + layergroup.metadata.dataviews[dataviewName] = { + url: this.resourceLocator.getUrls(username, resource) + }; + }); + } + + _addWidgetsUrl (username, layergroup, mapConfig) { + if (layergroup.metadata && Array.isArray(layergroup.metadata.layers) && Array.isArray(mapConfig.layers)) { + layergroup.metadata.layers = layergroup.metadata.layers.map((layer, layerIndex) => { + var mapConfigLayer = mapConfig.layers[layerIndex]; + if (mapConfigLayer.options && mapConfigLayer.options.widgets) { + layer.widgets = layer.widgets || {}; + Object.keys(mapConfigLayer.options.widgets).forEach((widgetName) => { + var resource = layergroup.layergroupid + '/' + layerIndex + '/widget/' + widgetName; + layer.widgets[widgetName] = { + type: mapConfigLayer.options.widgets[widgetName].type, + url: this.resourceLocator.getUrls(username, resource) + }; + }); + } + + return layer; + }); + } + } + + addAnalysesMetadata (username, layergroup, analysesResults, includeQuery) { + includeQuery = includeQuery || false; + analysesResults = analysesResults || []; + layergroup.metadata.analyses = []; + + analysesResults.forEach((analysis) => { + var nodes = analysis.getNodes(); + layergroup.metadata.analyses.push({ + nodes: nodes.reduce((nodesIdMap, node) => { + if (node.params.id) { + var nodeResource = layergroup.layergroupid + '/analysis/node/' + node.id(); + var nodeRepr = { + status: node.getStatus(), + url: this.resourceLocator.getUrls(username, nodeResource) + }; + if (includeQuery) { + nodeRepr.query = node.getQuery(); + } + if (node.getStatus() === 'failed') { + nodeRepr.error_message = node.getErrorMessage(); + } + nodesIdMap[node.params.id] = nodeRepr; + } + + return nodesIdMap; + }, {}) + }); + }); + } + + addAggregationContextMetadata (layergroup, mapConfig, context) { + if (layergroup.metadata && Array.isArray(layergroup.metadata.layers) && Array.isArray(mapConfig.layers)) { + layergroup.metadata.layers = layergroup.metadata.layers.map(function(layer, layerIndex) { + if (context.aggregation && Array.isArray(context.aggregation.layers)) { + layer.meta.aggregation = context.aggregation.layers[layerIndex]; + } + return layer; + }); + } + } + + addTileJsonMetadata (layergroup, user, mapconfig) { + const isVectorOnlyMapConfig = mapconfig.isVectorOnlyMapConfig(); + let hasMapnikLayers = false; + + layergroup.metadata.layers.forEach((layerMetadata, index) => { + const layerId = mapconfig.getLayerId(index); + const rasterResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.png`; + if (mapconfig.layerType(index) === 'mapnik') { + hasMapnikLayers = true; + const vectorResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.mvt`; + const layerTilejson = { + vector: this._getTilejson(this.resourceLocator.getTileUrls(user, vectorResource)) + }; + if (!isVectorOnlyMapConfig) { + let grids = null; + const layer = mapconfig.getLayer(index); + if (layer.options.interactivity) { + const gridResource = `${layergroup.layergroupid}/${layerId}/{z}/{x}/{y}.grid.json`; + grids = this.resourceLocator.getTileUrls(user, gridResource); + } + layerTilejson.raster = this._getTilejson( + this.resourceLocator.getTileUrls(user, rasterResource), + grids + ); + } + layerMetadata.tilejson = layerTilejson; + } else { + layerMetadata.tilejson = { + raster: this._getTilejson(this.resourceLocator.getTileUrls(user, rasterResource)) + }; + } + }); + + const tilejson = {}; + const url = {}; + + if (hasMapnikLayers) { + const vectorResource = `${layergroup.layergroupid}/{z}/{x}/{y}.mvt`; + 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`; + tilejson.raster = this._getTilejson( + this.resourceLocator.getTileUrls(user, rasterResource) + ); + url.raster = this._getTemplateUrl(this.resourceLocator.getTemplateUrls(user, rasterResource)); + } + } + + layergroup.metadata.tilejson = tilejson; + layergroup.metadata.url = url; + } + + _getTilejson(tiles, grids) { + const tilejson = { + tilejson: '2.2.0', + tiles: tiles.https || tiles.http + }; + + if (grids) { + tilejson.grids = grids.https || grids.http; + } + + return tilejson; + } + + _getTemplateUrl(url) { + return url.https || url.http; + } + + addTurboCartoContextMetadata(layergroup, mapConfig, context) { + if (layergroup.metadata && Array.isArray(layergroup.metadata.layers) && Array.isArray(mapConfig.layers)) { + layergroup.metadata.layers = layergroup.metadata.layers.map(function(layer, layerIndex) { + if (context.turboCarto && Array.isArray(context.turboCarto.layers)) { + layer.meta.cartocss_meta = context.turboCarto.layers[layerIndex]; + } + return layer; + }); + } + } +}; From cbb08f56429dcbd2c21f45b72f654b507040fc2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 9 Mar 2018 15:49:03 +0100 Subject: [PATCH 5/7] Extract function --- lib/cartodb/controllers/map.js | 38 ++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 01fe461b..d4d24722 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -76,21 +76,7 @@ MapController.prototype.composeCreateMapMiddleware = function (useTemplate = fal this.prepareContext, initProfiler(isTemplateInstantiation), checkJsonContentType(), - useTemplate ? - checkInstantiteLayergroup() : - checkCreateLayergroup(), - useTemplate ? - getTemplate( - this.templateMaps, - this.pgConnection, - this.metadataBackend, - this.userLimitsApi, - this.mapConfigAdapter - ) : - prepareAdapterMapConfig(this.mapConfigAdapter), - useTemplate ? - instantiateLayergroup(this.mapBackend, this.userLimitsApi) : - createLayergroup (this.mapBackend, this.userLimitsApi), + this.getCreateMapMiddlewares(useTemplate), incrementMapViewCount(this.metadataBackend), augmentLayergroupData(), getAffectedTables(this.pgConnection, this.layergroupAffectedTables), @@ -111,6 +97,28 @@ MapController.prototype.composeCreateMapMiddleware = function (useTemplate = fal ]; }; +MapController.prototype.getCreateMapMiddlewares = function (useTemplate) { + if (useTemplate) { + return [ + checkInstantiteLayergroup(), + getTemplate( + this.templateMaps, + this.pgConnection, + this.metadataBackend, + this.userLimitsApi, + this.mapConfigAdapter + ), + instantiateLayergroup(this.mapBackend, this.userLimitsApi) + ]; + } + + return [ + checkCreateLayergroup(), + prepareAdapterMapConfig(this.mapConfigAdapter), + createLayergroup (this.mapBackend, this.userLimitsApi) + ]; +} + function initProfiler (isTemplateInstantiation) { const operation = isTemplateInstantiation ? 'instance_template' : 'createmap'; From 504f68b8aa32ca440d5aaa85331ed64a82845f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 9 Mar 2018 16:18:33 +0100 Subject: [PATCH 6/7] Missing semicolon --- lib/cartodb/controllers/map.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index d4d24722..6084c671 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -117,7 +117,7 @@ MapController.prototype.getCreateMapMiddlewares = function (useTemplate) { prepareAdapterMapConfig(this.mapConfigAdapter), createLayergroup (this.mapBackend, this.userLimitsApi) ]; -} +}; function initProfiler (isTemplateInstantiation) { const operation = isTemplateInstantiation ? 'instance_template' : 'createmap'; From 01ed513a7960fed4472c013174eafa9e37a02703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 9 Mar 2018 17:02:13 +0100 Subject: [PATCH 7/7] Use 'const' --- lib/cartodb/controllers/map.js | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 6084c671..87e8b6be 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -1,20 +1,15 @@ -var _ = require('underscore'); -var windshaft = require('windshaft'); -var QueryTables = require('cartodb-query-tables'); - -var ResourceLocator = require('../models/resource-locator'); - -var cors = require('../middleware/cors'); -var userMiddleware = require('../middleware/user'); +const _ = require('underscore'); +const windshaft = require('windshaft'); +const MapConfig = windshaft.model.MapConfig; +const Datasource = windshaft.model.Datasource; +const QueryTables = require('cartodb-query-tables'); +const ResourceLocator = require('../models/resource-locator'); +const cors = require('../middleware/cors'); +const userMiddleware = require('../middleware/user'); const allowQueryParams = require('../middleware/allow-query-params'); - -var MapConfig = windshaft.model.MapConfig; -var Datasource = windshaft.model.Datasource; - -var NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); - -var NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); -var CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider'); +const NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); +const NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); +const CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider'); const LayergroupMetadata = require('../utils/layergroup-metadata'); /**