From 4bb35f5fabccfcbf4935533008824627c09531e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 26 Mar 2018 15:37:44 +0200 Subject: [PATCH 01/54] Extract cors and user middlewares and set them up at application level --- lib/cartodb/controllers/analyses.js | 4 ---- lib/cartodb/controllers/layergroup/analysis.js | 4 ---- lib/cartodb/controllers/layergroup/attributes.js | 4 ---- lib/cartodb/controllers/layergroup/dataview.js | 10 ---------- lib/cartodb/controllers/layergroup/static.js | 6 ------ lib/cartodb/controllers/layergroup/tile.js | 8 -------- lib/cartodb/controllers/map.js | 3 --- lib/cartodb/controllers/named_maps.js | 6 ------ lib/cartodb/controllers/named_maps_admin.js | 11 ----------- lib/cartodb/server.js | 5 +++++ 10 files changed, 5 insertions(+), 56 deletions(-) diff --git a/lib/cartodb/controllers/analyses.js b/lib/cartodb/controllers/analyses.js index 2d89a091..d08d2779 100644 --- a/lib/cartodb/controllers/analyses.js +++ b/lib/cartodb/controllers/analyses.js @@ -1,6 +1,4 @@ const PSQL = require('cartodb-psql'); -const cors = require('../middleware/cors'); -const user = require('../middleware/user'); const cleanUpQueryParams = require('../middleware/clean-up-query-params'); const credentials = require('../middleware/credentials'); const authorize = require('../middleware/authorize'); @@ -24,8 +22,6 @@ AnalysesController.prototype.register = function (app) { app.get( `${mapconfigBasePath}/analyses/catalog`, - cors(), - user(), credentials(), authorize(this.authApi), dbConnSetup(this.pgConnection), diff --git a/lib/cartodb/controllers/layergroup/analysis.js b/lib/cartodb/controllers/layergroup/analysis.js index 3022bce3..b5faedb1 100644 --- a/lib/cartodb/controllers/layergroup/analysis.js +++ b/lib/cartodb/controllers/layergroup/analysis.js @@ -1,5 +1,3 @@ -const cors = require('../../middleware/cors'); -const user = require('../../middleware/user'); const layergroupToken = require('../../middleware/layergroup-token'); const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); @@ -34,8 +32,6 @@ module.exports = class AnalysisController { app.get( `${mapConfigBasePath}/:token/analysis/node/:nodeId`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), diff --git a/lib/cartodb/controllers/layergroup/attributes.js b/lib/cartodb/controllers/layergroup/attributes.js index 07ae5da1..24c016ad 100644 --- a/lib/cartodb/controllers/layergroup/attributes.js +++ b/lib/cartodb/controllers/layergroup/attributes.js @@ -1,5 +1,3 @@ -const cors = require('../../middleware/cors'); -const user = require('../../middleware/user'); const layergroupToken = require('../../middleware/layergroup-token'); const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); @@ -38,8 +36,6 @@ module.exports = class AttribitesController { app.get( `${mapConfigBasePath}/:token/:layer/attributes/:fid`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), diff --git a/lib/cartodb/controllers/layergroup/dataview.js b/lib/cartodb/controllers/layergroup/dataview.js index bca27f1e..3864ce37 100644 --- a/lib/cartodb/controllers/layergroup/dataview.js +++ b/lib/cartodb/controllers/layergroup/dataview.js @@ -1,5 +1,3 @@ -const cors = require('../../middleware/cors'); -const user = require('../../middleware/user'); const layergroupToken = require('../../middleware/layergroup-token'); const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); @@ -56,8 +54,6 @@ module.exports = class DataviewController { app.get( `${mapConfigBasePath}/:token/dataview/:dataviewName`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), @@ -80,8 +76,6 @@ module.exports = class DataviewController { app.get( `${mapConfigBasePath}/:token/:layer/widget/:dataviewName`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), @@ -104,8 +98,6 @@ module.exports = class DataviewController { app.get( `${mapConfigBasePath}/:token/dataview/:dataviewName/search`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), @@ -128,8 +120,6 @@ module.exports = class DataviewController { app.get( `${mapConfigBasePath}/:token/:layer/widget/:dataviewName/search`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), diff --git a/lib/cartodb/controllers/layergroup/static.js b/lib/cartodb/controllers/layergroup/static.js index 00510780..56f9169d 100644 --- a/lib/cartodb/controllers/layergroup/static.js +++ b/lib/cartodb/controllers/layergroup/static.js @@ -1,5 +1,3 @@ -const cors = require('../../middleware/cors'); -const user = require('../../middleware/user'); const layergroupToken = require('../../middleware/layergroup-token'); const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); @@ -40,8 +38,6 @@ module.exports = class StaticController { app.get( `${mapConfigBasePath}/static/center/:token/:z/:lat/:lng/:width/:height.:format`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), @@ -65,8 +61,6 @@ module.exports = class StaticController { app.get( `${mapConfigBasePath}/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), diff --git a/lib/cartodb/controllers/layergroup/tile.js b/lib/cartodb/controllers/layergroup/tile.js index 07727236..d0df6fef 100644 --- a/lib/cartodb/controllers/layergroup/tile.js +++ b/lib/cartodb/controllers/layergroup/tile.js @@ -1,5 +1,3 @@ -const cors = require('../../middleware/cors'); -const user = require('../../middleware/user'); const layergroupToken = require('../../middleware/layergroup-token'); const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); @@ -48,8 +46,6 @@ module.exports = class TileController { app.get( `${mapConfigBasePath}/:token/:z/:x/:y@:scale_factor?x.:format`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), @@ -76,8 +72,6 @@ module.exports = class TileController { app.get( `${mapConfigBasePath}/:token/:z/:x/:y.:format`, - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), @@ -105,8 +99,6 @@ module.exports = class TileController { app.get( `${mapConfigBasePath}/:token/:layer/:z/:x/:y.(:format)`, distinguishLayergroupFromStaticRoute(), - cors(), - user(), layergroupToken(), credentials(), authorize(this.authApi), diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index 11074234..bbd9483b 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -4,7 +4,6 @@ const MapConfig = windshaft.model.MapConfig; const Datasource = windshaft.model.Datasource; const ResourceLocator = require('../models/resource-locator'); const cors = require('../middleware/cors'); -const user = require('../middleware/user'); const cleanUpQueryParams = require('../middleware/clean-up-query-params'); const credentials = require('../middleware/credentials'); const dbConnSetup = require('../middleware/db-conn-setup'); @@ -99,8 +98,6 @@ MapController.prototype.composeCreateMapMiddleware = function (endpointGroup, us const addContext = !useTemplate; return [ - cors(), - user(), credentials(), authorize(this.authApi), dbConnSetup(this.pgConnection), diff --git a/lib/cartodb/controllers/named_maps.js b/lib/cartodb/controllers/named_maps.js index 2cb4f609..044f98fa 100644 --- a/lib/cartodb/controllers/named_maps.js +++ b/lib/cartodb/controllers/named_maps.js @@ -1,5 +1,3 @@ -const cors = require('../middleware/cors'); -const user = require('../middleware/user'); const cleanUpQueryParams = require('../middleware/clean-up-query-params'); const credentials = require('../middleware/credentials'); const dbConnSetup = require('../middleware/db-conn-setup'); @@ -54,8 +52,6 @@ NamedMapsController.prototype.register = function(app) { app.get( `${templateBasePath}/:template_id/:layer/:z/:x/:y.(:format)`, - cors(), - user(), credentials(), authorize(this.authApi), dbConnSetup(this.pgConnection), @@ -80,8 +76,6 @@ NamedMapsController.prototype.register = function(app) { app.get( `${mapconfigBasePath}/static/named/:template_id/:width/:height.:format`, - cors(), - user(), credentials(), authorize(this.authApi), dbConnSetup(this.pgConnection), diff --git a/lib/cartodb/controllers/named_maps_admin.js b/lib/cartodb/controllers/named_maps_admin.js index afcaa1e3..5e3c40dc 100644 --- a/lib/cartodb/controllers/named_maps_admin.js +++ b/lib/cartodb/controllers/named_maps_admin.js @@ -1,6 +1,5 @@ const { templateName } = require('../backends/template_maps'); const cors = require('../middleware/cors'); -const user = require('../middleware/user'); const credentials = require('../middleware/credentials'); const rateLimit = require('../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; @@ -25,8 +24,6 @@ NamedMapsAdminController.prototype.register = function (app) { app.post( `${templateBasePath}/`, - cors(), - user(), credentials(), checkContentType({ action: 'POST', label: 'POST TEMPLATE' }), authorizedByAPIKey({ authApi: this.authApi, action: 'create', label: 'POST TEMPLATE' }), @@ -37,8 +34,6 @@ NamedMapsAdminController.prototype.register = function (app) { app.put( `${templateBasePath}/:template_id`, - cors(), - user(), credentials(), checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }), authorizedByAPIKey({ authApi: this.authApi, action: 'update', label: 'PUT TEMPLATE' }), @@ -49,8 +44,6 @@ NamedMapsAdminController.prototype.register = function (app) { app.get( `${templateBasePath}/:template_id`, - cors(), - user(), credentials(), authorizedByAPIKey({ authApi: this.authApi, action: 'get', label: 'GET TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_GET), @@ -60,8 +53,6 @@ NamedMapsAdminController.prototype.register = function (app) { app.delete( `${templateBasePath}/:template_id`, - cors(), - user(), credentials(), authorizedByAPIKey({ authApi: this.authApi, action: 'delete', label: 'DELETE TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_DELETE), @@ -71,8 +62,6 @@ NamedMapsAdminController.prototype.register = function (app) { app.get( `${templateBasePath}/`, - cors(), - user(), credentials(), authorizedByAPIKey({ authApi: this.authApi, action: 'list', label: 'GET TEMPLATE LIST' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_LIST), diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 8535783d..13fe1e06 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -1,4 +1,6 @@ var express = require('express'); +const cors = require('./middleware/cors'); +const user = require('./middleware/user'); var bodyParser = require('body-parser'); var RedisPool = require('redis-mpool'); var cartodbRedis = require('cartodb-redis'); @@ -392,6 +394,9 @@ function bootstrap(opts) { setupLogger(app, opts); + app.use(cors()); + app.use(user()); + return app; } From 59db640d0de71599633ab196bdf66a7e97a612d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 26 Mar 2018 16:05:53 +0200 Subject: [PATCH 02/54] Typo --- lib/cartodb/controllers/layergroup/attributes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/controllers/layergroup/attributes.js b/lib/cartodb/controllers/layergroup/attributes.js index 24c016ad..babe2621 100644 --- a/lib/cartodb/controllers/layergroup/attributes.js +++ b/lib/cartodb/controllers/layergroup/attributes.js @@ -12,7 +12,7 @@ const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); const sendResponse = require('../../middleware/send-response'); -module.exports = class AttribitesController { +module.exports = class AttributesController { constructor ( attributesBackend, pgConnection, From cb488cbde8302c510d063f159cbcd04521aff46d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 26 Mar 2018 19:53:33 +0200 Subject: [PATCH 03/54] Extract middleware served by host header --- app.js | 2 -- lib/cartodb/middleware/served-by-host-header.js | 11 +++++++++++ lib/cartodb/server.js | 9 ++------- 3 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 lib/cartodb/middleware/served-by-host-header.js diff --git a/app.js b/app.js index 1dd465f0..f35d580e 100755 --- a/app.js +++ b/app.js @@ -100,8 +100,6 @@ if ( global.environment.log_filename ) { global.log4js.configure(log4jsConfig); global.logger = global.log4js.getLogger(); -global.environment.api_hostname = require('os').hostname().split('.')[0]; - // Include cartodb_windshaft only _after_ the "global" variable is set // See https://github.com/Vizzuality/Windshaft-cartodb/issues/28 var cartodbWindshaft = require('./lib/cartodb/server'); diff --git a/lib/cartodb/middleware/served-by-host-header.js b/lib/cartodb/middleware/served-by-host-header.js new file mode 100644 index 00000000..809100a2 --- /dev/null +++ b/lib/cartodb/middleware/served-by-host-header.js @@ -0,0 +1,11 @@ +const os = require('os'); + +module.exports = function servedByHostHeader () { + const hostname = os.hostname().split('.')[0]; + + return function servedByHostHeaderMiddleware (req, res, next) { + res.set('X-Served-By-Host', hostname); + + next(); + }; +}; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 13fe1e06..9231fb69 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -50,6 +50,7 @@ var StatsBackend = require('./backends/stats'); const lzmaMiddleware = require('./middleware/lzma'); const errorMiddleware = require('./middleware/error-middleware'); +const servedByHostHeader = require('./middleware/served-by-host-header'); module.exports = function(serverOptions) { // Make stats client globally accessible @@ -364,13 +365,7 @@ function bootstrap(opts) { app.use(bodyParser.json()); - app.use(function bootstrap$prepareRequestResponse(req, res, next) { - if (global.environment && global.environment.api_hostname) { - res.set('X-Served-By-Host', global.environment.api_hostname); - } - - next(); - }); + app.use(servedByHostHeader()); app.use(stats({ enabled: opts.useProfiler, From 5b9f6086673847d2e0ea7520ef57982bdbadf6a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 27 Mar 2018 18:46:54 +0200 Subject: [PATCH 04/54] Use express routers --- lib/cartodb/controllers/analyses.js | 8 ++--- .../controllers/layergroup/analysis.js | 8 ++--- .../controllers/layergroup/attributes.js | 8 ++--- .../controllers/layergroup/dataview.js | 20 ++++++------- lib/cartodb/controllers/layergroup/index.js | 2 -- lib/cartodb/controllers/layergroup/static.js | 12 ++++---- lib/cartodb/controllers/layergroup/tile.js | 16 +++++----- lib/cartodb/controllers/map.js | 26 +++++------------ lib/cartodb/controllers/named_maps.js | 11 ++++--- lib/cartodb/controllers/named_maps_admin.js | 29 ++++++++----------- lib/cartodb/controllers/server_info.js | 8 ++--- lib/cartodb/server.js | 24 ++++++++++----- 12 files changed, 75 insertions(+), 97 deletions(-) diff --git a/lib/cartodb/controllers/analyses.js b/lib/cartodb/controllers/analyses.js index d08d2779..9c0e915c 100644 --- a/lib/cartodb/controllers/analyses.js +++ b/lib/cartodb/controllers/analyses.js @@ -17,11 +17,9 @@ function AnalysesController(pgConnection, authApi, userLimitsApi) { module.exports = AnalysesController; -AnalysesController.prototype.register = function (app) { - const { base_url_mapconfig: mapconfigBasePath } = app; - - app.get( - `${mapconfigBasePath}/analyses/catalog`, +AnalysesController.prototype.register = function (mapRouter) { + mapRouter.get( + `/analyses/catalog`, credentials(), authorize(this.authApi), dbConnSetup(this.pgConnection), diff --git a/lib/cartodb/controllers/layergroup/analysis.js b/lib/cartodb/controllers/layergroup/analysis.js index b5faedb1..9d58a53f 100644 --- a/lib/cartodb/controllers/layergroup/analysis.js +++ b/lib/cartodb/controllers/layergroup/analysis.js @@ -27,11 +27,9 @@ module.exports = class AnalysisController { this.surrogateKeysCache = surrogateKeysCache; } - register (app) { - const { base_url_mapconfig: mapConfigBasePath } = app; - - app.get( - `${mapConfigBasePath}/:token/analysis/node/:nodeId`, + register (mapRouter) { + mapRouter.get( + `/:token/analysis/node/:nodeId`, layergroupToken(), credentials(), authorize(this.authApi), diff --git a/lib/cartodb/controllers/layergroup/attributes.js b/lib/cartodb/controllers/layergroup/attributes.js index babe2621..4965fe44 100644 --- a/lib/cartodb/controllers/layergroup/attributes.js +++ b/lib/cartodb/controllers/layergroup/attributes.js @@ -31,11 +31,9 @@ module.exports = class AttributesController { this.surrogateKeysCache = surrogateKeysCache; } - register (app) { - const { base_url_mapconfig: mapConfigBasePath } = app; - - app.get( - `${mapConfigBasePath}/:token/:layer/attributes/:fid`, + register (mapRouter) { + mapRouter.get( + `/:token/:layer/attributes/:fid`, layergroupToken(), credentials(), authorize(this.authApi), diff --git a/lib/cartodb/controllers/layergroup/dataview.js b/lib/cartodb/controllers/layergroup/dataview.js index 3864ce37..b768ee89 100644 --- a/lib/cartodb/controllers/layergroup/dataview.js +++ b/lib/cartodb/controllers/layergroup/dataview.js @@ -46,14 +46,12 @@ module.exports = class DataviewController { this.surrogateKeysCache = surrogateKeysCache; } - register (app) { - const { base_url_mapconfig: mapConfigBasePath } = app; - + register (mapRouter) { // Undocumented/non-supported API endpoint methods. // Use at your own peril. - app.get( - `${mapConfigBasePath}/:token/dataview/:dataviewName`, + mapRouter.get( + `/:token/dataview/:dataviewName`, layergroupToken(), credentials(), authorize(this.authApi), @@ -74,8 +72,8 @@ module.exports = class DataviewController { sendResponse() ); - app.get( - `${mapConfigBasePath}/:token/:layer/widget/:dataviewName`, + mapRouter.get( + `/:token/:layer/widget/:dataviewName`, layergroupToken(), credentials(), authorize(this.authApi), @@ -96,8 +94,8 @@ module.exports = class DataviewController { sendResponse() ); - app.get( - `${mapConfigBasePath}/:token/dataview/:dataviewName/search`, + mapRouter.get( + `/:token/dataview/:dataviewName/search`, layergroupToken(), credentials(), authorize(this.authApi), @@ -118,8 +116,8 @@ module.exports = class DataviewController { sendResponse() ); - app.get( - `${mapConfigBasePath}/:token/:layer/widget/:dataviewName/search`, + mapRouter.get( + `/:token/:layer/widget/:dataviewName/search`, layergroupToken(), credentials(), authorize(this.authApi), diff --git a/lib/cartodb/controllers/layergroup/index.js b/lib/cartodb/controllers/layergroup/index.js index e4c1770c..fbbe1fd8 100644 --- a/lib/cartodb/controllers/layergroup/index.js +++ b/lib/cartodb/controllers/layergroup/index.js @@ -109,6 +109,4 @@ LayergroupController.prototype.register = function(app) { ); analysisController.register(app); - - }; diff --git a/lib/cartodb/controllers/layergroup/static.js b/lib/cartodb/controllers/layergroup/static.js index 56f9169d..70957b53 100644 --- a/lib/cartodb/controllers/layergroup/static.js +++ b/lib/cartodb/controllers/layergroup/static.js @@ -31,13 +31,11 @@ module.exports = class StaticController { this.surrogateKeysCache = surrogateKeysCache; } - register (app) { - const { base_url_mapconfig: mapConfigBasePath } = app; - + register (mapRouter) { const forcedFormat = 'png'; - app.get( - `${mapConfigBasePath}/static/center/:token/:z/:lat/:lng/:width/:height.:format`, + mapRouter.get( + `/static/center/:token/:z/:lat/:lng/:width/:height.:format`, layergroupToken(), credentials(), authorize(this.authApi), @@ -59,8 +57,8 @@ module.exports = class StaticController { sendResponse() ); - app.get( - `${mapConfigBasePath}/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format`, + mapRouter.get( + `/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format`, layergroupToken(), credentials(), authorize(this.authApi), diff --git a/lib/cartodb/controllers/layergroup/tile.js b/lib/cartodb/controllers/layergroup/tile.js index d0df6fef..091a8f35 100644 --- a/lib/cartodb/controllers/layergroup/tile.js +++ b/lib/cartodb/controllers/layergroup/tile.js @@ -41,11 +41,9 @@ module.exports = class TileController { this.surrogateKeysCache = surrogateKeysCache; } - register (app) { - const { base_url_mapconfig: mapConfigBasePath } = app; - - app.get( - `${mapConfigBasePath}/:token/:z/:x/:y@:scale_factor?x.:format`, + register (mapRouter) { + mapRouter.get( + `/:token/:z/:x/:y@:scale_factor?x.:format`, layergroupToken(), credentials(), authorize(this.authApi), @@ -70,8 +68,8 @@ module.exports = class TileController { sendResponse() ); - app.get( - `${mapConfigBasePath}/:token/:z/:x/:y.:format`, + mapRouter.get( + `/:token/:z/:x/:y.:format`, layergroupToken(), credentials(), authorize(this.authApi), @@ -96,8 +94,8 @@ module.exports = class TileController { sendResponse() ); - app.get( - `${mapConfigBasePath}/:token/:layer/:z/:x/:y.(:format)`, + mapRouter.get( + `/:token/:layer/:z/:x/:y.(:format)`, distinguishLayergroupFromStaticRoute(), layergroupToken(), credentials(), diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js index bbd9483b..f42d1b5d 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map.js @@ -62,32 +62,22 @@ function MapController ( module.exports = MapController; -MapController.prototype.register = function(app) { - const { base_url_mapconfig: mapConfigBasePath, base_url_templated: templateBasePath } = app; - - app.get( - `${mapConfigBasePath}`, - this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS) - ); - - app.post( - `${mapConfigBasePath}`, - this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS) - ); +MapController.prototype.register = function(mapRouter, templateRouter) { + mapRouter.get(`/`, this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS)); + mapRouter.post(`/`, this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS)); + mapRouter.options(`/`, cors('Content-Type')); const useTemplate = true; - app.get( - `${templateBasePath}/:template_id/jsonp`, + templateRouter.get( + `/:template_id/jsonp`, this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.NAMED, useTemplate) ); - app.post( - `${templateBasePath}/:template_id`, + templateRouter.post( + `/:template_id`, this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.NAMED, useTemplate) ); - - app.options(`${mapConfigBasePath}`, cors('Content-Type')); }; MapController.prototype.composeCreateMapMiddleware = function (endpointGroup, useTemplate = false) { diff --git a/lib/cartodb/controllers/named_maps.js b/lib/cartodb/controllers/named_maps.js index 044f98fa..c5347190 100644 --- a/lib/cartodb/controllers/named_maps.js +++ b/lib/cartodb/controllers/named_maps.js @@ -47,11 +47,10 @@ function NamedMapsController ( module.exports = NamedMapsController; -NamedMapsController.prototype.register = function(app) { - const { base_url_mapconfig: mapconfigBasePath, base_url_templated: templateBasePath } = app; +NamedMapsController.prototype.register = function(mapRouter, templateRouter) { - app.get( - `${templateBasePath}/:template_id/:layer/:z/:x/:y.(:format)`, + templateRouter.get( + `/:template_id/:layer/:z/:x/:y.(:format)`, credentials(), authorize(this.authApi), dbConnSetup(this.pgConnection), @@ -74,8 +73,8 @@ NamedMapsController.prototype.register = function(app) { vectorError() ); - app.get( - `${mapconfigBasePath}/static/named/:template_id/:width/:height.:format`, + mapRouter.get( + `/static/named/:template_id/:width/:height.:format`, credentials(), authorize(this.authApi), dbConnSetup(this.pgConnection), diff --git a/lib/cartodb/controllers/named_maps_admin.js b/lib/cartodb/controllers/named_maps_admin.js index 5e3c40dc..95ac0d51 100644 --- a/lib/cartodb/controllers/named_maps_admin.js +++ b/lib/cartodb/controllers/named_maps_admin.js @@ -19,11 +19,9 @@ function NamedMapsAdminController(authApi, templateMaps, userLimitsApi) { module.exports = NamedMapsAdminController; -NamedMapsAdminController.prototype.register = function (app) { - const { base_url_templated: templateBasePath } = app; - - app.post( - `${templateBasePath}/`, +NamedMapsAdminController.prototype.register = function (templateRouter) { + templateRouter.post( + `/`, credentials(), checkContentType({ action: 'POST', label: 'POST TEMPLATE' }), authorizedByAPIKey({ authApi: this.authApi, action: 'create', label: 'POST TEMPLATE' }), @@ -32,8 +30,8 @@ NamedMapsAdminController.prototype.register = function (app) { sendResponse() ); - app.put( - `${templateBasePath}/:template_id`, + templateRouter.put( + `/:template_id`, credentials(), checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }), authorizedByAPIKey({ authApi: this.authApi, action: 'update', label: 'PUT TEMPLATE' }), @@ -42,8 +40,8 @@ NamedMapsAdminController.prototype.register = function (app) { sendResponse() ); - app.get( - `${templateBasePath}/:template_id`, + templateRouter.get( + `/:template_id`, credentials(), authorizedByAPIKey({ authApi: this.authApi, action: 'get', label: 'GET TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_GET), @@ -51,8 +49,8 @@ NamedMapsAdminController.prototype.register = function (app) { sendResponse() ); - app.delete( - `${templateBasePath}/:template_id`, + templateRouter.delete( + `/:template_id`, credentials(), authorizedByAPIKey({ authApi: this.authApi, action: 'delete', label: 'DELETE TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_DELETE), @@ -60,8 +58,8 @@ NamedMapsAdminController.prototype.register = function (app) { sendResponse() ); - app.get( - `${templateBasePath}/`, + templateRouter.get( + `/`, credentials(), authorizedByAPIKey({ authApi: this.authApi, action: 'list', label: 'GET TEMPLATE LIST' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_LIST), @@ -69,10 +67,7 @@ NamedMapsAdminController.prototype.register = function (app) { sendResponse() ); - app.options( - `${templateBasePath}/:template_id`, - cors('Content-Type') - ); + templateRouter.options(`/:template_id`, cors('Content-Type')); }; function checkContentType ({ action, label }) { diff --git a/lib/cartodb/controllers/server_info.js b/lib/cartodb/controllers/server_info.js index c70de9fa..12f6432b 100644 --- a/lib/cartodb/controllers/server_info.js +++ b/lib/cartodb/controllers/server_info.js @@ -12,10 +12,10 @@ function ServerInfoController(versions) { module.exports = ServerInfoController; -ServerInfoController.prototype.register = function(app) { - app.get('/health', this.health.bind(this)); - app.get('/', this.welcome.bind(this)); - app.get('/version', this.version.bind(this)); +ServerInfoController.prototype.register = function(monitorRouter) { + monitorRouter.get('/health', this.health.bind(this)); + monitorRouter.get('/', this.welcome.bind(this)); + monitorRouter.get('/version', this.version.bind(this)); }; ServerInfoController.prototype.welcome = function(req, res) { diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 9231fb69..f9161b21 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -116,8 +116,6 @@ module.exports = function(serverOptions) { // initialize express server var app = bootstrap(serverOptions); - // Extend windshaft with all the elements of the options object - _.extend(app, serverOptions); var mapStore = new windshaft.storage.MapStore({ pool: redisPool, @@ -222,6 +220,12 @@ module.exports = function(serverOptions) { * Routing ******************************************************************************************************************/ + const mapRouter = express.Router(); + const templateRouter = express.Router(); + const monitorRouter = express.Router(); + + const { base_url_mapconfig: mapConfigBasePath, base_url_templated: templateBasePath } = serverOptions; + new controller.Layergroup( pgConnection, mapStore, @@ -233,7 +237,7 @@ module.exports = function(serverOptions) { layergroupAffectedTablesCache, analysisBackend, authApi - ).register(app); + ).register(mapRouter); new controller.Map( pgConnection, @@ -246,7 +250,7 @@ module.exports = function(serverOptions) { mapConfigAdapter, statsBackend, authApi - ).register(app); + ).register(mapRouter, templateRouter); new controller.NamedMaps( namedMapProviderCache, @@ -258,13 +262,17 @@ module.exports = function(serverOptions) { pgConnection, authApi, userLimitsApi - ).register(app); + ).register(mapRouter, templateRouter); - new controller.NamedMapsAdmin(authApi, templateMaps, userLimitsApi).register(app); + new controller.NamedMapsAdmin(authApi, templateMaps, userLimitsApi).register(templateRouter); - new controller.Analyses(pgConnection, authApi, userLimitsApi).register(app); + new controller.Analyses(pgConnection, authApi, userLimitsApi).register(mapRouter); - new controller.ServerInfo(versions).register(app); + new controller.ServerInfo(versions).register(monitorRouter); + + app.use(mapConfigBasePath, mapRouter); + app.use(templateBasePath, templateRouter); + app.use('/', monitorRouter); /******************************************************************************************************************* * END Routing From d8d681e8bccdb9bc6cbbb08747efb33433360b10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 12:39:39 +0200 Subject: [PATCH 05/54] Create separated controllers (named & anonymous) for map controller --- .../controllers/{map.js => map/anonymous.js} | 207 ++------ lib/cartodb/controllers/map/index.js | 60 +++ lib/cartodb/controllers/map/named.js | 446 ++++++++++++++++++ .../cartodb/ported/windshaft_server.test.js | 8 - 4 files changed, 540 insertions(+), 181 deletions(-) rename lib/cartodb/controllers/{map.js => map/anonymous.js} (69%) create mode 100644 lib/cartodb/controllers/map/index.js create mode 100644 lib/cartodb/controllers/map/named.js diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map/anonymous.js similarity index 69% rename from lib/cartodb/controllers/map.js rename to lib/cartodb/controllers/map/anonymous.js index f42d1b5d..9e269a60 100644 --- a/lib/cartodb/controllers/map.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -2,21 +2,20 @@ const _ = require('underscore'); const windshaft = require('windshaft'); const MapConfig = windshaft.model.MapConfig; const Datasource = windshaft.model.Datasource; -const ResourceLocator = require('../models/resource-locator'); -const cors = require('../middleware/cors'); -const cleanUpQueryParams = require('../middleware/clean-up-query-params'); -const credentials = require('../middleware/credentials'); -const dbConnSetup = require('../middleware/db-conn-setup'); -const authorize = require('../middleware/authorize'); -const cacheControlHeader = require('../middleware/cache-control-header'); -const cacheChannelHeader = require('../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../middleware/last-modified-header'); -const sendResponse = require('../middleware/send-response'); -const NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); -const CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider'); -const LayergroupMetadata = require('../utils/layergroup-metadata'); -const rateLimit = require('../middleware/rate-limit'); +const ResourceLocator = require('../../models/resource-locator'); +const cors = require('../../middleware/cors'); +const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); +const credentials = require('../../middleware/credentials'); +const dbConnSetup = require('../../middleware/db-conn-setup'); +const authorize = require('../../middleware/authorize'); +const cacheControlHeader = require('../../middleware/cache-control-header'); +const cacheChannelHeader = require('../../middleware/cache-channel-header'); +const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); +const lastModifiedHeader = require('../../middleware/last-modified-header'); +const sendResponse = require('../../middleware/send-response'); +const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); +const LayergroupMetadata = require('../../utils/layergroup-metadata'); +const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; /** @@ -32,7 +31,7 @@ const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; * @param {StatsBackend} statsBackend * @constructor */ -function MapController ( +function AnonymousMapController ( pgConnection, templateMaps, mapBackend, @@ -60,42 +59,37 @@ function MapController ( this.authApi = authApi; } -module.exports = MapController; +module.exports = AnonymousMapController; -MapController.prototype.register = function(mapRouter, templateRouter) { - mapRouter.get(`/`, this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS)); - mapRouter.post(`/`, this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS)); +AnonymousMapController.prototype.register = function (mapRouter) { + mapRouter.get(`/`, this.composeCreateMapMiddleware()); + mapRouter.post(`/`, this.composeCreateMapMiddleware()); mapRouter.options(`/`, cors('Content-Type')); - - const useTemplate = true; - - templateRouter.get( - `/:template_id/jsonp`, - this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.NAMED, useTemplate) - ); - - templateRouter.post( - `/:template_id`, - this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.NAMED, useTemplate) - ); }; -MapController.prototype.composeCreateMapMiddleware = function (endpointGroup, useTemplate = false) { - const isTemplateInstantiation = useTemplate; - const useTemplateHash = useTemplate; - const includeQuery = !useTemplate; - const label = useTemplate ? 'NAMED MAP LAYERGROUP' : 'ANONYMOUS LAYERGROUP'; - const addContext = !useTemplate; +AnonymousMapController.prototype.composeCreateMapMiddleware = function () { + const isTemplateInstantiation = false; + const useTemplateHash = false; + const includeQuery = true; + const label = 'ANONYMOUS LAYERGROUP'; + const addContext = true; return [ credentials(), authorize(this.authApi), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, endpointGroup), + rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS), cleanUpQueryParams(['aggregation']), initProfiler(isTemplateInstantiation), checkJsonContentType(), - this.getCreateMapMiddlewares(useTemplate), + checkCreateLayergroup(), + prepareAdapterMapConfig(this.mapConfigAdapter), + createLayergroup ( + this.mapBackend, + this.userLimitsApi, + this.pgConnection, + this.layergroupAffectedTables + ), incrementMapViewCount(this.metadataBackend), augmentLayergroupData(), cacheControlHeader({ ttl: global.environment.varnish.layergroupTtl || 86400, revalidate: true }), @@ -115,39 +109,6 @@ MapController.prototype.composeCreateMapMiddleware = function (endpointGroup, us ]; }; -MapController.prototype.getCreateMapMiddlewares = function (useTemplate) { - if (useTemplate) { - return [ - checkInstantiteLayergroup(), - getTemplate( - this.templateMaps, - this.pgConnection, - this.metadataBackend, - this.userLimitsApi, - this.mapConfigAdapter, - this.layergroupAffectedTables - ), - instantiateLayergroup( - this.mapBackend, - this.userLimitsApi, - this.pgConnection, - this.layergroupAffectedTables - ) - ]; - } - - return [ - checkCreateLayergroup(), - prepareAdapterMapConfig(this.mapConfigAdapter), - createLayergroup ( - this.mapBackend, - this.userLimitsApi, - this.pgConnection, - this.layergroupAffectedTables - ) - ]; -}; - function initProfiler (isTemplateInstantiation) { const operation = isTemplateInstantiation ? 'instance_template' : 'createmap'; @@ -170,30 +131,6 @@ function checkJsonContentType () { }; } -function checkInstantiteLayergroup () { - return function checkInstantiteLayergroupMiddleware(req, res, next) { - if (req.method === 'GET') { - const { callback, config } = req.query; - - if (callback === undefined || callback.length === 0) { - return next(new Error('callback parameter should be present and be a function name')); - } - - if (config) { - try { - req.body = JSON.parse(config); - } catch(e) { - return next(new Error('Invalid config parameter, should be a valid JSON')); - } - } - } - - req.profiler.done('checkInstantiteLayergroup'); - - return next(); - }; -} - function checkCreateLayergroup () { return function checkCreateLayergroupMiddleware (req, res, next) { if (req.method === 'GET') { @@ -215,51 +152,6 @@ function checkCreateLayergroup () { }; } -function getTemplate ( - templateMaps, - pgConnection, - metadataBackend, - userLimitsApi, - mapConfigAdapter, - affectedTablesCache -) { - return function getTemplateMiddleware (req, res, next) { - const templateParams = req.body; - const { user, dbuser, dbname, dbpassword, dbhost, dbport } = res.locals; - const { template_id } = req.params; - const { auth_token } = req.query; - - const params = { dbuser, dbname, dbpassword, dbhost, dbport }; - - const mapConfigProvider = new NamedMapMapConfigProvider( - templateMaps, - pgConnection, - metadataBackend, - userLimitsApi, - mapConfigAdapter, - affectedTablesCache, - user, - template_id, - templateParams, - auth_token, - params - ); - - mapConfigProvider.getMapConfig((err, mapConfig, rendererParams) => { - req.profiler.done('named.getMapConfig'); - if (err) { - return next(err); - } - - res.locals.mapConfig = mapConfig; - res.locals.rendererParams = rendererParams; - res.locals.mapConfigProvider = mapConfigProvider; - - next(); - }); - }; -} - function prepareAdapterMapConfig (mapConfigAdapter) { return function prepareAdapterMapConfigMiddleware(req, res, next) { const requestMapConfig = req.body; @@ -343,37 +235,6 @@ function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTabl }; } -function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTablesCache) { - return function instantiateLayergroupMiddleware (req, res, next) { - const { user, mapConfig, rendererParams } = res.locals; - const mapConfigProvider = new CreateLayergroupMapConfigProvider( - mapConfig, - user, - userLimitsApi, - pgConnection, - affectedTablesCache, - rendererParams - ); - - mapBackend.createLayergroup(mapConfig, rendererParams, mapConfigProvider, (err, layergroup) => { - req.profiler.done('createLayergroup'); - if (err) { - return next(err); - } - - res.body = layergroup; - - const { mapConfigProvider } = res.locals; - - res.locals.analysesResults = mapConfigProvider.analysesResults; - res.locals.template = mapConfigProvider.template; - res.locals.context = mapConfigProvider.context; - - next(); - }); - }; -} - function incrementMapViewCount (metadataBackend) { return function incrementMapViewCountMiddleware(req, res, next) { const { mapConfig, user } = res.locals; diff --git a/lib/cartodb/controllers/map/index.js b/lib/cartodb/controllers/map/index.js new file mode 100644 index 00000000..70d45fe9 --- /dev/null +++ b/lib/cartodb/controllers/map/index.js @@ -0,0 +1,60 @@ +const AnonymousMapController = require('./anonymous'); +const NamedMapController = require('./named'); + +module.exports = class MapController { + constructor ( + pgConnection, + templateMaps, + mapBackend, + metadataBackend, + surrogateKeysCache, + userLimitsApi, + layergroupAffectedTablesCache, + mapConfigAdapter, + statsBackend, + authApi + ) { + this.pgConnection = pgConnection; + this.templateMaps = templateMaps; + this.mapBackend = mapBackend; + this.metadataBackend = metadataBackend; + this.surrogateKeysCache = surrogateKeysCache; + this.userLimitsApi = userLimitsApi; + this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; + this.mapConfigAdapter = mapConfigAdapter; + this.statsBackend = statsBackend; + this.authApi = authApi; + } + + register (mapRouter, templateRouter) { + const anonymousMapController = new AnonymousMapController( + this.pgConnection, + this.templateMaps, + this.mapBackend, + this.metadataBackend, + this.surrogateKeysCache, + this.userLimitsApi, + this.layergroupAffectedTablesCache, + this.mapConfigAdapter, + this.statsBackend, + this.authApi + ); + + anonymousMapController.register(mapRouter); + + const namedMapController = new NamedMapController( + this.pgConnection, + this.templateMaps, + this.mapBackend, + this.metadataBackend, + this.surrogateKeysCache, + this.userLimitsApi, + this.layergroupAffectedTablesCache, + this.mapConfigAdapter, + this.statsBackend, + this.authApi + ); + + namedMapController.register(templateRouter); + } +}; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js new file mode 100644 index 00000000..9f4c6433 --- /dev/null +++ b/lib/cartodb/controllers/map/named.js @@ -0,0 +1,446 @@ +const _ = require('underscore'); +const ResourceLocator = require('../../models/resource-locator'); +const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); +const credentials = require('../../middleware/credentials'); +const dbConnSetup = require('../../middleware/db-conn-setup'); +const authorize = require('../../middleware/authorize'); +const cacheControlHeader = require('../../middleware/cache-control-header'); +const cacheChannelHeader = require('../../middleware/cache-channel-header'); +const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); +const lastModifiedHeader = require('../../middleware/last-modified-header'); +const sendResponse = require('../../middleware/send-response'); +const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); +const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); +const LayergroupMetadata = require('../../utils/layergroup-metadata'); +const rateLimit = require('../../middleware/rate-limit'); +const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; + +/** + * @param {AuthApi} authApi + * @param {PgConnection} pgConnection + * @param {TemplateMaps} templateMaps + * @param {MapBackend} mapBackend + * @param metadataBackend + * @param {SurrogateKeysCache} surrogateKeysCache + * @param {UserLimitsApi} userLimitsApi + * @param {LayergroupAffectedTables} layergroupAffectedTables + * @param {MapConfigAdapter} mapConfigAdapter + * @param {StatsBackend} statsBackend + * @constructor + */ +function NamedMapController ( + pgConnection, + templateMaps, + mapBackend, + metadataBackend, + surrogateKeysCache, + userLimitsApi, + layergroupAffectedTables, + mapConfigAdapter, + statsBackend, + authApi +) { + this.pgConnection = pgConnection; + this.templateMaps = templateMaps; + this.mapBackend = mapBackend; + this.metadataBackend = metadataBackend; + this.surrogateKeysCache = surrogateKeysCache; + this.userLimitsApi = userLimitsApi; + this.layergroupAffectedTables = layergroupAffectedTables; + + this.mapConfigAdapter = mapConfigAdapter; + const resourceLocator = new ResourceLocator(global.environment); + this.layergroupMetadata = new LayergroupMetadata(resourceLocator); + + this.statsBackend = statsBackend; + this.authApi = authApi; +} + +module.exports = NamedMapController; + +NamedMapController.prototype.register = function (templateRouter) { + templateRouter.get( + `/:template_id/jsonp`, + this.composeInstantiateTemplateMiddleware() + ); + + templateRouter.post( + `/:template_id`, + this.composeInstantiateTemplateMiddleware() + ); +}; + +NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () { + const isTemplateInstantiation = true; + const useTemplateHash = true; + const includeQuery = false; + const label = 'NAMED MAP LAYERGROUP'; + const addContext = false; + + return [ + credentials(), + authorize(this.authApi), + dbConnSetup(this.pgConnection), + rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED), + cleanUpQueryParams(['aggregation']), + initProfiler(isTemplateInstantiation), + checkJsonContentType(), + checkInstantiteLayergroup(), + getTemplate( + this.templateMaps, + this.pgConnection, + this.metadataBackend, + this.userLimitsApi, + this.mapConfigAdapter, + this.layergroupAffectedTables + ), + instantiateLayergroup( + this.mapBackend, + this.userLimitsApi, + this.pgConnection, + this.layergroupAffectedTables + ), + incrementMapViewCount(this.metadataBackend), + augmentLayergroupData(), + cacheControlHeader({ ttl: global.environment.varnish.layergroupTtl || 86400, revalidate: true }), + cacheChannelHeader(), + surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), + lastModifiedHeader({ now: true }), + setLastUpdatedTimeToLayergroup(), + setLayerStats(this.pgConnection, this.statsBackend), + setLayergroupIdHeader(this.templateMaps ,useTemplateHash), + setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), + setAnalysesMetadataToLayergroup(this.layergroupMetadata, includeQuery), + setTurboCartoMetadataToLayergroup(this.layergroupMetadata), + setAggregationMetadataToLayergroup(this.layergroupMetadata), + setTilejsonMetadataToLayergroup(this.layergroupMetadata), + sendResponse(), + augmentError({ label, addContext }) + ]; +}; + +function initProfiler (isTemplateInstantiation) { + const operation = isTemplateInstantiation ? 'instance_template' : 'createmap'; + + return function initProfilerMiddleware (req, res, next) { + req.profiler.start(`windshaft-cartodb.${operation}_${req.method.toLowerCase()}`); + req.profiler.done(`${operation}.initProfilerMiddleware`); + next(); + }; +} + +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')); + } + + req.profiler.done('checkJsonContentTypeMiddleware'); + + next(); + }; +} + +function checkInstantiteLayergroup () { + return function checkInstantiteLayergroupMiddleware(req, res, next) { + if (req.method === 'GET') { + const { callback, config } = req.query; + + if (callback === undefined || callback.length === 0) { + return next(new Error('callback parameter should be present and be a function name')); + } + + if (config) { + try { + req.body = JSON.parse(config); + } catch(e) { + return next(new Error('Invalid config parameter, should be a valid JSON')); + } + } + } + + req.profiler.done('checkInstantiteLayergroup'); + + return next(); + }; +} + +function getTemplate ( + templateMaps, + pgConnection, + metadataBackend, + userLimitsApi, + mapConfigAdapter, + affectedTablesCache +) { + return function getTemplateMiddleware (req, res, next) { + const templateParams = req.body; + const { user, dbuser, dbname, dbpassword, dbhost, dbport } = res.locals; + const { template_id } = req.params; + const { auth_token } = req.query; + + const params = { dbuser, dbname, dbpassword, dbhost, dbport }; + + const mapConfigProvider = new NamedMapMapConfigProvider( + templateMaps, + pgConnection, + metadataBackend, + userLimitsApi, + mapConfigAdapter, + affectedTablesCache, + user, + template_id, + templateParams, + auth_token, + params + ); + + mapConfigProvider.getMapConfig((err, mapConfig, rendererParams) => { + req.profiler.done('named.getMapConfig'); + if (err) { + return next(err); + } + + res.locals.mapConfig = mapConfig; + res.locals.rendererParams = rendererParams; + res.locals.mapConfigProvider = mapConfigProvider; + + next(); + }); + }; +} + +function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTablesCache) { + return function instantiateLayergroupMiddleware (req, res, next) { + const { user, mapConfig, rendererParams } = res.locals; + const mapConfigProvider = new CreateLayergroupMapConfigProvider( + mapConfig, + user, + userLimitsApi, + pgConnection, + affectedTablesCache, + rendererParams + ); + + mapBackend.createLayergroup(mapConfig, rendererParams, mapConfigProvider, (err, layergroup) => { + req.profiler.done('createLayergroup'); + if (err) { + return next(err); + } + + res.body = layergroup; + + const { mapConfigProvider } = res.locals; + + res.locals.analysesResults = mapConfigProvider.analysesResults; + res.locals.template = mapConfigProvider.template; + res.locals.context = mapConfigProvider.context; + + next(); + }); + }; +} + +function incrementMapViewCount (metadataBackend) { + return function incrementMapViewCountMiddleware(req, res, next) { + const { mapConfig, user } = res.locals; + + // Error won't blow up, just be logged. + metadataBackend.incMapviewCount(user, mapConfig.obj().stat_tag, (err) => { + req.profiler.done('incMapviewCount'); + + if (err) { + global.logger.log(`ERROR: failed to increment mapview count for user '${user}': ${err.message}`); + } + + next(); + }); + }; +} + +function augmentLayergroupData () { + return function augmentLayergroupDataMiddleware (req, res, next) { + const layergroup = res.body; + + // include in layergroup response the variables in serverMedata + // those variables are useful to send to the client information + // about how to reach this server or information about it + _.extend(layergroup, global.environment.serverMetadata); + + next(); + }; +} + +function setLastUpdatedTimeToLayergroup () { + return function setLastUpdatedTimeToLayergroupMiddleware (req, res, next) { + const { mapConfigProvider, analysesResults } = res.locals; + const layergroup = res.body; + + mapConfigProvider.getAffectedTables((err, affectedTables) => { + if (err) { + return next(err); + } + + if (!affectedTables) { + return next(); + } + + var lastUpdateTime = affectedTables.getLastUpdatedAt(); + + lastUpdateTime = getLastUpdatedTime(analysesResults, lastUpdateTime) || lastUpdateTime; + + // last update for layergroup cache buster + layergroup.layergroupid = layergroup.layergroupid + ':' + lastUpdateTime; + layergroup.last_updated = new Date(lastUpdateTime).toISOString(); + + next(); + }); + }; +} + +function getLastUpdatedTime(analysesResults, lastUpdateTime) { + if (!Array.isArray(analysesResults)) { + return lastUpdateTime; + } + return analysesResults.reduce(function(lastUpdateTime, analysis) { + return analysis.getNodes().reduce(function(lastNodeUpdatedAtTime, node) { + var nodeUpdatedAtDate = node.getUpdatedAt(); + var nodeUpdatedTimeAt = (nodeUpdatedAtDate && nodeUpdatedAtDate.getTime()) || 0; + return nodeUpdatedTimeAt > lastNodeUpdatedAtTime ? nodeUpdatedTimeAt : lastNodeUpdatedAtTime; + }, lastUpdateTime); + }, lastUpdateTime); +} + +function setLayerStats (pgConnection, statsBackend) { + return function setLayerStatsMiddleware(req, res, next) { + const { user, mapConfig } = res.locals; + const layergroup = res.body; + + pgConnection.getConnection(user, (err, connection) => { + if (err) { + return next(err); + } + + statsBackend.getStats(mapConfig, connection, function(err, layersStats) { + if (err) { + return next(err); + } + + if (layersStats.length > 0) { + layergroup.metadata.layers.forEach(function (layer, index) { + layer.meta.stats = layersStats[index]; + }); + } + + next(); + }); + }); + }; +} + +function setLayergroupIdHeader (templateMaps, useTemplateHash) { + return function setLayergroupIdHeaderMiddleware (req, res, next) { + const { user, template } = res.locals; + const layergroup = res.body; + + if (useTemplateHash) { + var templateHash = templateMaps.fingerPrint(template).substring(0, 8); + layergroup.layergroupid = `${user}@${templateHash}@${layergroup.layergroupid}`; + } + + res.set('X-Layergroup-Id', layergroup.layergroupid); + + next(); + }; +} + +function setDataviewsAndWidgetsUrlsToLayergroupMetadata (layergroupMetadata) { + return function setDataviewsAndWidgetsUrlsToLayergroupMetadataMiddleware (req, res, next) { + const { user, mapConfig } = res.locals; + const layergroup = res.body; + + layergroupMetadata.addDataviewsAndWidgetsUrls(user, layergroup, mapConfig.obj()); + + next(); + }; +} + +function setAnalysesMetadataToLayergroup (layergroupMetadata, includeQuery) { + return function setAnalysesMetadataToLayergroupMiddleware (req, res, next) { + const { user, analysesResults = [] } = res.locals; + const layergroup = res.body; + + layergroupMetadata.addAnalysesMetadata(user, layergroup, analysesResults, includeQuery); + + next(); + }; +} + +function setTurboCartoMetadataToLayergroup (layergroupMetadata) { + return function setTurboCartoMetadataToLayergroupMiddleware (req, res, next) { + const { mapConfig, context } = res.locals; + const layergroup = res.body; + + layergroupMetadata.addTurboCartoContextMetadata(layergroup, mapConfig.obj(), context); + + next(); + }; +} + +function setAggregationMetadataToLayergroup (layergroupMetadata) { + return function setAggregationMetadataToLayergroupMiddleware (req, res, next) { + const { mapConfig, context } = res.locals; + const layergroup = res.body; + + layergroupMetadata.addAggregationContextMetadata(layergroup, mapConfig.obj(), context); + + next(); + }; +} + +function setTilejsonMetadataToLayergroup (layergroupMetadata) { + return function augmentLayergroupTilejsonMiddleware (req, res, next) { + const { user, mapConfig } = res.locals; + const layergroup = res.body; + + layergroupMetadata.addTileJsonMetadata(layergroup, user, mapConfig); + + next(); + }; +} + +function augmentError (options) { + const { addContext = false, label = 'MAPS CONTROLLER' } = options; + + return function augmentErrorMiddleware (err, req, res, next) { + req.profiler.done('error'); + const { mapConfig } = res.locals; + + if (addContext) { + err = Number.isFinite(err.layerIndex) ? populateError(err, mapConfig) : err; + } + + err.label = label; + + next(err); + }; +} + +function populateError(err, mapConfig) { + var error = new Error(err.message); + error.http_status = err.http_status; + + if (!err.http_status && err.message.indexOf('column "the_geom_webmercator" does not exist') >= 0) { + error.http_status = 400; + } + + error.type = 'layer'; + error.subtype = err.message.indexOf('Postgis Plugin') >= 0 ? 'query' : undefined; + error.layer = { + id: mapConfig.getLayerId(err.layerIndex), + index: err.layerIndex, + type: mapConfig.layerType(err.layerIndex) + }; + + return error; +} diff --git a/test/unit/cartodb/ported/windshaft_server.test.js b/test/unit/cartodb/ported/windshaft_server.test.js index e6f07ea7..3f71ff76 100644 --- a/test/unit/cartodb/ported/windshaft_server.test.js +++ b/test/unit/cartodb/ported/windshaft_server.test.js @@ -33,12 +33,4 @@ describe('windshaft', function() { }, /Cannot read property 'mapnik' of undefined/ ); }); - - it('options are set on main windshaft object', function(){ - var ws = cartodbServer(serverOptions); - assert.ok(_.isObject(ws.bind)); - assert.ok(_.isObject(ws.grainstore)); - assert.equal(ws.base_url, '/tiles/:table'); - }); - }); From 64d540f23b094c3608949434256e162f3f0cbdc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 12:45:03 +0200 Subject: [PATCH 06/54] Extract initProfiler middlewar --- lib/cartodb/controllers/map/anonymous.js | 11 +---------- .../controllers/map/middlewares/init-profiler.js | 9 +++++++++ lib/cartodb/controllers/map/named.js | 11 +---------- 3 files changed, 11 insertions(+), 20 deletions(-) create mode 100644 lib/cartodb/controllers/map/middlewares/init-profiler.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index 9e269a60..a8b7f353 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -8,6 +8,7 @@ const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); const dbConnSetup = require('../../middleware/db-conn-setup'); const authorize = require('../../middleware/authorize'); +const initProfiler = require('./middlewares/init-profiler'); const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); @@ -109,16 +110,6 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { ]; }; -function initProfiler (isTemplateInstantiation) { - const operation = isTemplateInstantiation ? 'instance_template' : 'createmap'; - - return function initProfilerMiddleware (req, res, next) { - req.profiler.start(`windshaft-cartodb.${operation}_${req.method.toLowerCase()}`); - req.profiler.done(`${operation}.initProfilerMiddleware`); - next(); - }; -} - function checkJsonContentType () { return function checkJsonContentTypeMiddleware(req, res, next) { if (req.method === 'POST' && !req.is('application/json')) { diff --git a/lib/cartodb/controllers/map/middlewares/init-profiler.js b/lib/cartodb/controllers/map/middlewares/init-profiler.js new file mode 100644 index 00000000..6d0be211 --- /dev/null +++ b/lib/cartodb/controllers/map/middlewares/init-profiler.js @@ -0,0 +1,9 @@ +module.exports = function initProfiler (isTemplateInstantiation) { + const operation = isTemplateInstantiation ? 'instance_template' : 'createmap'; + + return function initProfilerMiddleware (req, res, next) { + req.profiler.start(`windshaft-cartodb.${operation}_${req.method.toLowerCase()}`); + req.profiler.done(`${operation}.initProfilerMiddleware`); + next(); + }; +}; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index 9f4c6433..ecaf3917 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -4,6 +4,7 @@ const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); const dbConnSetup = require('../../middleware/db-conn-setup'); const authorize = require('../../middleware/authorize'); +const initProfiler = require('./middlewares/init-profiler'); const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); @@ -119,16 +120,6 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () ]; }; -function initProfiler (isTemplateInstantiation) { - const operation = isTemplateInstantiation ? 'instance_template' : 'createmap'; - - return function initProfilerMiddleware (req, res, next) { - req.profiler.start(`windshaft-cartodb.${operation}_${req.method.toLowerCase()}`); - req.profiler.done(`${operation}.initProfilerMiddleware`); - next(); - }; -} - function checkJsonContentType () { return function checkJsonContentTypeMiddleware(req, res, next) { if (req.method === 'POST' && !req.is('application/json')) { From b68d2d9115f0e69d7c5fbf025de863c036d81b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 12:49:11 +0200 Subject: [PATCH 07/54] Extract checkJsonContentType middleware --- lib/cartodb/controllers/map/anonymous.js | 13 +------------ .../map/middlewares/check-json-content-type.js | 11 +++++++++++ lib/cartodb/controllers/map/named.js | 13 +------------ 3 files changed, 13 insertions(+), 24 deletions(-) create mode 100644 lib/cartodb/controllers/map/middlewares/check-json-content-type.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index a8b7f353..d90820c4 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -9,6 +9,7 @@ const credentials = require('../../middleware/credentials'); const dbConnSetup = require('../../middleware/db-conn-setup'); const authorize = require('../../middleware/authorize'); const initProfiler = require('./middlewares/init-profiler'); +const checkJsonContentType = require('./middlewares/check-json-content-type'); const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); @@ -110,18 +111,6 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = 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')); - } - - req.profiler.done('checkJsonContentTypeMiddleware'); - - next(); - }; -} - function checkCreateLayergroup () { return function checkCreateLayergroupMiddleware (req, res, next) { if (req.method === 'GET') { diff --git a/lib/cartodb/controllers/map/middlewares/check-json-content-type.js b/lib/cartodb/controllers/map/middlewares/check-json-content-type.js new file mode 100644 index 00000000..05aa6f26 --- /dev/null +++ b/lib/cartodb/controllers/map/middlewares/check-json-content-type.js @@ -0,0 +1,11 @@ +module.exports = 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')); + } + + req.profiler.done('checkJsonContentTypeMiddleware'); + + next(); + }; +}; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index ecaf3917..73822421 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -5,6 +5,7 @@ const credentials = require('../../middleware/credentials'); const dbConnSetup = require('../../middleware/db-conn-setup'); const authorize = require('../../middleware/authorize'); const initProfiler = require('./middlewares/init-profiler'); +const checkJsonContentType = require('./middlewares/check-json-content-type'); const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); @@ -120,18 +121,6 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = 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')); - } - - req.profiler.done('checkJsonContentTypeMiddleware'); - - next(); - }; -} - function checkInstantiteLayergroup () { return function checkInstantiteLayergroupMiddleware(req, res, next) { if (req.method === 'GET') { From 1d54a8dccda6bb9ca61993c462b447dc5733ac81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 13:01:23 +0200 Subject: [PATCH 08/54] Extract increment map view count middleware --- lib/cartodb/controllers/map/anonymous.js | 18 +----------------- .../middlewares/increment-map-view-count.js | 16 ++++++++++++++++ lib/cartodb/controllers/map/named.js | 18 +----------------- 3 files changed, 18 insertions(+), 34 deletions(-) create mode 100644 lib/cartodb/controllers/map/middlewares/increment-map-view-count.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index d90820c4..02c6807e 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -10,6 +10,7 @@ const dbConnSetup = require('../../middleware/db-conn-setup'); const authorize = require('../../middleware/authorize'); const initProfiler = require('./middlewares/init-profiler'); const checkJsonContentType = require('./middlewares/check-json-content-type'); +const incrementMapViewCount = require('./middlewares/increment-map-view-count'); const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); @@ -215,23 +216,6 @@ function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTabl }; } -function incrementMapViewCount (metadataBackend) { - return function incrementMapViewCountMiddleware(req, res, next) { - const { mapConfig, user } = res.locals; - - // Error won't blow up, just be logged. - metadataBackend.incMapviewCount(user, mapConfig.obj().stat_tag, (err) => { - req.profiler.done('incMapviewCount'); - - if (err) { - global.logger.log(`ERROR: failed to increment mapview count for user '${user}': ${err.message}`); - } - - next(); - }); - }; -} - function augmentLayergroupData () { return function augmentLayergroupDataMiddleware (req, res, next) { const layergroup = res.body; diff --git a/lib/cartodb/controllers/map/middlewares/increment-map-view-count.js b/lib/cartodb/controllers/map/middlewares/increment-map-view-count.js new file mode 100644 index 00000000..acf241fd --- /dev/null +++ b/lib/cartodb/controllers/map/middlewares/increment-map-view-count.js @@ -0,0 +1,16 @@ +module.exports = function incrementMapViewCount (metadataBackend) { + return function incrementMapViewCountMiddleware(req, res, next) { + const { mapConfig, user } = res.locals; + + // Error won't blow up, just be logged. + metadataBackend.incMapviewCount(user, mapConfig.obj().stat_tag, (err) => { + req.profiler.done('incMapviewCount'); + + if (err) { + global.logger.log(`ERROR: failed to increment mapview count for user '${user}': ${err.message}`); + } + + next(); + }); + }; +}; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index 73822421..f880587c 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -6,6 +6,7 @@ const dbConnSetup = require('../../middleware/db-conn-setup'); const authorize = require('../../middleware/authorize'); const initProfiler = require('./middlewares/init-profiler'); const checkJsonContentType = require('./middlewares/check-json-content-type'); +const incrementMapViewCount = require('./middlewares/increment-map-view-count'); const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); @@ -221,23 +222,6 @@ function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affecte }; } -function incrementMapViewCount (metadataBackend) { - return function incrementMapViewCountMiddleware(req, res, next) { - const { mapConfig, user } = res.locals; - - // Error won't blow up, just be logged. - metadataBackend.incMapviewCount(user, mapConfig.obj().stat_tag, (err) => { - req.profiler.done('incMapviewCount'); - - if (err) { - global.logger.log(`ERROR: failed to increment mapview count for user '${user}': ${err.message}`); - } - - next(); - }); - }; -} - function augmentLayergroupData () { return function augmentLayergroupDataMiddleware (req, res, next) { const layergroup = res.body; From 16e84511665a18c064642a8b6c9663f9b8a11133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 13:10:47 +0200 Subject: [PATCH 09/54] Extract augment layergroup data middleware --- lib/cartodb/controllers/map/anonymous.js | 15 +-------------- .../map/middlewares/augment-layergroup-data.js | 14 ++++++++++++++ lib/cartodb/controllers/map/named.js | 14 +------------- 3 files changed, 16 insertions(+), 27 deletions(-) create mode 100644 lib/cartodb/controllers/map/middlewares/augment-layergroup-data.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index 02c6807e..c5fa19a5 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -1,4 +1,3 @@ -const _ = require('underscore'); const windshaft = require('windshaft'); const MapConfig = windshaft.model.MapConfig; const Datasource = windshaft.model.Datasource; @@ -11,6 +10,7 @@ const authorize = require('../../middleware/authorize'); const initProfiler = require('./middlewares/init-profiler'); const checkJsonContentType = require('./middlewares/check-json-content-type'); const incrementMapViewCount = require('./middlewares/increment-map-view-count'); +const augmentLayergroupData = require('./middlewares/augment-layergroup-data'); const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); @@ -216,19 +216,6 @@ function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTabl }; } -function augmentLayergroupData () { - return function augmentLayergroupDataMiddleware (req, res, next) { - const layergroup = res.body; - - // include in layergroup response the variables in serverMedata - // those variables are useful to send to the client information - // about how to reach this server or information about it - _.extend(layergroup, global.environment.serverMetadata); - - next(); - }; -} - function setLastUpdatedTimeToLayergroup () { return function setLastUpdatedTimeToLayergroupMiddleware (req, res, next) { const { mapConfigProvider, analysesResults } = res.locals; diff --git a/lib/cartodb/controllers/map/middlewares/augment-layergroup-data.js b/lib/cartodb/controllers/map/middlewares/augment-layergroup-data.js new file mode 100644 index 00000000..65a6702d --- /dev/null +++ b/lib/cartodb/controllers/map/middlewares/augment-layergroup-data.js @@ -0,0 +1,14 @@ +const _ = require('underscore'); + +module.exports = function augmentLayergroupData () { + return function augmentLayergroupDataMiddleware (req, res, next) { + const layergroup = res.body; + + // include in layergroup response the variables in serverMedata + // those variables are useful to send to the client information + // about how to reach this server or information about it + _.extend(layergroup, global.environment.serverMetadata); + + next(); + }; +}; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index f880587c..68504fdc 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -7,6 +7,7 @@ const authorize = require('../../middleware/authorize'); const initProfiler = require('./middlewares/init-profiler'); const checkJsonContentType = require('./middlewares/check-json-content-type'); const incrementMapViewCount = require('./middlewares/increment-map-view-count'); +const augmentLayergroupData = require('./middlewares/augment-layergroup-data'); const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); @@ -222,19 +223,6 @@ function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affecte }; } -function augmentLayergroupData () { - return function augmentLayergroupDataMiddleware (req, res, next) { - const layergroup = res.body; - - // include in layergroup response the variables in serverMedata - // those variables are useful to send to the client information - // about how to reach this server or information about it - _.extend(layergroup, global.environment.serverMetadata); - - next(); - }; -} - function setLastUpdatedTimeToLayergroup () { return function setLastUpdatedTimeToLayergroupMiddleware (req, res, next) { const { mapConfigProvider, analysesResults } = res.locals; From e79d9ec2f9687d94e1ad4bbec7c6f03221a89d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 13:27:01 +0200 Subject: [PATCH 10/54] Extract lastUpdatedTimeLayergroup middleware --- lib/cartodb/controllers/map/anonymous.js | 43 +------------------ .../last-updated-time-layergroup.js | 39 +++++++++++++++++ lib/cartodb/controllers/map/named.js | 43 +------------------ 3 files changed, 43 insertions(+), 82 deletions(-) create mode 100644 lib/cartodb/controllers/map/middlewares/last-updated-time-layergroup.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index c5fa19a5..073b8982 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -15,6 +15,7 @@ const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); +const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); const sendResponse = require('../../middleware/send-response'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); const LayergroupMetadata = require('../../utils/layergroup-metadata'); @@ -99,7 +100,7 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), lastModifiedHeader({ now: true }), - setLastUpdatedTimeToLayergroup(), + lastUpdatedTimeLayergroup(), setLayerStats(this.pgConnection, this.statsBackend), setLayergroupIdHeader(this.templateMaps ,useTemplateHash), setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), @@ -216,46 +217,6 @@ function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTabl }; } -function setLastUpdatedTimeToLayergroup () { - return function setLastUpdatedTimeToLayergroupMiddleware (req, res, next) { - const { mapConfigProvider, analysesResults } = res.locals; - const layergroup = res.body; - - mapConfigProvider.getAffectedTables((err, affectedTables) => { - if (err) { - return next(err); - } - - if (!affectedTables) { - return next(); - } - - var lastUpdateTime = affectedTables.getLastUpdatedAt(); - - lastUpdateTime = getLastUpdatedTime(analysesResults, lastUpdateTime) || lastUpdateTime; - - // last update for layergroup cache buster - layergroup.layergroupid = layergroup.layergroupid + ':' + lastUpdateTime; - layergroup.last_updated = new Date(lastUpdateTime).toISOString(); - - next(); - }); - }; -} - -function getLastUpdatedTime(analysesResults, lastUpdateTime) { - if (!Array.isArray(analysesResults)) { - return lastUpdateTime; - } - return analysesResults.reduce(function(lastUpdateTime, analysis) { - return analysis.getNodes().reduce(function(lastNodeUpdatedAtTime, node) { - var nodeUpdatedAtDate = node.getUpdatedAt(); - var nodeUpdatedTimeAt = (nodeUpdatedAtDate && nodeUpdatedAtDate.getTime()) || 0; - return nodeUpdatedTimeAt > lastNodeUpdatedAtTime ? nodeUpdatedTimeAt : lastNodeUpdatedAtTime; - }, lastUpdateTime); - }, lastUpdateTime); -} - function setLayerStats (pgConnection, statsBackend) { return function setLayerStatsMiddleware(req, res, next) { const { user, mapConfig } = res.locals; diff --git a/lib/cartodb/controllers/map/middlewares/last-updated-time-layergroup.js b/lib/cartodb/controllers/map/middlewares/last-updated-time-layergroup.js new file mode 100644 index 00000000..5b7f091b --- /dev/null +++ b/lib/cartodb/controllers/map/middlewares/last-updated-time-layergroup.js @@ -0,0 +1,39 @@ +module.exports = function setLastUpdatedTimeToLayergroup () { + return function setLastUpdatedTimeToLayergroupMiddleware (req, res, next) { + const { mapConfigProvider, analysesResults } = res.locals; + const layergroup = res.body; + + mapConfigProvider.getAffectedTables((err, affectedTables) => { + if (err) { + return next(err); + } + + if (!affectedTables) { + return next(); + } + + var lastUpdateTime = affectedTables.getLastUpdatedAt(); + + lastUpdateTime = getLastUpdatedTime(analysesResults, lastUpdateTime) || lastUpdateTime; + + // last update for layergroup cache buster + layergroup.layergroupid = layergroup.layergroupid + ':' + lastUpdateTime; + layergroup.last_updated = new Date(lastUpdateTime).toISOString(); + + next(); + }); + }; +}; + +function getLastUpdatedTime(analysesResults, lastUpdateTime) { + if (!Array.isArray(analysesResults)) { + return lastUpdateTime; + } + return analysesResults.reduce(function(lastUpdateTime, analysis) { + return analysis.getNodes().reduce(function(lastNodeUpdatedAtTime, node) { + var nodeUpdatedAtDate = node.getUpdatedAt(); + var nodeUpdatedTimeAt = (nodeUpdatedAtDate && nodeUpdatedAtDate.getTime()) || 0; + return nodeUpdatedTimeAt > lastNodeUpdatedAtTime ? nodeUpdatedTimeAt : lastNodeUpdatedAtTime; + }, lastUpdateTime); + }, lastUpdateTime); +} diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index 68504fdc..00a8f8d2 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -12,6 +12,7 @@ const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); +const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); const sendResponse = require('../../middleware/send-response'); const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); @@ -110,7 +111,7 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), lastModifiedHeader({ now: true }), - setLastUpdatedTimeToLayergroup(), + lastUpdatedTimeLayergroup(), setLayerStats(this.pgConnection, this.statsBackend), setLayergroupIdHeader(this.templateMaps ,useTemplateHash), setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), @@ -223,46 +224,6 @@ function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affecte }; } -function setLastUpdatedTimeToLayergroup () { - return function setLastUpdatedTimeToLayergroupMiddleware (req, res, next) { - const { mapConfigProvider, analysesResults } = res.locals; - const layergroup = res.body; - - mapConfigProvider.getAffectedTables((err, affectedTables) => { - if (err) { - return next(err); - } - - if (!affectedTables) { - return next(); - } - - var lastUpdateTime = affectedTables.getLastUpdatedAt(); - - lastUpdateTime = getLastUpdatedTime(analysesResults, lastUpdateTime) || lastUpdateTime; - - // last update for layergroup cache buster - layergroup.layergroupid = layergroup.layergroupid + ':' + lastUpdateTime; - layergroup.last_updated = new Date(lastUpdateTime).toISOString(); - - next(); - }); - }; -} - -function getLastUpdatedTime(analysesResults, lastUpdateTime) { - if (!Array.isArray(analysesResults)) { - return lastUpdateTime; - } - return analysesResults.reduce(function(lastUpdateTime, analysis) { - return analysis.getNodes().reduce(function(lastNodeUpdatedAtTime, node) { - var nodeUpdatedAtDate = node.getUpdatedAt(); - var nodeUpdatedTimeAt = (nodeUpdatedAtDate && nodeUpdatedAtDate.getTime()) || 0; - return nodeUpdatedTimeAt > lastNodeUpdatedAtTime ? nodeUpdatedTimeAt : lastNodeUpdatedAtTime; - }, lastUpdateTime); - }, lastUpdateTime); -} - function setLayerStats (pgConnection, statsBackend) { return function setLayerStatsMiddleware(req, res, next) { const { user, mapConfig } = res.locals; From 947a367865ffd3f02fbb6450b41de84760e725b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 13:31:37 +0200 Subject: [PATCH 11/54] Extract layerStats middleware --- lib/cartodb/controllers/map/anonymous.js | 30 ++----------------- .../map/middlewares/layer-stats.js | 26 ++++++++++++++++ lib/cartodb/controllers/map/named.js | 30 ++----------------- 3 files changed, 30 insertions(+), 56 deletions(-) create mode 100644 lib/cartodb/controllers/map/middlewares/layer-stats.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index 073b8982..bf672a15 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -16,6 +16,7 @@ const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); +const layerStats = require('./middlewares/layer-stats'); const sendResponse = require('../../middleware/send-response'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); const LayergroupMetadata = require('../../utils/layergroup-metadata'); @@ -101,7 +102,7 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), lastModifiedHeader({ now: true }), lastUpdatedTimeLayergroup(), - setLayerStats(this.pgConnection, this.statsBackend), + layerStats(this.pgConnection, this.statsBackend), setLayergroupIdHeader(this.templateMaps ,useTemplateHash), setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), setAnalysesMetadataToLayergroup(this.layergroupMetadata, includeQuery), @@ -217,33 +218,6 @@ function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTabl }; } -function setLayerStats (pgConnection, statsBackend) { - return function setLayerStatsMiddleware(req, res, next) { - const { user, mapConfig } = res.locals; - const layergroup = res.body; - - pgConnection.getConnection(user, (err, connection) => { - if (err) { - return next(err); - } - - statsBackend.getStats(mapConfig, connection, function(err, layersStats) { - if (err) { - return next(err); - } - - if (layersStats.length > 0) { - layergroup.metadata.layers.forEach(function (layer, index) { - layer.meta.stats = layersStats[index]; - }); - } - - next(); - }); - }); - }; -} - function setLayergroupIdHeader (templateMaps, useTemplateHash) { return function setLayergroupIdHeaderMiddleware (req, res, next) { const { user, template } = res.locals; diff --git a/lib/cartodb/controllers/map/middlewares/layer-stats.js b/lib/cartodb/controllers/map/middlewares/layer-stats.js new file mode 100644 index 00000000..e6ca00e6 --- /dev/null +++ b/lib/cartodb/controllers/map/middlewares/layer-stats.js @@ -0,0 +1,26 @@ +module.exports = function setLayerStats (pgConnection, statsBackend) { + return function setLayerStatsMiddleware(req, res, next) { + const { user, mapConfig } = res.locals; + const layergroup = res.body; + + pgConnection.getConnection(user, (err, connection) => { + if (err) { + return next(err); + } + + statsBackend.getStats(mapConfig, connection, function(err, layersStats) { + if (err) { + return next(err); + } + + if (layersStats.length > 0) { + layergroup.metadata.layers.forEach(function (layer, index) { + layer.meta.stats = layersStats[index]; + }); + } + + next(); + }); + }); + }; +}; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index 00a8f8d2..cdff9367 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -13,6 +13,7 @@ const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); +const layerStats = require('./middlewares/layer-stats'); const sendResponse = require('../../middleware/send-response'); const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); @@ -112,7 +113,7 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), lastModifiedHeader({ now: true }), lastUpdatedTimeLayergroup(), - setLayerStats(this.pgConnection, this.statsBackend), + layerStats(this.pgConnection, this.statsBackend), setLayergroupIdHeader(this.templateMaps ,useTemplateHash), setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), setAnalysesMetadataToLayergroup(this.layergroupMetadata, includeQuery), @@ -224,33 +225,6 @@ function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affecte }; } -function setLayerStats (pgConnection, statsBackend) { - return function setLayerStatsMiddleware(req, res, next) { - const { user, mapConfig } = res.locals; - const layergroup = res.body; - - pgConnection.getConnection(user, (err, connection) => { - if (err) { - return next(err); - } - - statsBackend.getStats(mapConfig, connection, function(err, layersStats) { - if (err) { - return next(err); - } - - if (layersStats.length > 0) { - layergroup.metadata.layers.forEach(function (layer, index) { - layer.meta.stats = layersStats[index]; - }); - } - - next(); - }); - }); - }; -} - function setLayergroupIdHeader (templateMaps, useTemplateHash) { return function setLayergroupIdHeaderMiddleware (req, res, next) { const { user, template } = res.locals; From 78356ab29810b21d40212ab0130063af3b8f0f95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 13:41:41 +0200 Subject: [PATCH 12/54] Extract layergroupIdHeader middleware --- lib/cartodb/controllers/map/anonymous.js | 19 ++----------------- .../map/middlewares/layergroup-id-header.js | 15 +++++++++++++++ lib/cartodb/controllers/map/named.js | 19 ++----------------- 3 files changed, 19 insertions(+), 34 deletions(-) create mode 100644 lib/cartodb/controllers/map/middlewares/layergroup-id-header.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index bf672a15..2ddd12c7 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -17,6 +17,7 @@ const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); const layerStats = require('./middlewares/layer-stats'); +const layergroupIdHeader = require('./middlewares/layergroup-id-header'); const sendResponse = require('../../middleware/send-response'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); const LayergroupMetadata = require('../../utils/layergroup-metadata'); @@ -103,7 +104,7 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { lastModifiedHeader({ now: true }), lastUpdatedTimeLayergroup(), layerStats(this.pgConnection, this.statsBackend), - setLayergroupIdHeader(this.templateMaps ,useTemplateHash), + layergroupIdHeader(this.templateMaps ,useTemplateHash), setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), setAnalysesMetadataToLayergroup(this.layergroupMetadata, includeQuery), setTurboCartoMetadataToLayergroup(this.layergroupMetadata), @@ -218,22 +219,6 @@ function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTabl }; } -function setLayergroupIdHeader (templateMaps, useTemplateHash) { - return function setLayergroupIdHeaderMiddleware (req, res, next) { - const { user, template } = res.locals; - const layergroup = res.body; - - if (useTemplateHash) { - var templateHash = templateMaps.fingerPrint(template).substring(0, 8); - layergroup.layergroupid = `${user}@${templateHash}@${layergroup.layergroupid}`; - } - - res.set('X-Layergroup-Id', layergroup.layergroupid); - - next(); - }; -} - function setDataviewsAndWidgetsUrlsToLayergroupMetadata (layergroupMetadata) { return function setDataviewsAndWidgetsUrlsToLayergroupMetadataMiddleware (req, res, next) { const { user, mapConfig } = res.locals; diff --git a/lib/cartodb/controllers/map/middlewares/layergroup-id-header.js b/lib/cartodb/controllers/map/middlewares/layergroup-id-header.js new file mode 100644 index 00000000..8141d6a6 --- /dev/null +++ b/lib/cartodb/controllers/map/middlewares/layergroup-id-header.js @@ -0,0 +1,15 @@ +module.exports = function setLayergroupIdHeader (templateMaps, useTemplateHash) { + return function setLayergroupIdHeaderMiddleware (req, res, next) { + const { user, template } = res.locals; + const layergroup = res.body; + + if (useTemplateHash) { + var templateHash = templateMaps.fingerPrint(template).substring(0, 8); + layergroup.layergroupid = `${user}@${templateHash}@${layergroup.layergroupid}`; + } + + res.set('X-Layergroup-Id', layergroup.layergroupid); + + next(); + }; +}; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index cdff9367..e599212e 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -14,6 +14,7 @@ const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); const layerStats = require('./middlewares/layer-stats'); +const layergroupIdHeader = require('./middlewares/layergroup-id-header'); const sendResponse = require('../../middleware/send-response'); const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); @@ -114,7 +115,7 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () lastModifiedHeader({ now: true }), lastUpdatedTimeLayergroup(), layerStats(this.pgConnection, this.statsBackend), - setLayergroupIdHeader(this.templateMaps ,useTemplateHash), + layergroupIdHeader(this.templateMaps ,useTemplateHash), setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), setAnalysesMetadataToLayergroup(this.layergroupMetadata, includeQuery), setTurboCartoMetadataToLayergroup(this.layergroupMetadata), @@ -225,22 +226,6 @@ function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affecte }; } -function setLayergroupIdHeader (templateMaps, useTemplateHash) { - return function setLayergroupIdHeaderMiddleware (req, res, next) { - const { user, template } = res.locals; - const layergroup = res.body; - - if (useTemplateHash) { - var templateHash = templateMaps.fingerPrint(template).substring(0, 8); - layergroup.layergroupid = `${user}@${templateHash}@${layergroup.layergroupid}`; - } - - res.set('X-Layergroup-Id', layergroup.layergroupid); - - next(); - }; -} - function setDataviewsAndWidgetsUrlsToLayergroupMetadata (layergroupMetadata) { return function setDataviewsAndWidgetsUrlsToLayergroupMetadataMiddleware (req, res, next) { const { user, mapConfig } = res.locals; From e5aff3f3663b8828e2208e21b6134d6e000b3519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 14:06:23 +0200 Subject: [PATCH 13/54] Extract layergroup-metadata middleware --- lib/cartodb/controllers/map/anonymous.js | 62 +------------------ .../map/middlewares/layergroup-metadata.js | 14 +++++ lib/cartodb/controllers/map/named.js | 62 +------------------ 3 files changed, 18 insertions(+), 120 deletions(-) create mode 100644 lib/cartodb/controllers/map/middlewares/layergroup-metadata.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index 2ddd12c7..665ba799 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -18,6 +18,7 @@ const lastModifiedHeader = require('../../middleware/last-modified-header'); const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); const layerStats = require('./middlewares/layer-stats'); const layergroupIdHeader = require('./middlewares/layergroup-id-header'); +const layergroupMetadata = require('./middlewares/layergroup-metadata'); const sendResponse = require('../../middleware/send-response'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); const LayergroupMetadata = require('../../utils/layergroup-metadata'); @@ -105,11 +106,7 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { lastUpdatedTimeLayergroup(), layerStats(this.pgConnection, this.statsBackend), layergroupIdHeader(this.templateMaps ,useTemplateHash), - setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), - setAnalysesMetadataToLayergroup(this.layergroupMetadata, includeQuery), - setTurboCartoMetadataToLayergroup(this.layergroupMetadata), - setAggregationMetadataToLayergroup(this.layergroupMetadata), - setTilejsonMetadataToLayergroup(this.layergroupMetadata), + layergroupMetadata(this.layergroupMetadata, includeQuery), sendResponse(), augmentError({ label, addContext }) ]; @@ -219,61 +216,6 @@ function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTabl }; } -function setDataviewsAndWidgetsUrlsToLayergroupMetadata (layergroupMetadata) { - return function setDataviewsAndWidgetsUrlsToLayergroupMetadataMiddleware (req, res, next) { - const { user, mapConfig } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addDataviewsAndWidgetsUrls(user, layergroup, mapConfig.obj()); - - next(); - }; -} - -function setAnalysesMetadataToLayergroup (layergroupMetadata, includeQuery) { - return function setAnalysesMetadataToLayergroupMiddleware (req, res, next) { - const { user, analysesResults = [] } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addAnalysesMetadata(user, layergroup, analysesResults, includeQuery); - - next(); - }; -} - -function setTurboCartoMetadataToLayergroup (layergroupMetadata) { - return function setTurboCartoMetadataToLayergroupMiddleware (req, res, next) { - const { mapConfig, context } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addTurboCartoContextMetadata(layergroup, mapConfig.obj(), context); - - next(); - }; -} - -function setAggregationMetadataToLayergroup (layergroupMetadata) { - return function setAggregationMetadataToLayergroupMiddleware (req, res, next) { - const { mapConfig, context } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addAggregationContextMetadata(layergroup, mapConfig.obj(), context); - - next(); - }; -} - -function setTilejsonMetadataToLayergroup (layergroupMetadata) { - return function augmentLayergroupTilejsonMiddleware (req, res, next) { - const { user, mapConfig } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addTileJsonMetadata(layergroup, user, mapConfig); - - next(); - }; -} - function augmentError (options) { const { addContext = false, label = 'MAPS CONTROLLER' } = options; diff --git a/lib/cartodb/controllers/map/middlewares/layergroup-metadata.js b/lib/cartodb/controllers/map/middlewares/layergroup-metadata.js new file mode 100644 index 00000000..301089df --- /dev/null +++ b/lib/cartodb/controllers/map/middlewares/layergroup-metadata.js @@ -0,0 +1,14 @@ +module.exports = function setMetadataToLayergroup (layergroupMetadata, includeQuery) { + return function setMetadataToLayergroupMiddleware (req, res, next) { + const { user, mapConfig, analysesResults = [], context } = res.locals; + const layergroup = res.body; + + layergroupMetadata.addDataviewsAndWidgetsUrls(user, layergroup, mapConfig.obj()); + layergroupMetadata.addAnalysesMetadata(user, layergroup, analysesResults, includeQuery); + layergroupMetadata.addTurboCartoContextMetadata(layergroup, mapConfig.obj(), context); + layergroupMetadata.addAggregationContextMetadata(layergroup, mapConfig.obj(), context); + layergroupMetadata.addTileJsonMetadata(layergroup, user, mapConfig); + + next(); + }; +}; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index e599212e..5707053a 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -15,6 +15,7 @@ const lastModifiedHeader = require('../../middleware/last-modified-header'); const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); const layerStats = require('./middlewares/layer-stats'); const layergroupIdHeader = require('./middlewares/layergroup-id-header'); +const layergroupMetadata = require('./middlewares/layergroup-metadata'); const sendResponse = require('../../middleware/send-response'); const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); @@ -116,11 +117,7 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () lastUpdatedTimeLayergroup(), layerStats(this.pgConnection, this.statsBackend), layergroupIdHeader(this.templateMaps ,useTemplateHash), - setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), - setAnalysesMetadataToLayergroup(this.layergroupMetadata, includeQuery), - setTurboCartoMetadataToLayergroup(this.layergroupMetadata), - setAggregationMetadataToLayergroup(this.layergroupMetadata), - setTilejsonMetadataToLayergroup(this.layergroupMetadata), + layergroupMetadata(this.layergroupMetadata, includeQuery), sendResponse(), augmentError({ label, addContext }) ]; @@ -226,61 +223,6 @@ function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affecte }; } -function setDataviewsAndWidgetsUrlsToLayergroupMetadata (layergroupMetadata) { - return function setDataviewsAndWidgetsUrlsToLayergroupMetadataMiddleware (req, res, next) { - const { user, mapConfig } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addDataviewsAndWidgetsUrls(user, layergroup, mapConfig.obj()); - - next(); - }; -} - -function setAnalysesMetadataToLayergroup (layergroupMetadata, includeQuery) { - return function setAnalysesMetadataToLayergroupMiddleware (req, res, next) { - const { user, analysesResults = [] } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addAnalysesMetadata(user, layergroup, analysesResults, includeQuery); - - next(); - }; -} - -function setTurboCartoMetadataToLayergroup (layergroupMetadata) { - return function setTurboCartoMetadataToLayergroupMiddleware (req, res, next) { - const { mapConfig, context } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addTurboCartoContextMetadata(layergroup, mapConfig.obj(), context); - - next(); - }; -} - -function setAggregationMetadataToLayergroup (layergroupMetadata) { - return function setAggregationMetadataToLayergroupMiddleware (req, res, next) { - const { mapConfig, context } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addAggregationContextMetadata(layergroup, mapConfig.obj(), context); - - next(); - }; -} - -function setTilejsonMetadataToLayergroup (layergroupMetadata) { - return function augmentLayergroupTilejsonMiddleware (req, res, next) { - const { user, mapConfig } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addTileJsonMetadata(layergroup, user, mapConfig); - - next(); - }; -} - function augmentError (options) { const { addContext = false, label = 'MAPS CONTROLLER' } = options; From 9377b73aa30201c3d8c983b056b004474191b153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 14:12:21 +0200 Subject: [PATCH 14/54] Extract map error middleware --- lib/cartodb/controllers/map/anonymous.js | 39 +----------------- .../controllers/map/middlewares/map-error.js | 35 ++++++++++++++++ lib/cartodb/controllers/map/named.js | 40 +------------------ 3 files changed, 39 insertions(+), 75 deletions(-) create mode 100644 lib/cartodb/controllers/map/middlewares/map-error.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index 665ba799..b90c6d0b 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -19,6 +19,7 @@ const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layer const layerStats = require('./middlewares/layer-stats'); const layergroupIdHeader = require('./middlewares/layergroup-id-header'); const layergroupMetadata = require('./middlewares/layergroup-metadata'); +const mapError = require('./middlewares/map-error'); const sendResponse = require('../../middleware/send-response'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); const LayergroupMetadata = require('../../utils/layergroup-metadata'); @@ -108,7 +109,7 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { layergroupIdHeader(this.templateMaps ,useTemplateHash), layergroupMetadata(this.layergroupMetadata, includeQuery), sendResponse(), - augmentError({ label, addContext }) + mapError({ label, addContext }) ]; }; @@ -215,39 +216,3 @@ function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTabl }); }; } - -function augmentError (options) { - const { addContext = false, label = 'MAPS CONTROLLER' } = options; - - return function augmentErrorMiddleware (err, req, res, next) { - req.profiler.done('error'); - const { mapConfig } = res.locals; - - if (addContext) { - err = Number.isFinite(err.layerIndex) ? populateError(err, mapConfig) : err; - } - - err.label = label; - - next(err); - }; -} - -function populateError(err, mapConfig) { - var error = new Error(err.message); - error.http_status = err.http_status; - - if (!err.http_status && err.message.indexOf('column "the_geom_webmercator" does not exist') >= 0) { - error.http_status = 400; - } - - error.type = 'layer'; - error.subtype = err.message.indexOf('Postgis Plugin') >= 0 ? 'query' : undefined; - error.layer = { - id: mapConfig.getLayerId(err.layerIndex), - index: err.layerIndex, - type: mapConfig.layerType(err.layerIndex) - }; - - return error; -} diff --git a/lib/cartodb/controllers/map/middlewares/map-error.js b/lib/cartodb/controllers/map/middlewares/map-error.js new file mode 100644 index 00000000..6d87a93d --- /dev/null +++ b/lib/cartodb/controllers/map/middlewares/map-error.js @@ -0,0 +1,35 @@ +module.exports = function mapError (options) { + const { addContext = false, label = 'MAPS CONTROLLER' } = options; + + return function mapErrorMiddleware (err, req, res, next) { + req.profiler.done('error'); + const { mapConfig } = res.locals; + + if (addContext) { + err = Number.isFinite(err.layerIndex) ? populateError(err, mapConfig) : err; + } + + err.label = label; + + next(err); + }; +}; + +function populateError(err, mapConfig) { + var error = new Error(err.message); + error.http_status = err.http_status; + + if (!err.http_status && err.message.indexOf('column "the_geom_webmercator" does not exist') >= 0) { + error.http_status = 400; + } + + error.type = 'layer'; + error.subtype = err.message.indexOf('Postgis Plugin') >= 0 ? 'query' : undefined; + error.layer = { + id: mapConfig.getLayerId(err.layerIndex), + index: err.layerIndex, + type: mapConfig.layerType(err.layerIndex) + }; + + return error; +} diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index 5707053a..b29cb06f 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -1,4 +1,3 @@ -const _ = require('underscore'); const ResourceLocator = require('../../models/resource-locator'); const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); @@ -16,6 +15,7 @@ const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layer const layerStats = require('./middlewares/layer-stats'); const layergroupIdHeader = require('./middlewares/layergroup-id-header'); const layergroupMetadata = require('./middlewares/layergroup-metadata'); +const mapError = require('./middlewares/map-error'); const sendResponse = require('../../middleware/send-response'); const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); @@ -119,7 +119,7 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () layergroupIdHeader(this.templateMaps ,useTemplateHash), layergroupMetadata(this.layergroupMetadata, includeQuery), sendResponse(), - augmentError({ label, addContext }) + mapError({ label, addContext }) ]; }; @@ -222,39 +222,3 @@ function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affecte }); }; } - -function augmentError (options) { - const { addContext = false, label = 'MAPS CONTROLLER' } = options; - - return function augmentErrorMiddleware (err, req, res, next) { - req.profiler.done('error'); - const { mapConfig } = res.locals; - - if (addContext) { - err = Number.isFinite(err.layerIndex) ? populateError(err, mapConfig) : err; - } - - err.label = label; - - next(err); - }; -} - -function populateError(err, mapConfig) { - var error = new Error(err.message); - error.http_status = err.http_status; - - if (!err.http_status && err.message.indexOf('column "the_geom_webmercator" does not exist') >= 0) { - error.http_status = 400; - } - - error.type = 'layer'; - error.subtype = err.message.indexOf('Postgis Plugin') >= 0 ? 'query' : undefined; - error.layer = { - id: mapConfig.getLayerId(err.layerIndex), - index: err.layerIndex, - type: mapConfig.layerType(err.layerIndex) - }; - - return error; -} From 3576eb8081e5a755b1f34d1cfc0619bbf63f7bd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 14:16:13 +0200 Subject: [PATCH 15/54] Do not use template strings --- lib/cartodb/controllers/map/anonymous.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index b90c6d0b..e64b57ea 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -70,9 +70,9 @@ function AnonymousMapController ( module.exports = AnonymousMapController; AnonymousMapController.prototype.register = function (mapRouter) { - mapRouter.get(`/`, this.composeCreateMapMiddleware()); - mapRouter.post(`/`, this.composeCreateMapMiddleware()); - mapRouter.options(`/`, cors('Content-Type')); + mapRouter.get('/', this.composeCreateMapMiddleware()); + mapRouter.post('/', this.composeCreateMapMiddleware()); + mapRouter.options('/', cors('Content-Type')); }; AnonymousMapController.prototype.composeCreateMapMiddleware = function () { From 04b65c7c0d0e2183440f59d0c623c8b0ea792d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 14:21:20 +0200 Subject: [PATCH 16/54] Please jshint --- test/unit/cartodb/ported/windshaft_server.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unit/cartodb/ported/windshaft_server.test.js b/test/unit/cartodb/ported/windshaft_server.test.js index 3f71ff76..ad9ed1d9 100644 --- a/test/unit/cartodb/ported/windshaft_server.test.js +++ b/test/unit/cartodb/ported/windshaft_server.test.js @@ -1,6 +1,5 @@ require('../../../support/test_helper.js'); -var _ = require('underscore'); var assert = require('assert'); var cartodbServer = require('../../../../lib/cartodb/server'); var serverOptions = require('../../../../lib/cartodb/server_options'); From 51fade6bd314ba856c8813f069772abbec9878d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 19:11:19 +0200 Subject: [PATCH 17/54] Ensure each controller only receives one router --- lib/cartodb/controllers/index.js | 2 - .../admin.js} | 20 +-- .../middlewares/named-map-provider.js | 32 +++++ .../{named_maps.js => template/preview.js} | 116 +++--------------- lib/cartodb/controllers/template/tile.js | 91 ++++++++++++++ lib/cartodb/server.js | 25 +++- 6 files changed, 168 insertions(+), 118 deletions(-) rename lib/cartodb/controllers/{named_maps_admin.js => template/admin.js} (92%) create mode 100644 lib/cartodb/controllers/template/middlewares/named-map-provider.js rename lib/cartodb/controllers/{named_maps.js => template/preview.js} (72%) create mode 100644 lib/cartodb/controllers/template/tile.js diff --git a/lib/cartodb/controllers/index.js b/lib/cartodb/controllers/index.js index 429a4b87..bb73af0f 100644 --- a/lib/cartodb/controllers/index.js +++ b/lib/cartodb/controllers/index.js @@ -2,7 +2,5 @@ module.exports = { Analyses: require('./analyses'), Layergroup: require('./layergroup'), Map: require('./map'), - NamedMaps: require('./named_maps'), - NamedMapsAdmin: require('./named_maps_admin'), ServerInfo: require('./server_info') }; diff --git a/lib/cartodb/controllers/named_maps_admin.js b/lib/cartodb/controllers/template/admin.js similarity index 92% rename from lib/cartodb/controllers/named_maps_admin.js rename to lib/cartodb/controllers/template/admin.js index 95ac0d51..f5f2fec7 100644 --- a/lib/cartodb/controllers/named_maps_admin.js +++ b/lib/cartodb/controllers/template/admin.js @@ -1,9 +1,9 @@ -const { templateName } = require('../backends/template_maps'); -const cors = require('../middleware/cors'); -const credentials = require('../middleware/credentials'); -const rateLimit = require('../middleware/rate-limit'); +const { templateName } = require('../../backends/template_maps'); +const cors = require('../../middleware/cors'); +const credentials = require('../../middleware/credentials'); +const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; -const sendResponse = require('../middleware/send-response'); +const sendResponse = require('../../middleware/send-response'); /** * @param {AuthApi} authApi @@ -11,21 +11,21 @@ const sendResponse = require('../middleware/send-response'); * @param {TemplateMaps} templateMaps * @constructor */ -function NamedMapsAdminController(authApi, templateMaps, userLimitsApi) { +function AdminTemplateController(authApi, templateMaps, userLimitsApi) { this.authApi = authApi; this.templateMaps = templateMaps; this.userLimitsApi = userLimitsApi; } -module.exports = NamedMapsAdminController; +module.exports = AdminTemplateController; -NamedMapsAdminController.prototype.register = function (templateRouter) { +AdminTemplateController.prototype.register = function (templateRouter) { templateRouter.post( `/`, credentials(), - checkContentType({ action: 'POST', label: 'POST TEMPLATE' }), authorizedByAPIKey({ authApi: this.authApi, action: 'create', label: 'POST TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_CREATE), + checkContentType({ action: 'POST', label: 'POST TEMPLATE' }), createTemplate({ templateMaps: this.templateMaps }), sendResponse() ); @@ -33,9 +33,9 @@ NamedMapsAdminController.prototype.register = function (templateRouter) { templateRouter.put( `/:template_id`, credentials(), - checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }), authorizedByAPIKey({ authApi: this.authApi, action: 'update', label: 'PUT TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_UPDATE), + checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }), updateTemplate({ templateMaps: this.templateMaps }), sendResponse() ); diff --git a/lib/cartodb/controllers/template/middlewares/named-map-provider.js b/lib/cartodb/controllers/template/middlewares/named-map-provider.js new file mode 100644 index 00000000..08f0cad5 --- /dev/null +++ b/lib/cartodb/controllers/template/middlewares/named-map-provider.js @@ -0,0 +1,32 @@ +module.exports = function getNamedMapProvider ({ namedMapProviderCache, label, forcedFormat = null }) { + return function getNamedMapProviderMiddleware (req, res, next) { + const { user, token, cache_buster, api_key } = res.locals; + const { dbuser, dbname, dbpassword, dbhost, dbport } = res.locals; + const { template_id, layer: layerFromParams, z, x, y, format } = req.params; + const { layer: layerFromQuery } = req.query; + + const params = { + user, token, cache_buster, api_key, + dbuser, dbname, dbpassword, dbhost, dbport, + template_id, layer: (layerFromQuery || layerFromParams), z, x, y, format + }; + + if (forcedFormat) { + params.format = forcedFormat; + params.layer = params.layer || 'all'; + } + + const { config, auth_token } = req.query; + + namedMapProviderCache.get(user, template_id, config, auth_token, params, (err, namedMapProvider) => { + if (err) { + err.label = label; + return next(err); + } + + res.locals.mapConfigProvider = namedMapProvider; + + next(); + }); + }; +}; diff --git a/lib/cartodb/controllers/named_maps.js b/lib/cartodb/controllers/template/preview.js similarity index 72% rename from lib/cartodb/controllers/named_maps.js rename to lib/cartodb/controllers/template/preview.js index c5347190..d1abc587 100644 --- a/lib/cartodb/controllers/named_maps.js +++ b/lib/cartodb/controllers/template/preview.js @@ -1,14 +1,14 @@ -const cleanUpQueryParams = require('../middleware/clean-up-query-params'); -const credentials = require('../middleware/credentials'); -const dbConnSetup = require('../middleware/db-conn-setup'); -const authorize = require('../middleware/authorize'); -const cacheControlHeader = require('../middleware/cache-control-header'); -const cacheChannelHeader = require('../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../middleware/last-modified-header'); -const sendResponse = require('../middleware/send-response'); -const vectorError = require('../middleware/vector-error'); -const rateLimit = require('../middleware/rate-limit'); +const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); +const credentials = require('../../middleware/credentials'); +const dbConnSetup = require('../../middleware/db-conn-setup'); +const authorize = require('../../middleware/authorize'); +const namedMapProvider = require('./middlewares/named-map-provider'); +const cacheControlHeader = require('../../middleware/cache-control-header'); +const cacheChannelHeader = require('../../middleware/cache-channel-header'); +const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); +const lastModifiedHeader = require('../../middleware/last-modified-header'); +const sendResponse = require('../../middleware/send-response'); +const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const DEFAULT_ZOOM_CENTER = { @@ -23,9 +23,8 @@ function numMapper(n) { return +n; } -function NamedMapsController ( +function PreviewTemplateController ( namedMapProviderCache, - tileBackend, previewBackend, surrogateKeysCache, tablesExtentApi, @@ -35,7 +34,6 @@ function NamedMapsController ( userLimitsApi ) { this.namedMapProviderCache = namedMapProviderCache; - this.tileBackend = tileBackend; this.previewBackend = previewBackend; this.surrogateKeysCache = surrogateKeysCache; this.tablesExtentApi = tablesExtentApi; @@ -45,34 +43,9 @@ function NamedMapsController ( this.userLimitsApi = userLimitsApi; } -module.exports = NamedMapsController; - -NamedMapsController.prototype.register = function(mapRouter, templateRouter) { - - templateRouter.get( - `/:template_id/:layer/:z/:x/:y.(:format)`, - credentials(), - authorize(this.authApi), - dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_TILES), - cleanUpQueryParams(), - getNamedMapProvider({ - namedMapProviderCache: this.namedMapProviderCache, - label: 'NAMED_MAP_TILE' - }), - getTile({ - tileBackend: this.tileBackend, - label: 'NAMED_MAP_TILE' - }), - setContentTypeHeader(), - cacheControlHeader(), - cacheChannelHeader(), - surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - sendResponse(), - vectorError() - ); +module.exports = PreviewTemplateController; +PreviewTemplateController.prototype.register = function (mapRouter) { mapRouter.get( `/static/named/:template_id/:width/:height.:format`, credentials(), @@ -80,7 +53,7 @@ NamedMapsController.prototype.register = function(mapRouter, templateRouter) { dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC_NAMED), cleanUpQueryParams(['layer', 'zoom', 'lon', 'lat', 'bbox']), - getNamedMapProvider({ + namedMapProvider({ namedMapProviderCache: this.namedMapProviderCache, label: 'STATIC_VIZ_MAP', forcedFormat: 'png' }), @@ -101,39 +74,6 @@ NamedMapsController.prototype.register = function(mapRouter, templateRouter) { ); }; -function getNamedMapProvider ({ namedMapProviderCache, label, forcedFormat = null }) { - return function getNamedMapProviderMiddleware (req, res, next) { - const { user, token, cache_buster, api_key } = res.locals; - const { dbuser, dbname, dbpassword, dbhost, dbport } = res.locals; - const { template_id, layer: layerFromParams, z, x, y, format } = req.params; - const { layer: layerFromQuery } = req.query; - - const params = { - user, token, cache_buster, api_key, - dbuser, dbname, dbpassword, dbhost, dbport, - template_id, layer: (layerFromQuery || layerFromParams), z, x, y, format - }; - - if (forcedFormat) { - params.format = forcedFormat; - params.layer = params.layer || 'all'; - } - - const { config, auth_token } = req.query; - - namedMapProviderCache.get(user, template_id, config, auth_token, params, (err, namedMapProvider) => { - if (err) { - err.label = label; - return next(err); - } - - res.locals.mapConfigProvider = namedMapProvider; - - next(); - }); - }; -} - function getTemplate ({ label }) { return function getTemplateMiddleware (req, res, next) { const { mapConfigProvider } = res.locals; @@ -200,32 +140,6 @@ function prepareLayerFilterFromPreviewLayers ({ namedMapProviderCache, label }) }; } -function getTile ({ tileBackend, label }) { - return function getTileMiddleware (req, res, next) { - const { mapConfigProvider } = res.locals; - const { layer, z, x, y, format } = req.params; - const params = { layer, z, x, y, format }; - - tileBackend.getTile(mapConfigProvider, params, (err, tile, headers, stats) => { - req.profiler.add(stats); - req.profiler.done('render-' + format); - - if (err) { - err.label = label; - return next(err); - } - - if (headers) { - res.set(headers); - } - - res.body = tile; - - next(); - }); - }; -} - function getStaticImageOptions ({ tablesExtentApi }) { return function getStaticImageOptionsMiddleware(req, res, next) { const { user, mapConfigProvider, template } = res.locals; diff --git a/lib/cartodb/controllers/template/tile.js b/lib/cartodb/controllers/template/tile.js new file mode 100644 index 00000000..29b7f852 --- /dev/null +++ b/lib/cartodb/controllers/template/tile.js @@ -0,0 +1,91 @@ +const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); +const credentials = require('../../middleware/credentials'); +const dbConnSetup = require('../../middleware/db-conn-setup'); +const authorize = require('../../middleware/authorize'); +const namedMapProvider = require('./middlewares/named-map-provider'); +const cacheControlHeader = require('../../middleware/cache-control-header'); +const cacheChannelHeader = require('../../middleware/cache-channel-header'); +const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); +const lastModifiedHeader = require('../../middleware/last-modified-header'); +const sendResponse = require('../../middleware/send-response'); +const vectorError = require('../../middleware/vector-error'); +const rateLimit = require('../../middleware/rate-limit'); +const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; + +function TileTemplateController ( + namedMapProviderCache, + tileBackend, + surrogateKeysCache, + pgConnection, + authApi, + userLimitsApi +) { + this.namedMapProviderCache = namedMapProviderCache; + this.tileBackend = tileBackend; + this.surrogateKeysCache = surrogateKeysCache; + this.pgConnection = pgConnection; + this.authApi = authApi; + this.userLimitsApi = userLimitsApi; +} + +module.exports = TileTemplateController; + +TileTemplateController.prototype.register = function (templateRouter) { + templateRouter.get( + `/:template_id/:layer/:z/:x/:y.(:format)`, + credentials(), + authorize(this.authApi), + dbConnSetup(this.pgConnection), + rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_TILES), + cleanUpQueryParams(), + namedMapProvider({ + namedMapProviderCache: this.namedMapProviderCache, + label: 'NAMED_MAP_TILE' + }), + getTile({ + tileBackend: this.tileBackend, + label: 'NAMED_MAP_TILE' + }), + setContentTypeHeader(), + cacheControlHeader(), + cacheChannelHeader(), + surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), + lastModifiedHeader(), + sendResponse(), + vectorError() + ); +}; + +function getTile ({ tileBackend, label }) { + return function getTileMiddleware (req, res, next) { + const { mapConfigProvider } = res.locals; + const { layer, z, x, y, format } = req.params; + const params = { layer, z, x, y, format }; + + tileBackend.getTile(mapConfigProvider, params, (err, tile, headers, stats) => { + req.profiler.add(stats); + req.profiler.done('render-' + format); + + if (err) { + err.label = label; + return next(err); + } + + if (headers) { + res.set(headers); + } + + res.body = tile; + + next(); + }); + }; +} + +function setContentTypeHeader () { + return function setContentTypeHeaderMiddleware(req, res, next) { + res.set('Content-Type', res.get('content-type') || res.get('Content-Type') || 'image/png'); + + next(); + }; +} diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index f9161b21..0641629c 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -7,6 +7,9 @@ var cartodbRedis = require('cartodb-redis'); var _ = require('underscore'); var controller = require('./controllers'); +const AdminTemplateController = require('./controllers/template/admin'); +const PreviewTemplateController = require('./controllers/template/preview'); +const TileTemplateController = require('./controllers/template/tile'); var SurrogateKeysCache = require('./cache/surrogate_keys_cache'); var NamedMapsCacheEntry = require('./cache/model/named_maps_entry'); @@ -224,8 +227,6 @@ module.exports = function(serverOptions) { const templateRouter = express.Router(); const monitorRouter = express.Router(); - const { base_url_mapconfig: mapConfigBasePath, base_url_templated: templateBasePath } = serverOptions; - new controller.Layergroup( pgConnection, mapStore, @@ -252,9 +253,17 @@ module.exports = function(serverOptions) { authApi ).register(mapRouter, templateRouter); - new controller.NamedMaps( + new TileTemplateController( namedMapProviderCache, tileBackend, + surrogateKeysCache, + pgConnection, + authApi, + userLimitsApi + ).register(templateRouter); + + new PreviewTemplateController( + namedMapProviderCache, previewBackend, surrogateKeysCache, tablesExtentApi, @@ -262,14 +271,20 @@ module.exports = function(serverOptions) { pgConnection, authApi, userLimitsApi - ).register(mapRouter, templateRouter); + ).register(mapRouter); - new controller.NamedMapsAdmin(authApi, templateMaps, userLimitsApi).register(templateRouter); + new AdminTemplateController( + authApi, + templateMaps, + userLimitsApi + ).register(templateRouter); new controller.Analyses(pgConnection, authApi, userLimitsApi).register(mapRouter); new controller.ServerInfo(versions).register(monitorRouter); + const { base_url_mapconfig: mapConfigBasePath, base_url_templated: templateBasePath } = serverOptions; + app.use(mapConfigBasePath, mapRouter); app.use(templateBasePath, templateRouter); app.use('/', monitorRouter); From 57e10a8d2b13a87deb94927a5360a3dc4fc9fe9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 19:37:31 +0200 Subject: [PATCH 18/54] Create layergroup controllers in server construction --- lib/cartodb/controllers/index.js | 1 - .../controllers/layergroup/analysis.js | 2 +- .../controllers/layergroup/attributes.js | 2 +- .../controllers/layergroup/dataview.js | 2 +- lib/cartodb/controllers/layergroup/index.js | 112 ------------------ .../layergroup/{static.js => preview.js} | 2 +- lib/cartodb/controllers/layergroup/tile.js | 2 +- lib/cartodb/server.js | 62 ++++++++-- 8 files changed, 60 insertions(+), 125 deletions(-) delete mode 100644 lib/cartodb/controllers/layergroup/index.js rename lib/cartodb/controllers/layergroup/{static.js => preview.js} (99%) diff --git a/lib/cartodb/controllers/index.js b/lib/cartodb/controllers/index.js index bb73af0f..11bf6a2f 100644 --- a/lib/cartodb/controllers/index.js +++ b/lib/cartodb/controllers/index.js @@ -1,6 +1,5 @@ module.exports = { Analyses: require('./analyses'), - Layergroup: require('./layergroup'), Map: require('./map'), ServerInfo: require('./server_info') }; diff --git a/lib/cartodb/controllers/layergroup/analysis.js b/lib/cartodb/controllers/layergroup/analysis.js index 9d58a53f..30371950 100644 --- a/lib/cartodb/controllers/layergroup/analysis.js +++ b/lib/cartodb/controllers/layergroup/analysis.js @@ -8,7 +8,7 @@ const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const sendResponse = require('../../middleware/send-response'); const dbParamsFromResLocals = require('../../utils/database-params'); -module.exports = class AnalysisController { +module.exports = class AnalysisLayergroupController { constructor ( analysisStatusBackend, pgConnection, diff --git a/lib/cartodb/controllers/layergroup/attributes.js b/lib/cartodb/controllers/layergroup/attributes.js index 4965fe44..9e1aa24f 100644 --- a/lib/cartodb/controllers/layergroup/attributes.js +++ b/lib/cartodb/controllers/layergroup/attributes.js @@ -12,7 +12,7 @@ const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); const sendResponse = require('../../middleware/send-response'); -module.exports = class AttributesController { +module.exports = class AttributesLayergroupController { constructor ( attributesBackend, pgConnection, diff --git a/lib/cartodb/controllers/layergroup/dataview.js b/lib/cartodb/controllers/layergroup/dataview.js index b768ee89..04390d23 100644 --- a/lib/cartodb/controllers/layergroup/dataview.js +++ b/lib/cartodb/controllers/layergroup/dataview.js @@ -27,7 +27,7 @@ const ALLOWED_DATAVIEW_QUERY_PARAMS = [ 'categories', // number ]; -module.exports = class DataviewController { +module.exports = class DataviewLayergroupController { constructor ( dataviewBackend, pgConnection, diff --git a/lib/cartodb/controllers/layergroup/index.js b/lib/cartodb/controllers/layergroup/index.js deleted file mode 100644 index fbbe1fd8..00000000 --- a/lib/cartodb/controllers/layergroup/index.js +++ /dev/null @@ -1,112 +0,0 @@ -const DataviewBackend = require('../../backends/dataview'); -const AnalysisStatusBackend = require('../../backends/analysis-status'); - -const TileController = require('./tile'); -const AttributesController = require('./attributes'); -const StaticController = require('./static'); -const DataviewController = require('./dataview'); -const AnalysisController = require('./analysis'); - -/** - * @param {prepareContext} prepareContext - * @param {PgConnection} pgConnection - * @param {MapStore} mapStore - * @param {TileBackend} tileBackend - * @param {PreviewBackend} previewBackend - * @param {AttributesBackend} attributesBackend - * @param {SurrogateKeysCache} surrogateKeysCache - * @param {UserLimitsApi} userLimitsApi - * @param {LayergroupAffectedTables} layergroupAffectedTables - * @param {AnalysisBackend} analysisBackend - * @constructor - */ -function LayergroupController( - pgConnection, - mapStore, - tileBackend, - previewBackend, - attributesBackend, - surrogateKeysCache, - userLimitsApi, - layergroupAffectedTablesCache, - analysisBackend, - authApi -) { - this.pgConnection = pgConnection; - this.mapStore = mapStore; - this.tileBackend = tileBackend; - this.previewBackend = previewBackend; - this.attributesBackend = attributesBackend; - this.surrogateKeysCache = surrogateKeysCache; - this.userLimitsApi = userLimitsApi; - this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - - this.dataviewBackend = new DataviewBackend(analysisBackend); - this.analysisStatusBackend = new AnalysisStatusBackend(); - this.authApi = authApi; -} - -module.exports = LayergroupController; - -LayergroupController.prototype.register = function(app) { - - const tileController = new TileController( - this.tileBackend, - this.pgConnection, - this.mapStore, - this.userLimitsApi, - this.layergroupAffectedTablesCache, - this.authApi, - this.surrogateKeysCache - ); - - tileController.register(app); - - const attributesController = new AttributesController( - this.attributesBackend, - this.pgConnection, - this.mapStore, - this.userLimitsApi, - this.layergroupAffectedTablesCache, - this.authApi, - this.surrogateKeysCache - ); - - attributesController.register(app); - - const staticController = new StaticController( - this.previewBackend, - this.pgConnection, - this.mapStore, - this.userLimitsApi, - this.layergroupAffectedTablesCache, - this.authApi, - this.surrogateKeysCache - ); - - staticController.register(app); - - const dataviewController = new DataviewController( - this.dataviewBackend, - this.pgConnection, - this.mapStore, - this.userLimitsApi, - this.layergroupAffectedTablesCache, - this.authApi, - this.surrogateKeysCache - ); - - dataviewController.register(app); - - const analysisController = new AnalysisController( - this.analysisStatusBackend, - this.pgConnection, - this.mapStore, - this.userLimitsApi, - this.layergroupAffectedTablesCache, - this.authApi, - this.surrogateKeysCache - ); - - analysisController.register(app); -}; diff --git a/lib/cartodb/controllers/layergroup/static.js b/lib/cartodb/controllers/layergroup/preview.js similarity index 99% rename from lib/cartodb/controllers/layergroup/static.js rename to lib/cartodb/controllers/layergroup/preview.js index 70957b53..1918fd72 100644 --- a/lib/cartodb/controllers/layergroup/static.js +++ b/lib/cartodb/controllers/layergroup/preview.js @@ -12,7 +12,7 @@ const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); const sendResponse = require('../../middleware/send-response'); -module.exports = class StaticController { +module.exports = class PreviewLayergroupController { constructor ( previewBackend, pgConnection, diff --git a/lib/cartodb/controllers/layergroup/tile.js b/lib/cartodb/controllers/layergroup/tile.js index 091a8f35..39c0e5f7 100644 --- a/lib/cartodb/controllers/layergroup/tile.js +++ b/lib/cartodb/controllers/layergroup/tile.js @@ -22,7 +22,7 @@ const SUPPORTED_FORMATS = { mvt: true }; -module.exports = class TileController { +module.exports = class TileLayergroupController { constructor ( tileBackend, pgConnection, diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 0641629c..bb5564b8 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -7,6 +7,12 @@ var cartodbRedis = require('cartodb-redis'); var _ = require('underscore'); var controller = require('./controllers'); +const AnalysisLayergroupController = require('./controllers/layergroup/analysis'); +const AttributesLayergroupController = require('./controllers/layergroup/attributes'); +const DataviewLayergroupController = require('./controllers/layergroup/dataview'); +const PreviewLayergroupController = require('./controllers/layergroup/preview'); +const TileLayergroupController = require('./controllers/layergroup/tile'); + const AdminTemplateController = require('./controllers/template/admin'); const PreviewTemplateController = require('./controllers/template/preview'); const TileTemplateController = require('./controllers/template/tile'); @@ -35,6 +41,8 @@ var PgQueryRunner = require('./backends/pg_query_runner'); var PgConnection = require('./backends/pg_connection'); var AnalysisBackend = require('./backends/analysis'); +const AnalysisStatusBackend = require('./backends/analysis-status'); +const DataviewBackend = require('./backends/dataview'); var timeoutErrorTilePath = __dirname + '/../../assets/render-timeout-fallback.png'; var timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encoding: null}); @@ -182,6 +190,9 @@ module.exports = function(serverOptions) { var mapBackend = new windshaft.backend.Map(rendererCache, mapStore, mapValidatorBackend); var analysisBackend = new AnalysisBackend(metadataBackend, serverOptions.analysis); + const analysisStatusBackend = new AnalysisStatusBackend(); + + const dataviewBackend = new DataviewBackend(analysisBackend); var statsBackend = new StatsBackend(); @@ -227,17 +238,54 @@ module.exports = function(serverOptions) { const templateRouter = express.Router(); const monitorRouter = express.Router(); - new controller.Layergroup( + new AnalysisLayergroupController( + analysisStatusBackend, pgConnection, mapStore, - tileBackend, - previewBackend, - attributesBackend, - surrogateKeysCache, userLimitsApi, layergroupAffectedTablesCache, - analysisBackend, - authApi + authApi, + surrogateKeysCache + ).register(mapRouter); + + new AttributesLayergroupController( + attributesBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ).register(mapRouter); + + new DataviewLayergroupController( + dataviewBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ).register(mapRouter); + + new PreviewLayergroupController( + previewBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ).register(mapRouter); + + new TileLayergroupController( + tileBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache ).register(mapRouter); new controller.Map( From 5bb5bc42eea49bba2a2fc333d51af38d6c87e030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 19:58:30 +0200 Subject: [PATCH 19/54] Create Map Controller while building server --- lib/cartodb/controllers/index.js | 1 - lib/cartodb/controllers/map/anonymous.js | 12 ++--- lib/cartodb/controllers/map/index.js | 60 ------------------------ lib/cartodb/controllers/map/named.js | 10 ++-- lib/cartodb/server.js | 31 ++++++++++-- 5 files changed, 35 insertions(+), 79 deletions(-) delete mode 100644 lib/cartodb/controllers/map/index.js diff --git a/lib/cartodb/controllers/index.js b/lib/cartodb/controllers/index.js index 11bf6a2f..b3623cb5 100644 --- a/lib/cartodb/controllers/index.js +++ b/lib/cartodb/controllers/index.js @@ -1,5 +1,4 @@ module.exports = { Analyses: require('./analyses'), - Map: require('./map'), ServerInfo: require('./server_info') }; diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index e64b57ea..87f9bb84 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -1,7 +1,6 @@ const windshaft = require('windshaft'); const MapConfig = windshaft.model.MapConfig; const Datasource = windshaft.model.Datasource; -const ResourceLocator = require('../../models/resource-locator'); const cors = require('../../middleware/cors'); const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); @@ -22,7 +21,6 @@ const layergroupMetadata = require('./middlewares/layergroup-metadata'); const mapError = require('./middlewares/map-error'); const sendResponse = require('../../middleware/send-response'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); -const LayergroupMetadata = require('../../utils/layergroup-metadata'); const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; @@ -49,7 +47,8 @@ function AnonymousMapController ( layergroupAffectedTables, mapConfigAdapter, statsBackend, - authApi + authApi, + layergroupMetadata ) { this.pgConnection = pgConnection; this.templateMaps = templateMaps; @@ -58,13 +57,10 @@ function AnonymousMapController ( this.surrogateKeysCache = surrogateKeysCache; this.userLimitsApi = userLimitsApi; this.layergroupAffectedTables = layergroupAffectedTables; - this.mapConfigAdapter = mapConfigAdapter; - const resourceLocator = new ResourceLocator(global.environment); - this.layergroupMetadata = new LayergroupMetadata(resourceLocator); - this.statsBackend = statsBackend; this.authApi = authApi; + this.layergroupMetadata = layergroupMetadata; } module.exports = AnonymousMapController; @@ -106,7 +102,7 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { lastModifiedHeader({ now: true }), lastUpdatedTimeLayergroup(), layerStats(this.pgConnection, this.statsBackend), - layergroupIdHeader(this.templateMaps ,useTemplateHash), + layergroupIdHeader(this.templateMaps, useTemplateHash), layergroupMetadata(this.layergroupMetadata, includeQuery), sendResponse(), mapError({ label, addContext }) diff --git a/lib/cartodb/controllers/map/index.js b/lib/cartodb/controllers/map/index.js deleted file mode 100644 index 70d45fe9..00000000 --- a/lib/cartodb/controllers/map/index.js +++ /dev/null @@ -1,60 +0,0 @@ -const AnonymousMapController = require('./anonymous'); -const NamedMapController = require('./named'); - -module.exports = class MapController { - constructor ( - pgConnection, - templateMaps, - mapBackend, - metadataBackend, - surrogateKeysCache, - userLimitsApi, - layergroupAffectedTablesCache, - mapConfigAdapter, - statsBackend, - authApi - ) { - this.pgConnection = pgConnection; - this.templateMaps = templateMaps; - this.mapBackend = mapBackend; - this.metadataBackend = metadataBackend; - this.surrogateKeysCache = surrogateKeysCache; - this.userLimitsApi = userLimitsApi; - this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - this.mapConfigAdapter = mapConfigAdapter; - this.statsBackend = statsBackend; - this.authApi = authApi; - } - - register (mapRouter, templateRouter) { - const anonymousMapController = new AnonymousMapController( - this.pgConnection, - this.templateMaps, - this.mapBackend, - this.metadataBackend, - this.surrogateKeysCache, - this.userLimitsApi, - this.layergroupAffectedTablesCache, - this.mapConfigAdapter, - this.statsBackend, - this.authApi - ); - - anonymousMapController.register(mapRouter); - - const namedMapController = new NamedMapController( - this.pgConnection, - this.templateMaps, - this.mapBackend, - this.metadataBackend, - this.surrogateKeysCache, - this.userLimitsApi, - this.layergroupAffectedTablesCache, - this.mapConfigAdapter, - this.statsBackend, - this.authApi - ); - - namedMapController.register(templateRouter); - } -}; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index b29cb06f..e59f2d03 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -1,4 +1,3 @@ -const ResourceLocator = require('../../models/resource-locator'); const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); const dbConnSetup = require('../../middleware/db-conn-setup'); @@ -19,7 +18,6 @@ const mapError = require('./middlewares/map-error'); const sendResponse = require('../../middleware/send-response'); const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); -const LayergroupMetadata = require('../../utils/layergroup-metadata'); const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; @@ -46,7 +44,8 @@ function NamedMapController ( layergroupAffectedTables, mapConfigAdapter, statsBackend, - authApi + authApi, + layergroupMetadata ) { this.pgConnection = pgConnection; this.templateMaps = templateMaps; @@ -55,13 +54,10 @@ function NamedMapController ( this.surrogateKeysCache = surrogateKeysCache; this.userLimitsApi = userLimitsApi; this.layergroupAffectedTables = layergroupAffectedTables; - this.mapConfigAdapter = mapConfigAdapter; - const resourceLocator = new ResourceLocator(global.environment); - this.layergroupMetadata = new LayergroupMetadata(resourceLocator); - this.statsBackend = statsBackend; this.authApi = authApi; + this.layergroupMetadata = layergroupMetadata; } module.exports = NamedMapController; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index bb5564b8..4ef54339 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -7,12 +7,16 @@ var cartodbRedis = require('cartodb-redis'); var _ = require('underscore'); var controller = require('./controllers'); + const AnalysisLayergroupController = require('./controllers/layergroup/analysis'); const AttributesLayergroupController = require('./controllers/layergroup/attributes'); const DataviewLayergroupController = require('./controllers/layergroup/dataview'); const PreviewLayergroupController = require('./controllers/layergroup/preview'); const TileLayergroupController = require('./controllers/layergroup/tile'); +const AnonymousMapController = require('./controllers/map/anonymous'); +const NamedMapController = require('./controllers/map/named'); + const AdminTemplateController = require('./controllers/template/admin'); const PreviewTemplateController = require('./controllers/template/preview'); const TileTemplateController = require('./controllers/template/tile'); @@ -59,6 +63,9 @@ var MapConfigAdapter = require('./models/mapconfig/adapter'); var StatsBackend = require('./backends/stats'); +const ResourceLocator = require('./models/resource-locator'); +const LayergroupMetadata = require('./utils/layergroup-metadata'); + const lzmaMiddleware = require('./middleware/lzma'); const errorMiddleware = require('./middleware/error-middleware'); const servedByHostHeader = require('./middleware/served-by-host-header'); @@ -228,6 +235,9 @@ module.exports = function(serverOptions) { var TablesExtentApi = require('./api/tables_extent_api'); var tablesExtentApi = new TablesExtentApi(pgQueryRunner); + const resourceLocator = new ResourceLocator(global.environment); + const layergroupMetadata = new LayergroupMetadata(resourceLocator); + var versions = getAndValidateVersions(serverOptions); /******************************************************************************************************************* @@ -288,7 +298,7 @@ module.exports = function(serverOptions) { surrogateKeysCache ).register(mapRouter); - new controller.Map( + new AnonymousMapController( pgConnection, templateMaps, mapBackend, @@ -298,8 +308,23 @@ module.exports = function(serverOptions) { layergroupAffectedTablesCache, mapConfigAdapter, statsBackend, - authApi - ).register(mapRouter, templateRouter); + authApi, + layergroupMetadata + ).register(mapRouter); + + new NamedMapController( + pgConnection, + templateMaps, + mapBackend, + metadataBackend, + surrogateKeysCache, + userLimitsApi, + layergroupAffectedTablesCache, + mapConfigAdapter, + statsBackend, + authApi, + layergroupMetadata + ).register(templateRouter); new TileTemplateController( namedMapProviderCache, From 6bf06116df33e09adf9dc640afe48a58f36ffe16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 28 Mar 2018 20:12:11 +0200 Subject: [PATCH 20/54] Build controllers (analysis and server info) in server --- lib/cartodb/controllers/index.js | 4 ---- .../controllers/{server_info.js => server-info.js} | 0 lib/cartodb/server.js | 14 ++++++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) delete mode 100644 lib/cartodb/controllers/index.js rename lib/cartodb/controllers/{server_info.js => server-info.js} (100%) diff --git a/lib/cartodb/controllers/index.js b/lib/cartodb/controllers/index.js deleted file mode 100644 index b3623cb5..00000000 --- a/lib/cartodb/controllers/index.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - Analyses: require('./analyses'), - ServerInfo: require('./server_info') -}; diff --git a/lib/cartodb/controllers/server_info.js b/lib/cartodb/controllers/server-info.js similarity index 100% rename from lib/cartodb/controllers/server_info.js rename to lib/cartodb/controllers/server-info.js diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 4ef54339..d5410369 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -6,8 +6,6 @@ var RedisPool = require('redis-mpool'); var cartodbRedis = require('cartodb-redis'); var _ = require('underscore'); -var controller = require('./controllers'); - const AnalysisLayergroupController = require('./controllers/layergroup/analysis'); const AttributesLayergroupController = require('./controllers/layergroup/attributes'); const DataviewLayergroupController = require('./controllers/layergroup/dataview'); @@ -21,6 +19,10 @@ const AdminTemplateController = require('./controllers/template/admin'); const PreviewTemplateController = require('./controllers/template/preview'); const TileTemplateController = require('./controllers/template/tile'); +const AnalysesController = require('./controllers/analyses'); + +const ServerInfoController = require('./controllers/server-info'); + var SurrogateKeysCache = require('./cache/surrogate_keys_cache'); var NamedMapsCacheEntry = require('./cache/model/named_maps_entry'); var VarnishHttpCacheBackend = require('./cache/backend/varnish_http'); @@ -352,9 +354,13 @@ module.exports = function(serverOptions) { userLimitsApi ).register(templateRouter); - new controller.Analyses(pgConnection, authApi, userLimitsApi).register(mapRouter); + new AnalysesController( + pgConnection, + authApi, + userLimitsApi + ).register(mapRouter); - new controller.ServerInfo(versions).register(monitorRouter); + new ServerInfoController(versions).register(monitorRouter); const { base_url_mapconfig: mapConfigBasePath, base_url_templated: templateBasePath } = serverOptions; From b6989ac82a874120375c011a42ad742770f11f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 2 Apr 2018 19:02:31 +0200 Subject: [PATCH 21/54] Create a controllers factory where all collaborators are created and controllers are mounted afterwards --- lib/cartodb/controllers/factory.js | 446 +++++++++++++++++ lib/cartodb/middleware/syntax-error.js | 10 + lib/cartodb/server.js | 459 +----------------- test/acceptance/multilayer_server.js | 2 +- .../cartodb/ported/windshaft_server.test.js | 2 +- 5 files changed, 483 insertions(+), 436 deletions(-) create mode 100644 lib/cartodb/controllers/factory.js create mode 100644 lib/cartodb/middleware/syntax-error.js diff --git a/lib/cartodb/controllers/factory.js b/lib/cartodb/controllers/factory.js new file mode 100644 index 00000000..ce341fbd --- /dev/null +++ b/lib/cartodb/controllers/factory.js @@ -0,0 +1,446 @@ +const { Router: router } = require('express'); + +const RedisPool = require('redis-mpool'); +const cartodbRedis = require('cartodb-redis'); + +const windshaft = require('windshaft'); + +const PgConnection = require('../backends/pg_connection'); +const AnalysisBackend = require('../backends/analysis'); +const AnalysisStatusBackend = require('../backends/analysis-status'); +const DataviewBackend = require('../backends/dataview'); +const TemplateMaps = require('../backends/template_maps.js'); +const PgQueryRunner = require('../backends/pg_query_runner'); +const StatsBackend = require('../backends/stats'); + +const AuthApi = require('../api/auth_api'); +const UserLimitsApi = require('../api/user_limits_api'); +const OverviewsMetadataApi = require('../api/overviews_metadata_api'); +const FilterStatsApi = require('../api/filter_stats_api'); +const TablesExtentApi = require('../api/tables_extent_api'); + +const LayergroupAffectedTablesCache = require('../cache/layergroup_affected_tables'); +const SurrogateKeysCache = require('../cache/surrogate_keys_cache'); +const VarnishHttpCacheBackend = require('../cache/backend/varnish_http'); +const FastlyCacheBackend = require('../cache/backend/fastly'); +const NamedMapProviderCache = require('../cache/named_map_provider_cache'); +const NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); + +const SqlWrapMapConfigAdapter = require('../models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); +const MapConfigNamedLayersAdapter = require('../models/mapconfig/adapter/mapconfig-named-layers-adapter'); +const MapConfigBufferSizeAdapter = require('../models/mapconfig/adapter/mapconfig-buffer-size-adapter'); +const AnalysisMapConfigAdapter = require('../models/mapconfig/adapter/analysis-mapconfig-adapter'); +const MapConfigOverviewsAdapter = require('../models/mapconfig/adapter/mapconfig-overviews-adapter'); +const TurboCartoAdapter = require('../models/mapconfig/adapter/turbo-carto-adapter'); +const DataviewsWidgetsAdapter = require('../models/mapconfig/adapter/dataviews-widgets-adapter'); +const AggregationMapConfigAdapter = require('../models/mapconfig/adapter/aggregation-mapconfig-adapter'); +const MapConfigAdapter = require('../models/mapconfig/adapter'); + +const ResourceLocator = require('../models/resource-locator'); +const LayergroupMetadata = require('../utils/layergroup-metadata'); +const RendererStatsReporter = require('../stats/reporter/renderer'); + +const AnalysisLayergroupController = require('./layergroup/analysis'); +const AttributesLayergroupController = require('./layergroup/attributes'); +const DataviewLayergroupController = require('./layergroup/dataview'); +const PreviewLayergroupController = require('./layergroup/preview'); +const TileLayergroupController = require('./layergroup/tile'); + +const AnonymousMapController = require('./map/anonymous'); +const NamedMapController = require('./map/named'); + +const AdminTemplateController = require('./template/admin'); +const PreviewTemplateController = require('./template/preview'); +const TileTemplateController = require('./template/tile'); + +const AnalysesController = require('./analyses'); + +const ServerInfoController = require('./server-info'); + +module.exports = class ControllersFactory { + constructor ({ serverOptions, environmentOptions }) { + const redisOptions = Object.assign({}, environmentOptions.redis, { + name: 'windshaft-server', + unwatchOnRelease: false, + noReadyCheck: true + }); + + const redisPool = new RedisPool(redisOptions); + + redisPool.on('status', function(status) { + var keyPrefix = 'windshaft.redis-pool.' + status.name + '.db' + status.db + '.'; + global.statsClient.gauge(keyPrefix + 'count', status.count); + global.statsClient.gauge(keyPrefix + 'unused', status.unused); + global.statsClient.gauge(keyPrefix + 'waiting', status.waiting); + }); + + const metadataBackend = cartodbRedis({ pool: redisPool }); + const pgConnection = new PgConnection(metadataBackend); + + const mapStore = new windshaft.storage.MapStore({ + pool: redisPool, + expire_time: serverOptions.grainstore.default_layergroup_ttl + }); + + const rendererFactory = createRendererFactory({ redisPool, serverOptions, environmentOptions }); + + const rendererCacheOpts = Object.assign({}, serverOptions.renderCache || {}, { + ttl: 60000, // 60 seconds TTL by default + statsInterval: 60000 // reports stats every milliseconds defined here + }); + const rendererCache = new windshaft.cache.RendererCache(rendererFactory, rendererCacheOpts); + const rendererStatsReporter = new RendererStatsReporter(rendererCache, rendererCacheOpts.statsInterval); + rendererStatsReporter.start(); + + const tileBackend = new windshaft.backend.Tile(rendererCache); + const attributesBackend = new windshaft.backend.Attributes(); + const previewBackend = new windshaft.backend.Preview(rendererCache); + const mapValidatorBackend = new windshaft.backend.MapValidator(tileBackend, attributesBackend); + const mapBackend = new windshaft.backend.Map(rendererCache, mapStore, mapValidatorBackend); + + const surrogateKeysCacheBackends = createSurrogateKeysCacheBackends(serverOptions); + const surrogateKeysCache = new SurrogateKeysCache(surrogateKeysCacheBackends); + const templateMaps = createTemplateMaps({ redisPool, surrogateKeysCache }); + + const analysisStatusBackend = new AnalysisStatusBackend(); + const analysisBackend = new AnalysisBackend(metadataBackend, serverOptions.analysis); + const dataviewBackend = new DataviewBackend(analysisBackend); + const statsBackend = new StatsBackend(); + + const userLimitsApi = new UserLimitsApi(metadataBackend, { + limits: { + cacheOnTimeout: serverOptions.renderer.mapnik.limits.cacheOnTimeout || false, + render: serverOptions.renderer.mapnik.limits.render || 0, + rateLimitsEnabled: global.environment.enabledFeatures.rateLimitsEnabled + } + }); + const authApi = new AuthApi(pgConnection, metadataBackend, mapStore, templateMaps); + + const layergroupAffectedTablesCache = new LayergroupAffectedTablesCache(); + + if (process.env.NODE_ENV === 'test') { + this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; + } + + const pgQueryRunner = new PgQueryRunner(pgConnection); + const overviewsMetadataApi = new OverviewsMetadataApi(pgQueryRunner); + + const filterStatsApi = new FilterStatsApi(pgQueryRunner); + const tablesExtentApi = new TablesExtentApi(pgQueryRunner); + + const mapConfigAdapter = new MapConfigAdapter( + new MapConfigNamedLayersAdapter(templateMaps, pgConnection), + new MapConfigBufferSizeAdapter(), + new SqlWrapMapConfigAdapter(), + new DataviewsWidgetsAdapter(), + new AnalysisMapConfigAdapter(analysisBackend), + new AggregationMapConfigAdapter(pgConnection), + new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi), + new TurboCartoAdapter() + ); + + const resourceLocator = new ResourceLocator(global.environment); + const layergroupMetadata = new LayergroupMetadata(resourceLocator); + + const namedMapProviderCache = new NamedMapProviderCache( + templateMaps, + pgConnection, + metadataBackend, + userLimitsApi, + mapConfigAdapter, + layergroupAffectedTablesCache + ); + + ['update', 'delete'].forEach(function(eventType) { + templateMaps.on(eventType, namedMapProviderCache.invalidate.bind(namedMapProviderCache)); + }); + + const versions = getAndValidateVersions(serverOptions); + + this.mapConfigBasePath = serverOptions.base_url_mapconfig; + this.templateBasePath = serverOptions.base_url_templated; + + this.analysisLayergroupController = new AnalysisLayergroupController( + analysisStatusBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.attributesLayergroupController = new AttributesLayergroupController( + attributesBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.dataviewLayergroupController = new DataviewLayergroupController( + dataviewBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.previewLayergroupController = new PreviewLayergroupController( + previewBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.tileLayergroupController = new TileLayergroupController( + tileBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.anonymousMapController = new AnonymousMapController( + pgConnection, + templateMaps, + mapBackend, + metadataBackend, + surrogateKeysCache, + userLimitsApi, + layergroupAffectedTablesCache, + mapConfigAdapter, + statsBackend, + authApi, + layergroupMetadata + ); + + this.namedMapController = new NamedMapController( + pgConnection, + templateMaps, + mapBackend, + metadataBackend, + surrogateKeysCache, + userLimitsApi, + layergroupAffectedTablesCache, + mapConfigAdapter, + statsBackend, + authApi, + layergroupMetadata + ); + + this.tileTemplateController = new TileTemplateController( + namedMapProviderCache, + tileBackend, + surrogateKeysCache, + pgConnection, + authApi, + userLimitsApi + ); + + this.previewTemplateController = new PreviewTemplateController( + namedMapProviderCache, + previewBackend, + surrogateKeysCache, + tablesExtentApi, + metadataBackend, + pgConnection, + authApi, + userLimitsApi + ); + + this.adminTemplateController = new AdminTemplateController( + authApi, + templateMaps, + userLimitsApi + ); + + this.analysesController = new AnalysesController( + pgConnection, + authApi, + userLimitsApi + ); + + this.serverInfoController = new ServerInfoController(versions); + } + + regist (app) { + if (process.env.NODE_ENV === 'test') { + app.layergroupAffectedTablesCache = this.layergroupAffectedTablesCache; + } + + const mapRouter = router(); + + this.analysisLayergroupController.register(mapRouter); + this.attributesLayergroupController.register(mapRouter); + this.dataviewLayergroupController.register(mapRouter); + this.previewLayergroupController.register(mapRouter); + this.tileLayergroupController.register(mapRouter); + this.anonymousMapController.register(mapRouter); + this.previewTemplateController.register(mapRouter); + this.analysesController.register(mapRouter); + + app.use(this.mapConfigBasePath, mapRouter); + + const templateRouter = router(); + + this.namedMapController.register(templateRouter); + this.tileTemplateController.register(templateRouter); + this.adminTemplateController.register(templateRouter); + + app.use(this.templateBasePath, templateRouter); + + const monitorRouter = router(); + + this.serverInfoController.register(monitorRouter); + + app.use('/', monitorRouter); + } +}; + + +function createTemplateMaps ({ redisPool, surrogateKeysCache }) { + const templateMaps = new TemplateMaps(redisPool, { + max_user_templates: global.environment.maxUserTemplates + }); + + function invalidateNamedMap (owner, templateName) { + var startTime = Date.now(); + surrogateKeysCache.invalidate(new NamedMapsCacheEntry(owner, templateName), function(err) { + var logMessage = JSON.stringify({ + username: owner, + type: 'named_map_invalidation', + elapsed: Date.now() - startTime, + error: !!err ? JSON.stringify(err.message) : undefined + }); + if (err) { + global.logger.warn(logMessage); + } else { + global.logger.info(logMessage); + } + }); + } + + + ['update', 'delete'].forEach(function(eventType) { + templateMaps.on(eventType, invalidateNamedMap); + }); + + return templateMaps; +} + +function createSurrogateKeysCacheBackends(serverOptions) { + var cacheBackends = []; + + if (serverOptions.varnish_purge_enabled) { + cacheBackends.push( + new VarnishHttpCacheBackend(serverOptions.varnish_host, serverOptions.varnish_http_port) + ); + } + + if (serverOptions.fastly && + !!serverOptions.fastly.enabled && !!serverOptions.fastly.apiKey && !!serverOptions.fastly.serviceId) { + cacheBackends.push( + new FastlyCacheBackend(serverOptions.fastly.apiKey, serverOptions.fastly.serviceId) + ); + } + + return cacheBackends; +} + +const timeoutErrorTilePath = __dirname + '/../../../assets/render-timeout-fallback.png'; +const timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encoding: null}); + +function createRendererFactory ({ redisPool, serverOptions, environmentOptions }) { + var onTileErrorStrategy; + if (environmentOptions.enabledFeatures.onTileErrorStrategy !== false) { + onTileErrorStrategy = function onTileErrorStrategy$TimeoutTile(err, tile, headers, stats, format, callback) { + + function isRenderTimeoutError (err) { + return err.message === 'Render timed out'; + } + + function isDatasourceTimeoutError (err) { + return err.message && err.message.match(/canceling statement due to statement timeout/i); + } + + function isTimeoutError (err) { + return isRenderTimeoutError(err) || isDatasourceTimeoutError(err); + } + + function isRasterFormat (format) { + return format === 'png' || format === 'jpg'; + } + + if (isTimeoutError(err) && isRasterFormat(format)) { + return callback(null, timeoutErrorTile, { + 'Content-Type': 'image/png', + }, {}); + } else { + return callback(err, tile, headers, stats); + } + }; + } + + const rendererFactory = new windshaft.renderer.Factory({ + onTileErrorStrategy: onTileErrorStrategy, + mapnik: { + redisPool: redisPool, + grainstore: serverOptions.grainstore, + mapnik: serverOptions.renderer.mapnik + }, + http: serverOptions.renderer.http, + mvt: serverOptions.renderer.mvt + }); + + + return rendererFactory; +} + +function getAndValidateVersions(options) { + // jshint undef:false + var warn = console.warn.bind(console); + // jshint undef:true + + var packageDefinition = require('../../../package.json'); + + var declaredDependencies = packageDefinition.dependencies || {}; + var installedDependenciesVersions = { + camshaft: require('camshaft').version, + grainstore: windshaft.grainstore.version(), + mapnik: windshaft.mapnik.versions.mapnik, + node_mapnik: windshaft.mapnik.version, + 'turbo-carto': require('turbo-carto').version, + windshaft: windshaft.version, + windshaft_cartodb: packageDefinition.version + }; + + var dependenciesToValidate = ['camshaft', 'turbo-carto', 'windshaft']; + dependenciesToValidate.forEach(function(depName) { + var declaredDependencyVersion = declaredDependencies[depName]; + var installedDependencyVersion = installedDependenciesVersions[depName]; + if (declaredDependencyVersion !== installedDependencyVersion) { + warn( + 'Dependency="%s" installed version="%s" does not match declared version="%s". Check your installation.', + depName, installedDependencyVersion, declaredDependencyVersion + ); + } + }); + + // Be nice and warn if configured mapnik version is != installed mapnik version + if (windshaft.mapnik.versions.mapnik !== options.grainstore.mapnik_version) { + warn('WARNING: detected mapnik version (' + windshaft.mapnik.versions.mapnik + ')' + + ' != configured mapnik version (' + options.grainstore.mapnik_version + ')'); + } + + return installedDependenciesVersions; +} diff --git a/lib/cartodb/middleware/syntax-error.js b/lib/cartodb/middleware/syntax-error.js new file mode 100644 index 00000000..ad4df4e8 --- /dev/null +++ b/lib/cartodb/middleware/syntax-error.js @@ -0,0 +1,10 @@ +module.exports = function syntaxError () { + return function syntaxErrorMiddleware (err, req, res, next) { + if (err.name === 'SyntaxError') { + err.http_status = 400; + err.message = `${err.name}: ${err.message}`; + } + + next(err); + }; +}; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index d5410369..3e860d12 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -1,377 +1,55 @@ -var express = require('express'); +const express = require('express'); const cors = require('./middleware/cors'); const user = require('./middleware/user'); -var bodyParser = require('body-parser'); -var RedisPool = require('redis-mpool'); -var cartodbRedis = require('cartodb-redis'); -var _ = require('underscore'); +const bodyParser = require('body-parser'); +const _ = require('underscore'); -const AnalysisLayergroupController = require('./controllers/layergroup/analysis'); -const AttributesLayergroupController = require('./controllers/layergroup/attributes'); -const DataviewLayergroupController = require('./controllers/layergroup/dataview'); -const PreviewLayergroupController = require('./controllers/layergroup/preview'); -const TileLayergroupController = require('./controllers/layergroup/tile'); - -const AnonymousMapController = require('./controllers/map/anonymous'); -const NamedMapController = require('./controllers/map/named'); - -const AdminTemplateController = require('./controllers/template/admin'); -const PreviewTemplateController = require('./controllers/template/preview'); -const TileTemplateController = require('./controllers/template/tile'); - -const AnalysesController = require('./controllers/analyses'); - -const ServerInfoController = require('./controllers/server-info'); - -var SurrogateKeysCache = require('./cache/surrogate_keys_cache'); -var NamedMapsCacheEntry = require('./cache/model/named_maps_entry'); -var VarnishHttpCacheBackend = require('./cache/backend/varnish_http'); -var FastlyCacheBackend = require('./cache/backend/fastly'); - -var StatsClient = require('./stats/client'); +const StatsClient = require('./stats/client'); const stats = require('./middleware/stats'); -var RendererStatsReporter = require('./stats/reporter/renderer'); - -var windshaft = require('windshaft'); -var mapnik = windshaft.mapnik; - -var TemplateMaps = require('./backends/template_maps.js'); -var OverviewsMetadataApi = require('./api/overviews_metadata_api'); -var FilterStatsApi = require('./api/filter_stats_api'); -var UserLimitsApi = require('./api/user_limits_api'); -var AuthApi = require('./api/auth_api'); -var LayergroupAffectedTablesCache = require('./cache/layergroup_affected_tables'); -var NamedMapProviderCache = require('./cache/named_map_provider_cache'); -var PgQueryRunner = require('./backends/pg_query_runner'); -var PgConnection = require('./backends/pg_connection'); - -var AnalysisBackend = require('./backends/analysis'); -const AnalysisStatusBackend = require('./backends/analysis-status'); -const DataviewBackend = require('./backends/dataview'); - -var timeoutErrorTilePath = __dirname + '/../../assets/render-timeout-fallback.png'; -var timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encoding: null}); - -var SqlWrapMapConfigAdapter = require('./models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); -var MapConfigNamedLayersAdapter = require('./models/mapconfig/adapter/mapconfig-named-layers-adapter'); -var MapConfigBufferSizeAdapter = require('./models/mapconfig/adapter/mapconfig-buffer-size-adapter'); -var AnalysisMapConfigAdapter = require('./models/mapconfig/adapter/analysis-mapconfig-adapter'); -var MapConfigOverviewsAdapter = require('./models/mapconfig/adapter/mapconfig-overviews-adapter'); -var TurboCartoAdapter = require('./models/mapconfig/adapter/turbo-carto-adapter'); -var DataviewsWidgetsAdapter = require('./models/mapconfig/adapter/dataviews-widgets-adapter'); -var AggregationMapConfigAdapter = require('./models/mapconfig/adapter/aggregation-mapconfig-adapter'); -var MapConfigAdapter = require('./models/mapconfig/adapter'); - -var StatsBackend = require('./backends/stats'); - -const ResourceLocator = require('./models/resource-locator'); -const LayergroupMetadata = require('./utils/layergroup-metadata'); +const { mapnik } = require('windshaft'); const lzmaMiddleware = require('./middleware/lzma'); const errorMiddleware = require('./middleware/error-middleware'); +const syntaxError = require('./middleware/syntax-error'); const servedByHostHeader = require('./middleware/served-by-host-header'); -module.exports = function(serverOptions) { +const ControllersFactory = require('./controllers/factory'); + +module.exports = function createServer (serverOptions) { + validateOptions(serverOptions); + // Make stats client globally accessible global.statsClient = StatsClient.getInstance(serverOptions.statsd); - var redisPool = new RedisPool(_.defaults(global.environment.redis, { - name: 'windshaft-server', - unwatchOnRelease: false, - noReadyCheck: true - })); - - redisPool.on('status', function(status) { - var keyPrefix = 'windshaft.redis-pool.' + status.name + '.db' + status.db + '.'; - global.statsClient.gauge(keyPrefix + 'count', status.count); - global.statsClient.gauge(keyPrefix + 'unused', status.unused); - global.statsClient.gauge(keyPrefix + 'waiting', status.waiting); - }); - - var metadataBackend = cartodbRedis({pool: redisPool}); - var pgConnection = new PgConnection(metadataBackend); - var pgQueryRunner = new PgQueryRunner(pgConnection); - var overviewsMetadataApi = new OverviewsMetadataApi(pgQueryRunner); - var filterStatsApi = new FilterStatsApi(pgQueryRunner); - var userLimitsApi = new UserLimitsApi(metadataBackend, { - limits: { - cacheOnTimeout: serverOptions.renderer.mapnik.limits.cacheOnTimeout || false, - render: serverOptions.renderer.mapnik.limits.render || 0, - rateLimitsEnabled: global.environment.enabledFeatures.rateLimitsEnabled - } - }); - - var templateMaps = new TemplateMaps(redisPool, { - max_user_templates: global.environment.maxUserTemplates - }); - - var surrogateKeysCache = new SurrogateKeysCache(surrogateKeysCacheBackends(serverOptions)); - - function invalidateNamedMap (owner, templateName) { - var startTime = Date.now(); - surrogateKeysCache.invalidate(new NamedMapsCacheEntry(owner, templateName), function(err) { - var logMessage = JSON.stringify({ - username: owner, - type: 'named_map_invalidation', - elapsed: Date.now() - startTime, - error: !!err ? JSON.stringify(err.message) : undefined - }); - if (err) { - global.logger.warn(logMessage); - } else { - global.logger.info(logMessage); - } - }); - } - ['update', 'delete'].forEach(function(eventType) { - templateMaps.on(eventType, invalidateNamedMap); - }); - serverOptions.grainstore.mapnik_version = mapnikVersion(serverOptions); - validateOptions(serverOptions); - bootstrapFonts(serverOptions); - // initialize express server - var app = bootstrap(serverOptions); + const app = bootstrap(serverOptions); - var mapStore = new windshaft.storage.MapStore({ - pool: redisPool, - expire_time: serverOptions.grainstore.default_layergroup_ttl - }); + app.use(bodyParser.json()); - var onTileErrorStrategy; - if (global.environment.enabledFeatures.onTileErrorStrategy !== false) { - onTileErrorStrategy = function onTileErrorStrategy$TimeoutTile(err, tile, headers, stats, format, callback) { + app.use(servedByHostHeader()); - function isRenderTimeoutError (err) { - return err.message === 'Render timed out'; - } + app.use(stats({ + enabled: serverOptions.useProfiler, + statsClient: global.statsClient + })); - function isDatasourceTimeoutError (err) { - return err.message && err.message.match(/canceling statement due to statement timeout/i); - } + app.use(lzmaMiddleware()); - function isTimeoutError (err) { - return isRenderTimeoutError(err) || isDatasourceTimeoutError(err); - } - function isRasterFormat (format) { - return format === 'png' || format === 'jpg'; - } + setupLogger(app, serverOptions); - if (isTimeoutError(err) && isRasterFormat(format)) { - return callback(null, timeoutErrorTile, { - 'Content-Type': 'image/png', - }, {}); - } else { - return callback(err, tile, headers, stats); - } - }; - } + app.use(cors()); + app.use(user()); - var rendererFactory = new windshaft.renderer.Factory({ - onTileErrorStrategy: onTileErrorStrategy, - mapnik: { - redisPool: redisPool, - grainstore: serverOptions.grainstore, - mapnik: serverOptions.renderer.mapnik - }, - http: serverOptions.renderer.http, - mvt: serverOptions.renderer.mvt - }); + const controllers = new ControllersFactory({ serverOptions, environmentOptions: global.environment }); - // initialize render cache - var rendererCacheOpts = _.defaults(serverOptions.renderCache || {}, { - ttl: 60000, // 60 seconds TTL by default - statsInterval: 60000 // reports stats every milliseconds defined here - }); - var rendererCache = new windshaft.cache.RendererCache(rendererFactory, rendererCacheOpts); - var rendererStatsReporter = new RendererStatsReporter(rendererCache, rendererCacheOpts.statsInterval); - rendererStatsReporter.start(); - - var attributesBackend = new windshaft.backend.Attributes(); - var previewBackend = new windshaft.backend.Preview(rendererCache); - var tileBackend = new windshaft.backend.Tile(rendererCache); - var mapValidatorBackend = new windshaft.backend.MapValidator(tileBackend, attributesBackend); - var mapBackend = new windshaft.backend.Map(rendererCache, mapStore, mapValidatorBackend); - - var analysisBackend = new AnalysisBackend(metadataBackend, serverOptions.analysis); - const analysisStatusBackend = new AnalysisStatusBackend(); - - const dataviewBackend = new DataviewBackend(analysisBackend); - - var statsBackend = new StatsBackend(); - - var layergroupAffectedTablesCache = new LayergroupAffectedTablesCache(); - app.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - - var mapConfigAdapter = new MapConfigAdapter( - new MapConfigNamedLayersAdapter(templateMaps, pgConnection), - new MapConfigBufferSizeAdapter(), - new SqlWrapMapConfigAdapter(), - new DataviewsWidgetsAdapter(), - new AnalysisMapConfigAdapter(analysisBackend), - new AggregationMapConfigAdapter(pgConnection), - new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi), - new TurboCartoAdapter() - ); - - var namedMapProviderCache = new NamedMapProviderCache( - templateMaps, - pgConnection, - metadataBackend, - userLimitsApi, - mapConfigAdapter, - layergroupAffectedTablesCache - ); - - ['update', 'delete'].forEach(function(eventType) { - templateMaps.on(eventType, namedMapProviderCache.invalidate.bind(namedMapProviderCache)); - }); - - var authApi = new AuthApi(pgConnection, metadataBackend, mapStore, templateMaps); - - var TablesExtentApi = require('./api/tables_extent_api'); - var tablesExtentApi = new TablesExtentApi(pgQueryRunner); - - const resourceLocator = new ResourceLocator(global.environment); - const layergroupMetadata = new LayergroupMetadata(resourceLocator); - - var versions = getAndValidateVersions(serverOptions); - - /******************************************************************************************************************* - * Routing - ******************************************************************************************************************/ - - const mapRouter = express.Router(); - const templateRouter = express.Router(); - const monitorRouter = express.Router(); - - new AnalysisLayergroupController( - analysisStatusBackend, - pgConnection, - mapStore, - userLimitsApi, - layergroupAffectedTablesCache, - authApi, - surrogateKeysCache - ).register(mapRouter); - - new AttributesLayergroupController( - attributesBackend, - pgConnection, - mapStore, - userLimitsApi, - layergroupAffectedTablesCache, - authApi, - surrogateKeysCache - ).register(mapRouter); - - new DataviewLayergroupController( - dataviewBackend, - pgConnection, - mapStore, - userLimitsApi, - layergroupAffectedTablesCache, - authApi, - surrogateKeysCache - ).register(mapRouter); - - new PreviewLayergroupController( - previewBackend, - pgConnection, - mapStore, - userLimitsApi, - layergroupAffectedTablesCache, - authApi, - surrogateKeysCache - ).register(mapRouter); - - new TileLayergroupController( - tileBackend, - pgConnection, - mapStore, - userLimitsApi, - layergroupAffectedTablesCache, - authApi, - surrogateKeysCache - ).register(mapRouter); - - new AnonymousMapController( - pgConnection, - templateMaps, - mapBackend, - metadataBackend, - surrogateKeysCache, - userLimitsApi, - layergroupAffectedTablesCache, - mapConfigAdapter, - statsBackend, - authApi, - layergroupMetadata - ).register(mapRouter); - - new NamedMapController( - pgConnection, - templateMaps, - mapBackend, - metadataBackend, - surrogateKeysCache, - userLimitsApi, - layergroupAffectedTablesCache, - mapConfigAdapter, - statsBackend, - authApi, - layergroupMetadata - ).register(templateRouter); - - new TileTemplateController( - namedMapProviderCache, - tileBackend, - surrogateKeysCache, - pgConnection, - authApi, - userLimitsApi - ).register(templateRouter); - - new PreviewTemplateController( - namedMapProviderCache, - previewBackend, - surrogateKeysCache, - tablesExtentApi, - metadataBackend, - pgConnection, - authApi, - userLimitsApi - ).register(mapRouter); - - new AdminTemplateController( - authApi, - templateMaps, - userLimitsApi - ).register(templateRouter); - - new AnalysesController( - pgConnection, - authApi, - userLimitsApi - ).register(mapRouter); - - new ServerInfoController(versions).register(monitorRouter); - - const { base_url_mapconfig: mapConfigBasePath, base_url_templated: templateBasePath } = serverOptions; - - app.use(mapConfigBasePath, mapRouter); - app.use(templateBasePath, templateRouter); - app.use('/', monitorRouter); - - /******************************************************************************************************************* - * END Routing - ******************************************************************************************************************/ + controllers.regist(app); + app.use(syntaxError()); app.use(errorMiddleware()); return app; @@ -383,45 +61,6 @@ function validateOptions(opts) { } } -function getAndValidateVersions(options) { - // jshint undef:false - var warn = console.warn.bind(console); - // jshint undef:true - - var packageDefinition = require('../../package.json'); - - var declaredDependencies = packageDefinition.dependencies || {}; - var installedDependenciesVersions = { - camshaft: require('camshaft').version, - grainstore: windshaft.grainstore.version(), - mapnik: windshaft.mapnik.versions.mapnik, - node_mapnik: windshaft.mapnik.version, - 'turbo-carto': require('turbo-carto').version, - windshaft: windshaft.version, - windshaft_cartodb: packageDefinition.version - }; - - var dependenciesToValidate = ['camshaft', 'turbo-carto', 'windshaft']; - dependenciesToValidate.forEach(function(depName) { - var declaredDependencyVersion = declaredDependencies[depName]; - var installedDependencyVersion = installedDependenciesVersions[depName]; - if (declaredDependencyVersion !== installedDependencyVersion) { - warn( - 'Dependency="%s" installed version="%s" does not match declared version="%s". Check your installation.', - depName, installedDependencyVersion, declaredDependencyVersion - ); - } - }); - - // Be nice and warn if configured mapnik version is != installed mapnik version - if (mapnik.versions.mapnik !== options.grainstore.mapnik_version) { - warn('WARNING: detected mapnik version (' + mapnik.versions.mapnik + ')' + - ' != configured mapnik version (' + options.grainstore.mapnik_version + ')'); - } - - return installedDependenciesVersions; -} - function bootstrapFonts(opts) { // Set carto renderer configuration for MMLStore opts.grainstore.carto_env = opts.grainstore.carto_env || {}; @@ -465,35 +104,6 @@ function bootstrap(opts) { return value; }); - app.use(bodyParser.json()); - - app.use(servedByHostHeader()); - - app.use(stats({ - enabled: opts.useProfiler, - statsClient: global.statsClient - })); - - app.use(lzmaMiddleware()); - - // temporary measure until we upgrade to newer version expressjs so we can check err.status - app.use(function(err, req, res, next) { - if (err) { - if (err.name === 'SyntaxError') { - res.status(400).json({ errors: [err.name + ': ' + err.message] }); - } else { - next(err); - } - } else { - next(); - } - }); - - setupLogger(app, opts); - - app.use(cors()); - app.use(user()); - return app; } @@ -513,25 +123,6 @@ function setupLogger(app, opts) { } } -function surrogateKeysCacheBackends(serverOptions) { - var cacheBackends = []; - - if (serverOptions.varnish_purge_enabled) { - cacheBackends.push( - new VarnishHttpCacheBackend(serverOptions.varnish_host, serverOptions.varnish_http_port) - ); - } - - if (serverOptions.fastly && - !!serverOptions.fastly.enabled && !!serverOptions.fastly.apiKey && !!serverOptions.fastly.serviceId) { - cacheBackends.push( - new FastlyCacheBackend(serverOptions.fastly.apiKey, serverOptions.fastly.serviceId) - ); - } - - return cacheBackends; -} - function mapnikVersion(opts) { return opts.grainstore.mapnik_version || mapnik.versions.mapnik; } diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index b599cf9c..2131fd1a 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -230,7 +230,7 @@ describe('tests from old api translated to multilayer', function() { var parsed = JSON.parse(res.body); assert.ok(parsed.errors); assert.equal(parsed.errors.length, 1); - assert.ok(parsed.errors[0].match(/^Unexpected token W/)); + assert.ok(parsed.errors[0].match(/Unexpected token W/)); done(); } diff --git a/test/unit/cartodb/ported/windshaft_server.test.js b/test/unit/cartodb/ported/windshaft_server.test.js index ad9ed1d9..2bc1423c 100644 --- a/test/unit/cartodb/ported/windshaft_server.test.js +++ b/test/unit/cartodb/ported/windshaft_server.test.js @@ -29,7 +29,7 @@ describe('windshaft', function() { function(){ var ws = cartodbServer({unbuffered_logging:true}); ws.listen(); - }, /Cannot read property 'mapnik' of undefined/ + }, /Must initialise server with/ ); }); }); From 3316c2ded32b145c37dfc81c0dd6e5c4ab39db6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 3 Apr 2018 12:26:35 +0200 Subject: [PATCH 22/54] Create logger middleware to encapsulate its configuration from app --- lib/cartodb/middleware/logger.js | 22 ++++++++++++++++++++++ lib/cartodb/server.js | 6 +++--- 2 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 lib/cartodb/middleware/logger.js diff --git a/lib/cartodb/middleware/logger.js b/lib/cartodb/middleware/logger.js new file mode 100644 index 00000000..ccd51d45 --- /dev/null +++ b/lib/cartodb/middleware/logger.js @@ -0,0 +1,22 @@ +module.exports = function logger (options) { + if (!global.log4js || !options.log_format) { + return function dummyLoggerMiddleware (req, res, next) { + next(); + }; + } + + const opts = { + level: 'info', + // Allowing for unbuffered logging is mainly + // used to avoid hanging during unit testing. + // TODO: provide an explicit teardown function instead, + // releasing any event handler or timer set by + // this component. + buffer: !options.unbuffered_logging, + // optional log format + format: options.log_format + }; + const logger = global.log4js.getLogger(); + + return global.log4js.connectLogger(logger, opts); +}; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 3e860d12..bcb53dc1 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -13,6 +13,7 @@ const lzmaMiddleware = require('./middleware/lzma'); const errorMiddleware = require('./middleware/error-middleware'); const syntaxError = require('./middleware/syntax-error'); const servedByHostHeader = require('./middleware/served-by-host-header'); +const logger = require('./middleware/logger'); const ControllersFactory = require('./controllers/factory'); @@ -28,6 +29,8 @@ module.exports = function createServer (serverOptions) { const app = bootstrap(serverOptions); + app.use(logger(serverOptions)); + app.use(bodyParser.json()); app.use(servedByHostHeader()); @@ -39,9 +42,6 @@ module.exports = function createServer (serverOptions) { app.use(lzmaMiddleware()); - - setupLogger(app, serverOptions); - app.use(cors()); app.use(user()); From cc61a89c684702badbbd0513376192d106fcbf98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 3 Apr 2018 12:27:45 +0200 Subject: [PATCH 23/54] Remove function --- lib/cartodb/server.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index bcb53dc1..12f3cf42 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -107,22 +107,6 @@ function bootstrap(opts) { return app; } -function setupLogger(app, opts) { - if (global.log4js && opts.log_format) { - var loggerOpts = { - // Allowing for unbuffered logging is mainly - // used to avoid hanging during unit testing. - // TODO: provide an explicit teardown function instead, - // releasing any event handler or timer set by - // this component. - buffer: !opts.unbuffered_logging, - // optional log format - format: opts.log_format - }; - app.use(global.log4js.connectLogger(global.log4js.getLogger(), _.defaults(loggerOpts, {level: 'info'}))); - } -} - function mapnikVersion(opts) { return opts.grainstore.mapnik_version || mapnik.versions.mapnik; } From a21d7db3901544f406c7839ad5fa3192e02b06d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 3 Apr 2018 13:21:41 +0200 Subject: [PATCH 24/54] Extract json-replacer --- lib/cartodb/server.js | 72 +++++++++--------------------- lib/cartodb/utils/json-replacer.js | 19 ++++++++ 2 files changed, 39 insertions(+), 52 deletions(-) create mode 100644 lib/cartodb/utils/json-replacer.js diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 12f3cf42..25193a7e 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -1,22 +1,24 @@ -const express = require('express'); -const cors = require('./middleware/cors'); -const user = require('./middleware/user'); -const bodyParser = require('body-parser'); const _ = require('underscore'); - -const StatsClient = require('./stats/client'); -const stats = require('./middleware/stats'); - +const express = require('express'); const { mapnik } = require('windshaft'); -const lzmaMiddleware = require('./middleware/lzma'); -const errorMiddleware = require('./middleware/error-middleware'); -const syntaxError = require('./middleware/syntax-error'); -const servedByHostHeader = require('./middleware/served-by-host-header'); +const jsonReplacer = require('./utils/json-replacer'); + const logger = require('./middleware/logger'); +const bodyParser = require('body-parser'); +const servedByHostHeader = require('./middleware/served-by-host-header'); +const stats = require('./middleware/stats'); +const lzmaMiddleware = require('./middleware/lzma'); +const cors = require('./middleware/cors'); +const user = require('./middleware/user'); const ControllersFactory = require('./controllers/factory'); +const syntaxError = require('./middleware/syntax-error'); +const errorMiddleware = require('./middleware/error-middleware'); + +const StatsClient = require('./stats/client'); + module.exports = function createServer (serverOptions) { validateOptions(serverOptions); @@ -27,21 +29,21 @@ module.exports = function createServer (serverOptions) { bootstrapFonts(serverOptions); - const app = bootstrap(serverOptions); + const app = express(); + + app.enable('jsonp callback'); + app.disable('x-powered-by'); + app.disable('etag'); + app.set('json replacer', jsonReplacer()); app.use(logger(serverOptions)); - app.use(bodyParser.json()); - app.use(servedByHostHeader()); - app.use(stats({ enabled: serverOptions.useProfiler, statsClient: global.statsClient })); - app.use(lzmaMiddleware()); - app.use(cors()); app.use(user()); @@ -73,40 +75,6 @@ function bootstrapFonts(opts) { } } -function bootstrap(opts) { - var app; - if (_.isObject(opts.https)) { - // use https if possible - app = express.createServer(opts.https); - } else { - // fall back to http by default - app = express(); - } - app.enable('jsonp callback'); - app.disable('x-powered-by'); - app.disable('etag'); - - // Fix: https://github.com/CartoDB/Windshaft-cartodb/issues/705 - // See: http://expressjs.com/en/4x/api.html#app.set - app.set('json replacer', function (key, value) { - if (value !== value) { - return 'NaN'; - } - - if (value === Infinity) { - return 'Infinity'; - } - - if (value === -Infinity) { - return '-Infinity'; - } - - return value; - }); - - return app; -} - function mapnikVersion(opts) { return opts.grainstore.mapnik_version || mapnik.versions.mapnik; } diff --git a/lib/cartodb/utils/json-replacer.js b/lib/cartodb/utils/json-replacer.js new file mode 100644 index 00000000..cccac1f6 --- /dev/null +++ b/lib/cartodb/utils/json-replacer.js @@ -0,0 +1,19 @@ +module.exports = function jsonReplacerFactory () { + // Fix: https://github.com/CartoDB/Windshaft-cartodb/issues/705 + // See: http://expressjs.com/en/4x/api.html#app.set + return function jsonReplacer (key, value) { + if (value !== value) { + return 'NaN'; + } + + if (value === Infinity) { + return 'Infinity'; + } + + if (value === -Infinity) { + return '-Infinity'; + } + + return value; + }; +}; From 5cd073c96fd8d5267e8bf45071c71f4bc9a2779e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 3 Apr 2018 14:50:24 +0200 Subject: [PATCH 25/54] Remove old controller from bad merge --- lib/cartodb/controllers/map.js | 592 --------------------------------- 1 file changed, 592 deletions(-) delete mode 100644 lib/cartodb/controllers/map.js diff --git a/lib/cartodb/controllers/map.js b/lib/cartodb/controllers/map.js deleted file mode 100644 index 9fd67710..00000000 --- a/lib/cartodb/controllers/map.js +++ /dev/null @@ -1,592 +0,0 @@ -const _ = require('underscore'); -const windshaft = require('windshaft'); -const MapConfig = windshaft.model.MapConfig; -const Datasource = windshaft.model.Datasource; -const ResourceLocator = require('../models/resource-locator'); -const cors = require('../middleware/cors'); -const user = require('../middleware/user'); -const cleanUpQueryParams = require('../middleware/clean-up-query-params'); -const credentials = require('../middleware/credentials'); -const dbConnSetup = require('../middleware/db-conn-setup'); -const authorize = require('../middleware/authorize'); -const cacheControlHeader = require('../middleware/cache-control-header'); -const cacheChannelHeader = require('../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../middleware/last-modified-header'); -const sendResponse = require('../middleware/send-response'); -const NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); -const CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider'); -const LayergroupMetadata = require('../utils/layergroup-metadata'); -const rateLimit = require('../middleware/rate-limit'); -const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; - -/** - * @param {AuthApi} authApi - * @param {PgConnection} pgConnection - * @param {TemplateMaps} templateMaps - * @param {MapBackend} mapBackend - * @param metadataBackend - * @param {SurrogateKeysCache} surrogateKeysCache - * @param {UserLimitsApi} userLimitsApi - * @param {LayergroupAffectedTables} layergroupAffectedTables - * @param {MapConfigAdapter} mapConfigAdapter - * @param {StatsBackend} statsBackend - * @constructor - */ -function MapController ( - pgConnection, - templateMaps, - mapBackend, - metadataBackend, - surrogateKeysCache, - userLimitsApi, - layergroupAffectedTables, - mapConfigAdapter, - statsBackend, - authApi -) { - this.pgConnection = pgConnection; - this.templateMaps = templateMaps; - this.mapBackend = mapBackend; - this.metadataBackend = metadataBackend; - this.surrogateKeysCache = surrogateKeysCache; - this.userLimitsApi = userLimitsApi; - this.layergroupAffectedTables = layergroupAffectedTables; - - this.mapConfigAdapter = mapConfigAdapter; - const resourceLocator = new ResourceLocator(global.environment); - this.layergroupMetadata = new LayergroupMetadata(resourceLocator); - - this.statsBackend = statsBackend; - this.authApi = authApi; -} - -module.exports = MapController; - -MapController.prototype.register = function(app) { - const { base_url_mapconfig: mapConfigBasePath, base_url_templated: templateBasePath } = app; - - app.get( - `${mapConfigBasePath}`, - this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS) - ); - - app.post( - `${mapConfigBasePath}`, - this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS) - ); - - const useTemplate = true; - - app.get( - `${templateBasePath}/:template_id/jsonp`, - this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.NAMED, useTemplate) - ); - - app.post( - `${templateBasePath}/:template_id`, - this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.NAMED, useTemplate) - ); - - app.options(`${mapConfigBasePath}`, cors('Content-Type')); -}; - -MapController.prototype.composeCreateMapMiddleware = function (endpointGroup, useTemplate = false) { - const isTemplateInstantiation = useTemplate; - const useTemplateHash = useTemplate; - const includeQuery = !useTemplate; - const label = useTemplate ? 'NAMED MAP LAYERGROUP' : 'ANONYMOUS LAYERGROUP'; - const addContext = !useTemplate; - - return [ - cors(), - user(), - credentials(), - authorize(this.authApi), - dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, endpointGroup), - cleanUpQueryParams(['aggregation']), - initProfiler(isTemplateInstantiation), - checkJsonContentType(), - this.getCreateMapMiddlewares(useTemplate), - incrementMapViewCount(this.metadataBackend), - augmentLayergroupData(), - cacheControlHeader({ ttl: global.environment.varnish.layergroupTtl || 86400, revalidate: true }), - cacheChannelHeader(), - surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader({ now: true }), - setLastUpdatedTimeToLayergroup(), - setLayerStats(this.pgConnection, this.statsBackend), - setLayergroupIdHeader(this.templateMaps ,useTemplateHash), - setDataviewsAndWidgetsUrlsToLayergroupMetadata(this.layergroupMetadata), - setAnalysesMetadataToLayergroup(this.layergroupMetadata, includeQuery), - setTurboCartoMetadataToLayergroup(this.layergroupMetadata), - setAggregationMetadataToLayergroup(this.layergroupMetadata), - setTilejsonMetadataToLayergroup(this.layergroupMetadata), - sendResponse(), - augmentError({ label, addContext }) - ]; -}; - -MapController.prototype.getCreateMapMiddlewares = function (useTemplate) { - if (useTemplate) { - return [ - checkInstantiteLayergroup(), - getTemplate( - this.templateMaps, - this.pgConnection, - this.metadataBackend, - this.userLimitsApi, - this.mapConfigAdapter, - this.layergroupAffectedTables - ), - instantiateLayergroup( - this.mapBackend, - this.userLimitsApi, - this.pgConnection, - this.layergroupAffectedTables - ) - ]; - } - - return [ - checkCreateLayergroup(), - prepareAdapterMapConfig(this.mapConfigAdapter), - createLayergroup ( - this.mapBackend, - this.userLimitsApi, - this.pgConnection, - this.layergroupAffectedTables - ) - ]; -}; - -function initProfiler (isTemplateInstantiation) { - const operation = isTemplateInstantiation ? 'instance_template' : 'createmap'; - - return function initProfilerMiddleware (req, res, next) { - req.profiler.start(`windshaft-cartodb.${operation}_${req.method.toLowerCase()}`); - req.profiler.done(`${operation}.initProfilerMiddleware`); - next(); - }; -} - -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')); - } - - req.profiler.done('checkJsonContentTypeMiddleware'); - - next(); - }; -} - -function checkInstantiteLayergroup () { - return function checkInstantiteLayergroupMiddleware(req, res, next) { - if (req.method === 'GET') { - const { callback, config } = req.query; - - if (callback === undefined || callback.length === 0) { - return next(new Error('callback parameter should be present and be a function name')); - } - - if (config) { - try { - req.body = JSON.parse(config); - } catch(e) { - return next(new Error('Invalid config parameter, should be a valid JSON')); - } - } - } - - req.profiler.done('checkInstantiteLayergroup'); - - return next(); - }; -} - -function checkCreateLayergroup () { - return function checkCreateLayergroupMiddleware (req, res, next) { - if (req.method === 'GET') { - const { config } = req.query; - - if (!config) { - return next(new Error('layergroup GET needs a "config" parameter')); - } - - try { - req.body = JSON.parse(config); - } catch (err) { - return next(err); - } - } - - req.profiler.done('checkCreateLayergroup'); - return next(); - }; -} - -function getTemplate ( - templateMaps, - pgConnection, - metadataBackend, - userLimitsApi, - mapConfigAdapter, - affectedTablesCache -) { - return function getTemplateMiddleware (req, res, next) { - const templateParams = req.body; - const { user, dbuser, dbname, dbpassword, dbhost, dbport } = res.locals; - const { template_id } = req.params; - const { auth_token } = req.query; - - const params = Object.assign({ dbuser, dbname, dbpassword, dbhost, dbport }, req.query); - - const mapConfigProvider = new NamedMapMapConfigProvider( - templateMaps, - pgConnection, - metadataBackend, - userLimitsApi, - mapConfigAdapter, - affectedTablesCache, - user, - template_id, - templateParams, - auth_token, - params - ); - - mapConfigProvider.getMapConfig((err, mapConfig, rendererParams) => { - req.profiler.done('named.getMapConfig'); - if (err) { - return next(err); - } - - res.locals.mapConfig = mapConfig; - res.locals.rendererParams = rendererParams; - res.locals.mapConfigProvider = mapConfigProvider; - - next(); - }); - }; -} - -function prepareAdapterMapConfig (mapConfigAdapter) { - return function prepareAdapterMapConfigMiddleware(req, res, next) { - const requestMapConfig = req.body; - - const { user, api_key } = res.locals; - const { dbuser, dbname, dbpassword, dbhost, dbport } = res.locals; - const params = Object.assign({ dbuser, dbname, dbpassword, dbhost, dbport }, req.query); - - const context = { - analysisConfiguration: { - user, - db: { - host: dbhost, - port: dbport, - dbname: dbname, - user: dbuser, - pass: dbpassword - }, - batch: { - username: user, - apiKey: api_key - } - } - }; - - mapConfigAdapter.getMapConfig(user, requestMapConfig, params, context, (err, requestMapConfig) => { - req.profiler.done('anonymous.getMapConfig'); - if (err) { - return next(err); - } - - req.body = requestMapConfig; - res.locals.context = context; - - next(); - }); - }; -} - -function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTablesCache) { - return function createLayergroupMiddleware (req, res, next) { - const requestMapConfig = req.body; - - const { context } = res.locals; - const { user, cache_buster, api_key } = res.locals; - const { dbuser, dbname, dbpassword, dbhost, dbport } = res.locals; - - const params = { - cache_buster, api_key, - dbuser, dbname, dbpassword, dbhost, dbport - }; - - const datasource = context.datasource || Datasource.EmptyDatasource(); - const mapConfig = new MapConfig(requestMapConfig, datasource); - - const mapConfigProvider = new CreateLayergroupMapConfigProvider( - mapConfig, - user, - userLimitsApi, - pgConnection, - affectedTablesCache, - params - ); - - res.locals.mapConfig = mapConfig; - res.locals.analysesResults = context.analysesResults; - - const mapParams = { dbuser, dbname, dbpassword, dbhost, dbport }; - - mapBackend.createLayergroup(mapConfig, mapParams, mapConfigProvider, (err, layergroup) => { - req.profiler.done('createLayergroup'); - if (err) { - return next(err); - } - - res.body = layergroup; - res.locals.mapConfigProvider = mapConfigProvider; - - next(); - }); - }; -} - -function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTablesCache) { - return function instantiateLayergroupMiddleware (req, res, next) { - const { user, mapConfig, rendererParams } = res.locals; - const mapConfigProvider = new CreateLayergroupMapConfigProvider( - mapConfig, - user, - userLimitsApi, - pgConnection, - affectedTablesCache, - rendererParams - ); - - mapBackend.createLayergroup(mapConfig, rendererParams, mapConfigProvider, (err, layergroup) => { - req.profiler.done('createLayergroup'); - if (err) { - return next(err); - } - - res.body = layergroup; - - const { mapConfigProvider } = res.locals; - - res.locals.analysesResults = mapConfigProvider.analysesResults; - res.locals.template = mapConfigProvider.template; - res.locals.context = mapConfigProvider.context; - - next(); - }); - }; -} - -function incrementMapViewCount (metadataBackend) { - return function incrementMapViewCountMiddleware(req, res, next) { - const { mapConfig, user } = res.locals; - - // Error won't blow up, just be logged. - metadataBackend.incMapviewCount(user, mapConfig.obj().stat_tag, (err) => { - req.profiler.done('incMapviewCount'); - - if (err) { - global.logger.log(`ERROR: failed to increment mapview count for user '${user}': ${err.message}`); - } - - next(); - }); - }; -} - -function augmentLayergroupData () { - return function augmentLayergroupDataMiddleware (req, res, next) { - const layergroup = res.body; - - // include in layergroup response the variables in serverMedata - // those variables are useful to send to the client information - // about how to reach this server or information about it - _.extend(layergroup, global.environment.serverMetadata); - - next(); - }; -} - -function setLastUpdatedTimeToLayergroup () { - return function setLastUpdatedTimeToLayergroupMiddleware (req, res, next) { - const { mapConfigProvider, analysesResults } = res.locals; - const layergroup = res.body; - - mapConfigProvider.getAffectedTables((err, affectedTables) => { - if (err) { - return next(err); - } - - if (!affectedTables) { - return next(); - } - - var lastUpdateTime = affectedTables.getLastUpdatedAt(); - - lastUpdateTime = getLastUpdatedTime(analysesResults, lastUpdateTime) || lastUpdateTime; - - // last update for layergroup cache buster - layergroup.layergroupid = layergroup.layergroupid + ':' + lastUpdateTime; - layergroup.last_updated = new Date(lastUpdateTime).toISOString(); - - next(); - }); - }; -} - -function getLastUpdatedTime(analysesResults, lastUpdateTime) { - if (!Array.isArray(analysesResults)) { - return lastUpdateTime; - } - return analysesResults.reduce(function(lastUpdateTime, analysis) { - return analysis.getNodes().reduce(function(lastNodeUpdatedAtTime, node) { - var nodeUpdatedAtDate = node.getUpdatedAt(); - var nodeUpdatedTimeAt = (nodeUpdatedAtDate && nodeUpdatedAtDate.getTime()) || 0; - return nodeUpdatedTimeAt > lastNodeUpdatedAtTime ? nodeUpdatedTimeAt : lastNodeUpdatedAtTime; - }, lastUpdateTime); - }, lastUpdateTime); -} - -function setLayerStats (pgConnection, statsBackend) { - return function setLayerStatsMiddleware(req, res, next) { - const { user, mapConfig } = res.locals; - const layergroup = res.body; - - pgConnection.getConnection(user, (err, connection) => { - if (err) { - return next(err); - } - - statsBackend.getStats(mapConfig, connection, function(err, layersStats) { - if (err) { - return next(err); - } - - if (layersStats.length > 0) { - layergroup.metadata.layers.forEach(function (layer, index) { - layer.meta.stats = layersStats[index]; - }); - } - - next(); - }); - }); - }; -} - -function setLayergroupIdHeader (templateMaps, useTemplateHash) { - return function setLayergroupIdHeaderMiddleware (req, res, next) { - const { user, template } = res.locals; - const layergroup = res.body; - - if (useTemplateHash) { - var templateHash = templateMaps.fingerPrint(template).substring(0, 8); - layergroup.layergroupid = `${user}@${templateHash}@${layergroup.layergroupid}`; - } - - res.set('X-Layergroup-Id', layergroup.layergroupid); - - next(); - }; -} - -function setDataviewsAndWidgetsUrlsToLayergroupMetadata (layergroupMetadata) { - return function setDataviewsAndWidgetsUrlsToLayergroupMetadataMiddleware (req, res, next) { - const { user, mapConfig } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addDataviewsAndWidgetsUrls(user, layergroup, mapConfig.obj()); - - next(); - }; -} - -function setAnalysesMetadataToLayergroup (layergroupMetadata, includeQuery) { - return function setAnalysesMetadataToLayergroupMiddleware (req, res, next) { - const { user, analysesResults = [] } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addAnalysesMetadata(user, layergroup, analysesResults, includeQuery); - - next(); - }; -} - -function setTurboCartoMetadataToLayergroup (layergroupMetadata) { - return function setTurboCartoMetadataToLayergroupMiddleware (req, res, next) { - const { mapConfig, context } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addTurboCartoContextMetadata(layergroup, mapConfig.obj(), context); - - next(); - }; -} - -function setAggregationMetadataToLayergroup (layergroupMetadata) { - return function setAggregationMetadataToLayergroupMiddleware (req, res, next) { - const { mapConfig, context } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addAggregationContextMetadata(layergroup, mapConfig.obj(), context); - - next(); - }; -} - -function setTilejsonMetadataToLayergroup (layergroupMetadata) { - return function augmentLayergroupTilejsonMiddleware (req, res, next) { - const { user, mapConfig } = res.locals; - const layergroup = res.body; - - layergroupMetadata.addTileJsonMetadata(layergroup, user, mapConfig); - - next(); - }; -} - -function augmentError (options) { - const { addContext = false, label = 'MAPS CONTROLLER' } = options; - - return function augmentErrorMiddleware (err, req, res, next) { - req.profiler.done('error'); - const { mapConfig } = res.locals; - - if (addContext) { - err = Number.isFinite(err.layerIndex) ? populateError(err, mapConfig) : err; - } - - err.label = label; - - next(err); - }; -} - -function populateError(err, mapConfig) { - var error = new Error(err.message); - error.http_status = err.http_status; - - if (!err.http_status && err.message.indexOf('column "the_geom_webmercator" does not exist') >= 0) { - error.http_status = 400; - } - - error.type = 'layer'; - error.subtype = err.message.indexOf('Postgis Plugin') >= 0 ? 'query' : undefined; - error.layer = { - id: mapConfig.getLayerId(err.layerIndex), - index: err.layerIndex, - type: mapConfig.layerType(err.layerIndex) - }; - - return error; -} From 462ba626569ac1063b04e5821e7cf128d132b567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 3 Apr 2018 15:32:29 +0200 Subject: [PATCH 26/54] Make cors middleware more generic and link it just to application level --- lib/cartodb/controllers/map/anonymous.js | 3 +-- lib/cartodb/controllers/template/admin.js | 5 ++--- lib/cartodb/middleware/cors.js | 14 +++++++++----- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index 87f9bb84..9575eead 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -1,7 +1,6 @@ const windshaft = require('windshaft'); const MapConfig = windshaft.model.MapConfig; const Datasource = windshaft.model.Datasource; -const cors = require('../../middleware/cors'); const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); const credentials = require('../../middleware/credentials'); const dbConnSetup = require('../../middleware/db-conn-setup'); @@ -66,9 +65,9 @@ function AnonymousMapController ( module.exports = AnonymousMapController; AnonymousMapController.prototype.register = function (mapRouter) { + mapRouter.options('/'); mapRouter.get('/', this.composeCreateMapMiddleware()); mapRouter.post('/', this.composeCreateMapMiddleware()); - mapRouter.options('/', cors('Content-Type')); }; AnonymousMapController.prototype.composeCreateMapMiddleware = function () { diff --git a/lib/cartodb/controllers/template/admin.js b/lib/cartodb/controllers/template/admin.js index f5f2fec7..d91ca9fd 100644 --- a/lib/cartodb/controllers/template/admin.js +++ b/lib/cartodb/controllers/template/admin.js @@ -1,5 +1,4 @@ const { templateName } = require('../../backends/template_maps'); -const cors = require('../../middleware/cors'); const credentials = require('../../middleware/credentials'); const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; @@ -20,6 +19,8 @@ function AdminTemplateController(authApi, templateMaps, userLimitsApi) { module.exports = AdminTemplateController; AdminTemplateController.prototype.register = function (templateRouter) { + templateRouter.options(`/:template_id`); + templateRouter.post( `/`, credentials(), @@ -66,8 +67,6 @@ AdminTemplateController.prototype.register = function (templateRouter) { listTemplates({ templateMaps: this.templateMaps }), sendResponse() ); - - templateRouter.options(`/:template_id`, cors('Content-Type')); }; function checkContentType ({ action, label }) { diff --git a/lib/cartodb/middleware/cors.js b/lib/cartodb/middleware/cors.js index 65b7cf4f..12db26ac 100644 --- a/lib/cartodb/middleware/cors.js +++ b/lib/cartodb/middleware/cors.js @@ -1,13 +1,17 @@ -module.exports = function cors (extraHeaders) { +module.exports = function cors () { return function corsMiddleware (req, res, next) { - let baseHeaders = "X-Requested-With, X-Prototype-Version, X-CSRF-Token"; + const headers = [ + 'X-Requested-With', + 'X-Prototype-Version', + 'X-CSRF-Token' + ]; - if(extraHeaders) { - baseHeaders += ", " + extraHeaders; + if (req.method === 'OPTIONS') { + headers.push('Content-Type'); } res.set("Access-Control-Allow-Origin", "*"); - res.set("Access-Control-Allow-Headers", baseHeaders); + res.set("Access-Control-Allow-Headers", headers.join(', ')); next(); }; From f1e421db05b1d1cda9c20883d012d2e79b502d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 3 Apr 2018 19:08:56 +0200 Subject: [PATCH 27/54] Create an api router isolated from heath checks --- lib/cartodb/controllers/factory.js | 60 ++-------------------- lib/cartodb/server.js | 77 ++++++++++++++++++++++++---- test/acceptance/multilayer_server.js | 1 + test/acceptance/templates.js | 2 + 4 files changed, 74 insertions(+), 66 deletions(-) diff --git a/lib/cartodb/controllers/factory.js b/lib/cartodb/controllers/factory.js index ce341fbd..4826d726 100644 --- a/lib/cartodb/controllers/factory.js +++ b/lib/cartodb/controllers/factory.js @@ -55,8 +55,6 @@ const TileTemplateController = require('./template/tile'); const AnalysesController = require('./analyses'); -const ServerInfoController = require('./server-info'); - module.exports = class ControllersFactory { constructor ({ serverOptions, environmentOptions }) { const redisOptions = Object.assign({}, environmentOptions.redis, { @@ -155,8 +153,6 @@ module.exports = class ControllersFactory { templateMaps.on(eventType, namedMapProviderCache.invalidate.bind(namedMapProviderCache)); }); - const versions = getAndValidateVersions(serverOptions); - this.mapConfigBasePath = serverOptions.base_url_mapconfig; this.templateBasePath = serverOptions.base_url_templated; @@ -269,13 +265,12 @@ module.exports = class ControllersFactory { authApi, userLimitsApi ); - - this.serverInfoController = new ServerInfoController(versions); } - regist (app) { + regist (api) { + // FIXME: we need a better way to reset cache while running tests if (process.env.NODE_ENV === 'test') { - app.layergroupAffectedTablesCache = this.layergroupAffectedTablesCache; + api.layergroupAffectedTablesCache = this.layergroupAffectedTablesCache; } const mapRouter = router(); @@ -289,7 +284,7 @@ module.exports = class ControllersFactory { this.previewTemplateController.register(mapRouter); this.analysesController.register(mapRouter); - app.use(this.mapConfigBasePath, mapRouter); + api.use(this.mapConfigBasePath, mapRouter); const templateRouter = router(); @@ -297,13 +292,7 @@ module.exports = class ControllersFactory { this.tileTemplateController.register(templateRouter); this.adminTemplateController.register(templateRouter); - app.use(this.templateBasePath, templateRouter); - - const monitorRouter = router(); - - this.serverInfoController.register(monitorRouter); - - app.use('/', monitorRouter); + api.use(this.templateBasePath, templateRouter); } }; @@ -405,42 +394,3 @@ function createRendererFactory ({ redisPool, serverOptions, environmentOptions } return rendererFactory; } - -function getAndValidateVersions(options) { - // jshint undef:false - var warn = console.warn.bind(console); - // jshint undef:true - - var packageDefinition = require('../../../package.json'); - - var declaredDependencies = packageDefinition.dependencies || {}; - var installedDependenciesVersions = { - camshaft: require('camshaft').version, - grainstore: windshaft.grainstore.version(), - mapnik: windshaft.mapnik.versions.mapnik, - node_mapnik: windshaft.mapnik.version, - 'turbo-carto': require('turbo-carto').version, - windshaft: windshaft.version, - windshaft_cartodb: packageDefinition.version - }; - - var dependenciesToValidate = ['camshaft', 'turbo-carto', 'windshaft']; - dependenciesToValidate.forEach(function(depName) { - var declaredDependencyVersion = declaredDependencies[depName]; - var installedDependencyVersion = installedDependenciesVersions[depName]; - if (declaredDependencyVersion !== installedDependencyVersion) { - warn( - 'Dependency="%s" installed version="%s" does not match declared version="%s". Check your installation.', - depName, installedDependencyVersion, declaredDependencyVersion - ); - } - }); - - // Be nice and warn if configured mapnik version is != installed mapnik version - if (windshaft.mapnik.versions.mapnik !== options.grainstore.mapnik_version) { - warn('WARNING: detected mapnik version (' + windshaft.mapnik.versions.mapnik + ')' + - ' != configured mapnik version (' + options.grainstore.mapnik_version + ')'); - } - - return installedDependenciesVersions; -} diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 25193a7e..87bc2e9f 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -1,6 +1,7 @@ const _ = require('underscore'); const express = require('express'); -const { mapnik } = require('windshaft'); +const windshaft = require('windshaft'); +const { mapnik } = windshaft; const jsonReplacer = require('./utils/json-replacer'); @@ -13,6 +14,7 @@ const cors = require('./middleware/cors'); const user = require('./middleware/user'); const ControllersFactory = require('./controllers/factory'); +const ServerInfoController = require('./controllers/server-info'); const syntaxError = require('./middleware/syntax-error'); const errorMiddleware = require('./middleware/error-middleware'); @@ -36,23 +38,37 @@ module.exports = function createServer (serverOptions) { app.disable('etag'); app.set('json replacer', jsonReplacer()); - app.use(logger(serverOptions)); - app.use(bodyParser.json()); - app.use(servedByHostHeader()); - app.use(stats({ + const api = express.Router(); + + api.use(logger(serverOptions)); + api.use(bodyParser.json()); + api.use(servedByHostHeader()); + api.use(stats({ enabled: serverOptions.useProfiler, statsClient: global.statsClient })); - app.use(lzmaMiddleware()); - app.use(cors()); - app.use(user()); + api.use(lzmaMiddleware()); + api.use(cors()); + api.use(user()); const controllers = new ControllersFactory({ serverOptions, environmentOptions: global.environment }); - controllers.regist(app); + controllers.regist(api); - app.use(syntaxError()); - app.use(errorMiddleware()); + api.use(syntaxError()); + api.use(errorMiddleware()); + + app.use('/', api); + + const versions = getAndValidateVersions(serverOptions); + const serverInfoController = new ServerInfoController(versions); + + serverInfoController.register(app); + + // FIXME: we need a better way to reset cache while running tests + if (process.env.NODE_ENV === 'test') { + app.layergroupAffectedTablesCache = api.layergroupAffectedTablesCache; + } return app; }; @@ -78,3 +94,42 @@ function bootstrapFonts(opts) { function mapnikVersion(opts) { return opts.grainstore.mapnik_version || mapnik.versions.mapnik; } + +function getAndValidateVersions(options) { + // jshint undef:false + var warn = console.warn.bind(console); + // jshint undef:true + + var packageDefinition = require('../../package.json'); + + var declaredDependencies = packageDefinition.dependencies || {}; + var installedDependenciesVersions = { + camshaft: require('camshaft').version, + grainstore: windshaft.grainstore.version(), + mapnik: windshaft.mapnik.versions.mapnik, + node_mapnik: windshaft.mapnik.version, + 'turbo-carto': require('turbo-carto').version, + windshaft: windshaft.version, + windshaft_cartodb: packageDefinition.version + }; + + var dependenciesToValidate = ['camshaft', 'turbo-carto', 'windshaft']; + dependenciesToValidate.forEach(function(depName) { + var declaredDependencyVersion = declaredDependencies[depName]; + var installedDependencyVersion = installedDependenciesVersions[depName]; + if (declaredDependencyVersion !== installedDependencyVersion) { + warn( + 'Dependency="%s" installed version="%s" does not match declared version="%s". Check your installation.', + depName, installedDependencyVersion, declaredDependencyVersion + ); + } + }); + + // Be nice and warn if configured mapnik version is != installed mapnik version + if (windshaft.mapnik.versions.mapnik !== options.grainstore.mapnik_version) { + warn('WARNING: detected mapnik version (' + windshaft.mapnik.versions.mapnik + ')' + + ' != configured mapnik version (' + options.grainstore.mapnik_version + ')'); + } + + return installedDependenciesVersions; +} diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index 2131fd1a..3e3bbcc0 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -369,6 +369,7 @@ describe('tests from old api translated to multilayer', function() { }; // reset internal cacheChannel cache + // FIXME: we need a better way to reset cache while running tests server.layergroupAffectedTablesCache.cache.reset(); assert.response(server, diff --git a/test/acceptance/templates.js b/test/acceptance/templates.js index 92a95f60..0234059b 100644 --- a/test/acceptance/templates.js +++ b/test/acceptance/templates.js @@ -26,6 +26,7 @@ server.setMaxListeners(0); var LayergroupToken = require('../../lib/cartodb/models/layergroup-token'); describe('template_api', function() { + // FIXME: we need a better way to reset cache while running tests server.layergroupAffectedTablesCache.cache.reset(); var httpRendererResourcesServer; @@ -1056,6 +1057,7 @@ describe('template_api', function() { assert.ok(cc); assert.equal(cc, expectedCC); // hack simulating restart... + // FIXME: we need a better way to reset cache while running tests server.layergroupAffectedTablesCache.cache.reset(); // need to clean channel cache var get_request = { url: '/api/v1/map/' + layergroupid + ':cb1/0/0/0/1.json.torque?auth_token=valid1', From 93bdbb1c505cb71cd4f9988c80ba9470236aa810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 3 Apr 2018 19:16:37 +0200 Subject: [PATCH 28/54] Create monitor monitor router --- lib/cartodb/server.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 87bc2e9f..e844f4f4 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -60,10 +60,14 @@ module.exports = function createServer (serverOptions) { app.use('/', api); + const monitor = express.Router(); + const versions = getAndValidateVersions(serverOptions); const serverInfoController = new ServerInfoController(versions); - serverInfoController.register(app); + serverInfoController.register(monitor); + + app.use('/', monitor); // FIXME: we need a better way to reset cache while running tests if (process.env.NODE_ENV === 'test') { From cfdff61d0844b7f82e73e9e14202aa06507e72a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 4 Apr 2018 15:52:54 +0200 Subject: [PATCH 29/54] Create map & template routers to skip unneeded middlewares in monitor endpoints --- lib/cartodb/controllers/factory.js | 150 +++---------------- lib/cartodb/controllers/map-router.js | 160 +++++++++++++++++++++ lib/cartodb/controllers/template-router.js | 92 ++++++++++++ lib/cartodb/server.js | 45 +----- 4 files changed, 271 insertions(+), 176 deletions(-) create mode 100644 lib/cartodb/controllers/map-router.js create mode 100644 lib/cartodb/controllers/template-router.js diff --git a/lib/cartodb/controllers/factory.js b/lib/cartodb/controllers/factory.js index 4826d726..4e4365e1 100644 --- a/lib/cartodb/controllers/factory.js +++ b/lib/cartodb/controllers/factory.js @@ -1,5 +1,3 @@ -const { Router: router } = require('express'); - const RedisPool = require('redis-mpool'); const cartodbRedis = require('cartodb-redis'); @@ -40,23 +38,13 @@ const ResourceLocator = require('../models/resource-locator'); const LayergroupMetadata = require('../utils/layergroup-metadata'); const RendererStatsReporter = require('../stats/reporter/renderer'); -const AnalysisLayergroupController = require('./layergroup/analysis'); -const AttributesLayergroupController = require('./layergroup/attributes'); -const DataviewLayergroupController = require('./layergroup/dataview'); -const PreviewLayergroupController = require('./layergroup/preview'); -const TileLayergroupController = require('./layergroup/tile'); - -const AnonymousMapController = require('./map/anonymous'); -const NamedMapController = require('./map/named'); - -const AdminTemplateController = require('./template/admin'); -const PreviewTemplateController = require('./template/preview'); -const TileTemplateController = require('./template/tile'); - -const AnalysesController = require('./analyses'); +const MapRouter = require('./map-router'); +const TemplateRouter = require('./template-router'); module.exports = class ControllersFactory { constructor ({ serverOptions, environmentOptions }) { + this.serverOptions = serverOptions; + const redisOptions = Object.assign({}, environmentOptions.redis, { name: 'windshaft-server', unwatchOnRelease: false, @@ -65,7 +53,7 @@ module.exports = class ControllersFactory { const redisPool = new RedisPool(redisOptions); - redisPool.on('status', function(status) { + redisPool.on('status', function (status) { var keyPrefix = 'windshaft.redis-pool.' + status.name + '.db' + status.db + '.'; global.statsClient.gauge(keyPrefix + 'count', status.count); global.statsClient.gauge(keyPrefix + 'unused', status.unused); @@ -153,146 +141,40 @@ module.exports = class ControllersFactory { templateMaps.on(eventType, namedMapProviderCache.invalidate.bind(namedMapProviderCache)); }); - this.mapConfigBasePath = serverOptions.base_url_mapconfig; - this.templateBasePath = serverOptions.base_url_templated; - - this.analysisLayergroupController = new AnalysisLayergroupController( + const collaborators = { analysisStatusBackend, - pgConnection, - mapStore, - userLimitsApi, - layergroupAffectedTablesCache, - authApi, - surrogateKeysCache - ); - - this.attributesLayergroupController = new AttributesLayergroupController( attributesBackend, - pgConnection, - mapStore, - userLimitsApi, - layergroupAffectedTablesCache, - authApi, - surrogateKeysCache - ); - - this.dataviewLayergroupController = new DataviewLayergroupController( dataviewBackend, - pgConnection, - mapStore, - userLimitsApi, - layergroupAffectedTablesCache, - authApi, - surrogateKeysCache - ); - - this.previewLayergroupController = new PreviewLayergroupController( previewBackend, - pgConnection, - mapStore, - userLimitsApi, - layergroupAffectedTablesCache, - authApi, - surrogateKeysCache - ); - - this.tileLayergroupController = new TileLayergroupController( tileBackend, pgConnection, mapStore, userLimitsApi, layergroupAffectedTablesCache, authApi, - surrogateKeysCache - ); - - this.anonymousMapController = new AnonymousMapController( - pgConnection, + surrogateKeysCache, templateMaps, mapBackend, metadataBackend, - surrogateKeysCache, - userLimitsApi, - layergroupAffectedTablesCache, mapConfigAdapter, statsBackend, - authApi, - layergroupMetadata - ); - - this.namedMapController = new NamedMapController( - pgConnection, - templateMaps, - mapBackend, - metadataBackend, - surrogateKeysCache, - userLimitsApi, - layergroupAffectedTablesCache, - mapConfigAdapter, - statsBackend, - authApi, - layergroupMetadata - ); - - this.tileTemplateController = new TileTemplateController( + layergroupMetadata, namedMapProviderCache, - tileBackend, - surrogateKeysCache, - pgConnection, - authApi, - userLimitsApi - ); + tablesExtentApi + }; - this.previewTemplateController = new PreviewTemplateController( - namedMapProviderCache, - previewBackend, - surrogateKeysCache, - tablesExtentApi, - metadataBackend, - pgConnection, - authApi, - userLimitsApi - ); - - this.adminTemplateController = new AdminTemplateController( - authApi, - templateMaps, - userLimitsApi - ); - - this.analysesController = new AnalysesController( - pgConnection, - authApi, - userLimitsApi - ); + this.mapRouter = new MapRouter({ collaborators, serverOptions }); + this.templateRouter = new TemplateRouter({ collaborators, serverOptions }); } - regist (api) { + register (app) { // FIXME: we need a better way to reset cache while running tests if (process.env.NODE_ENV === 'test') { - api.layergroupAffectedTablesCache = this.layergroupAffectedTablesCache; + app.layergroupAffectedTablesCache = this.layergroupAffectedTablesCache; } - const mapRouter = router(); - - this.analysisLayergroupController.register(mapRouter); - this.attributesLayergroupController.register(mapRouter); - this.dataviewLayergroupController.register(mapRouter); - this.previewLayergroupController.register(mapRouter); - this.tileLayergroupController.register(mapRouter); - this.anonymousMapController.register(mapRouter); - this.previewTemplateController.register(mapRouter); - this.analysesController.register(mapRouter); - - api.use(this.mapConfigBasePath, mapRouter); - - const templateRouter = router(); - - this.namedMapController.register(templateRouter); - this.tileTemplateController.register(templateRouter); - this.adminTemplateController.register(templateRouter); - - api.use(this.templateBasePath, templateRouter); + this.mapRouter.register(app); + this.templateRouter.register(app); } }; diff --git a/lib/cartodb/controllers/map-router.js b/lib/cartodb/controllers/map-router.js new file mode 100644 index 00000000..0b72572d --- /dev/null +++ b/lib/cartodb/controllers/map-router.js @@ -0,0 +1,160 @@ +const { Router: router } = require('express'); + +const logger = require('../middleware/logger'); +const bodyParser = require('body-parser'); +const servedByHostHeader = require('../middleware/served-by-host-header'); +const stats = require('../middleware/stats'); +const lzmaMiddleware = require('../middleware/lzma'); +const cors = require('../middleware/cors'); +const user = require('../middleware/user'); +const syntaxError = require('../middleware/syntax-error'); +const errorMiddleware = require('../middleware/error-middleware'); + +const AnalysisLayergroupController = require('./layergroup/analysis'); +const AttributesLayergroupController = require('./layergroup/attributes'); +const DataviewLayergroupController = require('./layergroup/dataview'); +const PreviewLayergroupController = require('./layergroup/preview'); +const TileLayergroupController = require('./layergroup/tile'); +const AnonymousMapController = require('./map/anonymous'); +const PreviewTemplateController = require('./template/preview'); +const AnalysesController = require('./analyses'); + +module.exports = class MapRouter { + constructor ({ collaborators, serverOptions }) { + this.serverOptions = serverOptions; + + const { + analysisStatusBackend, + attributesBackend, + dataviewBackend, + previewBackend, + tileBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache, + templateMaps, + mapBackend, + metadataBackend, + mapConfigAdapter, + statsBackend, + layergroupMetadata, + namedMapProviderCache, + tablesExtentApi + } = collaborators; + + this.analysisLayergroupController = new AnalysisLayergroupController( + analysisStatusBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.attributesLayergroupController = new AttributesLayergroupController( + attributesBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.dataviewLayergroupController = new DataviewLayergroupController( + dataviewBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.previewLayergroupController = new PreviewLayergroupController( + previewBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.tileLayergroupController = new TileLayergroupController( + tileBackend, + pgConnection, + mapStore, + userLimitsApi, + layergroupAffectedTablesCache, + authApi, + surrogateKeysCache + ); + + this.anonymousMapController = new AnonymousMapController( + pgConnection, + templateMaps, + mapBackend, + metadataBackend, + surrogateKeysCache, + userLimitsApi, + layergroupAffectedTablesCache, + mapConfigAdapter, + statsBackend, + authApi, + layergroupMetadata + ); + + this.previewTemplateController = new PreviewTemplateController( + namedMapProviderCache, + previewBackend, + surrogateKeysCache, + tablesExtentApi, + metadataBackend, + pgConnection, + authApi, + userLimitsApi + ); + + this.analysesController = new AnalysesController( + pgConnection, + authApi, + userLimitsApi + ); + } + + register (app) { + const mapConfigBasePath = this.serverOptions.base_url_mapconfig; + + const mapRouter = router(); + + mapRouter.use(logger(this.serverOptions)); + mapRouter.use(bodyParser.json()); + mapRouter.use(servedByHostHeader()); + mapRouter.use(stats({ + enabled: this.serverOptions.useProfiler, + statsClient: global.statsClient + })); + mapRouter.use(lzmaMiddleware()); + mapRouter.use(cors()); + mapRouter.use(user()); + + this.analysisLayergroupController.register(mapRouter); + this.attributesLayergroupController.register(mapRouter); + this.dataviewLayergroupController.register(mapRouter); + this.previewLayergroupController.register(mapRouter); + this.tileLayergroupController.register(mapRouter); + this.anonymousMapController.register(mapRouter); + this.previewTemplateController.register(mapRouter); + this.analysesController.register(mapRouter); + + mapRouter.use(syntaxError()); + mapRouter.use(errorMiddleware()); + + app.use(mapConfigBasePath, mapRouter); + } +}; diff --git a/lib/cartodb/controllers/template-router.js b/lib/cartodb/controllers/template-router.js new file mode 100644 index 00000000..b7334c9b --- /dev/null +++ b/lib/cartodb/controllers/template-router.js @@ -0,0 +1,92 @@ +const { Router: router } = require('express'); + +const logger = require('../middleware/logger'); +const bodyParser = require('body-parser'); +const servedByHostHeader = require('../middleware/served-by-host-header'); +const stats = require('../middleware/stats'); +const lzmaMiddleware = require('../middleware/lzma'); +const cors = require('../middleware/cors'); +const user = require('../middleware/user'); +const syntaxError = require('../middleware/syntax-error'); +const errorMiddleware = require('../middleware/error-middleware'); + +const NamedMapController = require('./map/named'); +const AdminTemplateController = require('./template/admin'); +const TileTemplateController = require('./template/tile'); + +module.exports = class TemplateRouter { + constructor ({ collaborators, serverOptions }) { + this.serverOptions = serverOptions; + + const { + pgConnection, + templateMaps, + mapBackend, + metadataBackend, + surrogateKeysCache, + userLimitsApi, + layergroupAffectedTablesCache, + mapConfigAdapter, + statsBackend, + authApi, + layergroupMetadata, + namedMapProviderCache, + tileBackend, + } = collaborators; + + this.namedMapController = new NamedMapController( + pgConnection, + templateMaps, + mapBackend, + metadataBackend, + surrogateKeysCache, + userLimitsApi, + layergroupAffectedTablesCache, + mapConfigAdapter, + statsBackend, + authApi, + layergroupMetadata + ); + + this.tileTemplateController = new TileTemplateController( + namedMapProviderCache, + tileBackend, + surrogateKeysCache, + pgConnection, + authApi, + userLimitsApi + ); + + this.adminTemplateController = new AdminTemplateController( + authApi, + templateMaps, + userLimitsApi + ); + } + + register (app) { + const templateBasePath = this.serverOptions.base_url_templated; + + const templateRouter = router(); + + templateRouter.use(logger(this.serverOptions)); + templateRouter.use(bodyParser.json()); + templateRouter.use(servedByHostHeader()); + templateRouter.use(stats({ + enabled: this.serverOptions.useProfiler, + statsClient: global.statsClient + })); + templateRouter.use(lzmaMiddleware()); + templateRouter.use(cors()); + templateRouter.use(user()); + + this.namedMapController.register(templateRouter); + this.tileTemplateController.register(templateRouter); + this.adminTemplateController.register(templateRouter); + + templateRouter.use(syntaxError()); + templateRouter.use(errorMiddleware()); + + app.use(templateBasePath, templateRouter); + } +}; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index e844f4f4..847b7090 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -5,20 +5,9 @@ const { mapnik } = windshaft; const jsonReplacer = require('./utils/json-replacer'); -const logger = require('./middleware/logger'); -const bodyParser = require('body-parser'); -const servedByHostHeader = require('./middleware/served-by-host-header'); -const stats = require('./middleware/stats'); -const lzmaMiddleware = require('./middleware/lzma'); -const cors = require('./middleware/cors'); -const user = require('./middleware/user'); - const ControllersFactory = require('./controllers/factory'); const ServerInfoController = require('./controllers/server-info'); -const syntaxError = require('./middleware/syntax-error'); -const errorMiddleware = require('./middleware/error-middleware'); - const StatsClient = require('./stats/client'); module.exports = function createServer (serverOptions) { @@ -38,41 +27,13 @@ module.exports = function createServer (serverOptions) { app.disable('etag'); app.set('json replacer', jsonReplacer()); - const api = express.Router(); - - api.use(logger(serverOptions)); - api.use(bodyParser.json()); - api.use(servedByHostHeader()); - api.use(stats({ - enabled: serverOptions.useProfiler, - statsClient: global.statsClient - })); - api.use(lzmaMiddleware()); - api.use(cors()); - api.use(user()); - const controllers = new ControllersFactory({ serverOptions, environmentOptions: global.environment }); - - controllers.regist(api); - - api.use(syntaxError()); - api.use(errorMiddleware()); - - app.use('/', api); - - const monitor = express.Router(); + controllers.register(app); const versions = getAndValidateVersions(serverOptions); + const serverInfoController = new ServerInfoController(versions); - - serverInfoController.register(monitor); - - app.use('/', monitor); - - // FIXME: we need a better way to reset cache while running tests - if (process.env.NODE_ENV === 'test') { - app.layergroupAffectedTablesCache = api.layergroupAffectedTablesCache; - } + serverInfoController.register(app); return app; }; From ef22c46199233058ed624ce65eecdc4829ff7703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 4 Apr 2018 19:15:51 +0200 Subject: [PATCH 30/54] Make send-response middleware generic to the router --- lib/cartodb/controllers/analyses.js | 2 -- lib/cartodb/controllers/factory.js | 2 +- lib/cartodb/controllers/layergroup/analysis.js | 4 +--- .../controllers/layergroup/attributes.js | 4 +--- lib/cartodb/controllers/layergroup/dataview.js | 13 ++++--------- lib/cartodb/controllers/layergroup/preview.js | 7 ++----- lib/cartodb/controllers/layergroup/tile.js | 18 ++++++++---------- lib/cartodb/controllers/map-router.js | 2 ++ lib/cartodb/controllers/map/anonymous.js | 2 -- lib/cartodb/controllers/map/named.js | 2 -- lib/cartodb/controllers/template-router.js | 2 ++ lib/cartodb/controllers/template/admin.js | 16 +++++----------- lib/cartodb/controllers/template/preview.js | 4 +--- lib/cartodb/controllers/template/tile.js | 2 -- 14 files changed, 27 insertions(+), 53 deletions(-) diff --git a/lib/cartodb/controllers/analyses.js b/lib/cartodb/controllers/analyses.js index 9c0e915c..cc6dd3a6 100644 --- a/lib/cartodb/controllers/analyses.js +++ b/lib/cartodb/controllers/analyses.js @@ -6,7 +6,6 @@ const dbConnSetup = require('../middleware/db-conn-setup'); const rateLimit = require('../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const cacheControlHeader = require('../middleware/cache-control-header'); -const sendResponse = require('../middleware/send-response'); const dbParamsFromResLocals = require('../utils/database-params'); function AnalysesController(pgConnection, authApi, userLimitsApi) { @@ -30,7 +29,6 @@ AnalysesController.prototype.register = function (mapRouter) { getDataFromQuery({ queryTemplate: tablesQueryTpl, key: 'tables' }), prepareResponse(), cacheControlHeader({ ttl: 10, revalidate: true }), - sendResponse(), unauthorizedError() ); }; diff --git a/lib/cartodb/controllers/factory.js b/lib/cartodb/controllers/factory.js index 4e4365e1..33d76c2a 100644 --- a/lib/cartodb/controllers/factory.js +++ b/lib/cartodb/controllers/factory.js @@ -173,8 +173,8 @@ module.exports = class ControllersFactory { app.layergroupAffectedTablesCache = this.layergroupAffectedTablesCache; } - this.mapRouter.register(app); this.templateRouter.register(app); + this.mapRouter.register(app); } }; diff --git a/lib/cartodb/controllers/layergroup/analysis.js b/lib/cartodb/controllers/layergroup/analysis.js index 30371950..36f20991 100644 --- a/lib/cartodb/controllers/layergroup/analysis.js +++ b/lib/cartodb/controllers/layergroup/analysis.js @@ -5,7 +5,6 @@ const dbConnSetup = require('../../middleware/db-conn-setup'); const authorize = require('../../middleware/authorize'); const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; -const sendResponse = require('../../middleware/send-response'); const dbParamsFromResLocals = require('../../utils/database-params'); module.exports = class AnalysisLayergroupController { @@ -36,8 +35,7 @@ module.exports = class AnalysisLayergroupController { dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS), cleanUpQueryParams(), - analysisNodeStatus(this.analysisStatusBackend), - sendResponse() + analysisNodeStatus(this.analysisStatusBackend) ); } diff --git a/lib/cartodb/controllers/layergroup/attributes.js b/lib/cartodb/controllers/layergroup/attributes.js index 9e1aa24f..c4c5af38 100644 --- a/lib/cartodb/controllers/layergroup/attributes.js +++ b/lib/cartodb/controllers/layergroup/attributes.js @@ -10,7 +10,6 @@ const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); -const sendResponse = require('../../middleware/send-response'); module.exports = class AttributesLayergroupController { constructor ( @@ -50,8 +49,7 @@ module.exports = class AttributesLayergroupController { cacheControlHeader(), cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - sendResponse() + lastModifiedHeader() ); } }; diff --git a/lib/cartodb/controllers/layergroup/dataview.js b/lib/cartodb/controllers/layergroup/dataview.js index 04390d23..c13e0eaa 100644 --- a/lib/cartodb/controllers/layergroup/dataview.js +++ b/lib/cartodb/controllers/layergroup/dataview.js @@ -10,7 +10,6 @@ const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); -const sendResponse = require('../../middleware/send-response'); const ALLOWED_DATAVIEW_QUERY_PARAMS = [ 'filters', // json @@ -68,8 +67,7 @@ module.exports = class DataviewLayergroupController { cacheControlHeader(), cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - sendResponse() + lastModifiedHeader() ); mapRouter.get( @@ -90,8 +88,7 @@ module.exports = class DataviewLayergroupController { cacheControlHeader(), cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - sendResponse() + lastModifiedHeader() ); mapRouter.get( @@ -112,8 +109,7 @@ module.exports = class DataviewLayergroupController { cacheControlHeader(), cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - sendResponse() + lastModifiedHeader() ); mapRouter.get( @@ -134,8 +130,7 @@ module.exports = class DataviewLayergroupController { cacheControlHeader(), cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - sendResponse() + lastModifiedHeader() ); } }; diff --git a/lib/cartodb/controllers/layergroup/preview.js b/lib/cartodb/controllers/layergroup/preview.js index 1918fd72..8885e45c 100644 --- a/lib/cartodb/controllers/layergroup/preview.js +++ b/lib/cartodb/controllers/layergroup/preview.js @@ -10,7 +10,6 @@ const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); -const sendResponse = require('../../middleware/send-response'); module.exports = class PreviewLayergroupController { constructor ( @@ -53,8 +52,7 @@ module.exports = class PreviewLayergroupController { cacheControlHeader(), cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - sendResponse() + lastModifiedHeader() ); mapRouter.get( @@ -76,8 +74,7 @@ module.exports = class PreviewLayergroupController { cacheControlHeader(), cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - sendResponse() + lastModifiedHeader() ); } }; diff --git a/lib/cartodb/controllers/layergroup/tile.js b/lib/cartodb/controllers/layergroup/tile.js index 39c0e5f7..17c35377 100644 --- a/lib/cartodb/controllers/layergroup/tile.js +++ b/lib/cartodb/controllers/layergroup/tile.js @@ -10,7 +10,6 @@ const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); -const sendResponse = require('../../middleware/send-response'); const vectorError = require('../../middleware/vector-error'); const SUPPORTED_FORMATS = { @@ -42,8 +41,10 @@ module.exports = class TileLayergroupController { } register (mapRouter) { + const number = (param) => `${param}(-?\\d+)`; + mapRouter.get( - `/:token/:z/:x/:y@:scale_factor?x.:format`, + `/:token/:${number('z')}/:${number('x')}/:${number('y')}@:${number('scale_factor')}?x.:format`, layergroupToken(), credentials(), authorize(this.authApi), @@ -64,12 +65,11 @@ module.exports = class TileLayergroupController { incrementSuccessMetrics(global.statsClient), incrementErrorMetrics(global.statsClient), tileError(), - vectorError(), - sendResponse() + vectorError() ); mapRouter.get( - `/:token/:z/:x/:y.:format`, + `/:token/:${number('z')}/:${number('x')}/:${number('y')}.:format`, layergroupToken(), credentials(), authorize(this.authApi), @@ -90,12 +90,11 @@ module.exports = class TileLayergroupController { incrementSuccessMetrics(global.statsClient), incrementErrorMetrics(global.statsClient), tileError(), - vectorError(), - sendResponse() + vectorError() ); mapRouter.get( - `/:token/:layer/:z/:x/:y.(:format)`, + `/:token/:layer/:${number('z')}/:${number('x')}/:${number('y')}.(:format)`, distinguishLayergroupFromStaticRoute(), layergroupToken(), credentials(), @@ -117,8 +116,7 @@ module.exports = class TileLayergroupController { incrementSuccessMetrics(global.statsClient), incrementErrorMetrics(global.statsClient), tileError(), - vectorError(), - sendResponse() + vectorError() ); } }; diff --git a/lib/cartodb/controllers/map-router.js b/lib/cartodb/controllers/map-router.js index 0b72572d..5cc2bc7b 100644 --- a/lib/cartodb/controllers/map-router.js +++ b/lib/cartodb/controllers/map-router.js @@ -7,6 +7,7 @@ const stats = require('../middleware/stats'); const lzmaMiddleware = require('../middleware/lzma'); const cors = require('../middleware/cors'); const user = require('../middleware/user'); +const sendResponse = require('../middleware/send-response'); const syntaxError = require('../middleware/syntax-error'); const errorMiddleware = require('../middleware/error-middleware'); @@ -152,6 +153,7 @@ module.exports = class MapRouter { this.previewTemplateController.register(mapRouter); this.analysesController.register(mapRouter); + mapRouter.use(sendResponse()); mapRouter.use(syntaxError()); mapRouter.use(errorMiddleware()); diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/controllers/map/anonymous.js index 9575eead..433da3e4 100644 --- a/lib/cartodb/controllers/map/anonymous.js +++ b/lib/cartodb/controllers/map/anonymous.js @@ -18,7 +18,6 @@ const layerStats = require('./middlewares/layer-stats'); const layergroupIdHeader = require('./middlewares/layergroup-id-header'); const layergroupMetadata = require('./middlewares/layergroup-metadata'); const mapError = require('./middlewares/map-error'); -const sendResponse = require('../../middleware/send-response'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; @@ -103,7 +102,6 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { layerStats(this.pgConnection, this.statsBackend), layergroupIdHeader(this.templateMaps, useTemplateHash), layergroupMetadata(this.layergroupMetadata, includeQuery), - sendResponse(), mapError({ label, addContext }) ]; }; diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/controllers/map/named.js index 4c99fc09..2258b62f 100644 --- a/lib/cartodb/controllers/map/named.js +++ b/lib/cartodb/controllers/map/named.js @@ -15,7 +15,6 @@ const layerStats = require('./middlewares/layer-stats'); const layergroupIdHeader = require('./middlewares/layergroup-id-header'); const layergroupMetadata = require('./middlewares/layergroup-metadata'); const mapError = require('./middlewares/map-error'); -const sendResponse = require('../../middleware/send-response'); const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); const rateLimit = require('../../middleware/rate-limit'); @@ -114,7 +113,6 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () layerStats(this.pgConnection, this.statsBackend), layergroupIdHeader(this.templateMaps ,useTemplateHash), layergroupMetadata(this.layergroupMetadata, includeQuery), - sendResponse(), mapError({ label, addContext }) ]; }; diff --git a/lib/cartodb/controllers/template-router.js b/lib/cartodb/controllers/template-router.js index b7334c9b..50287b43 100644 --- a/lib/cartodb/controllers/template-router.js +++ b/lib/cartodb/controllers/template-router.js @@ -7,6 +7,7 @@ const stats = require('../middleware/stats'); const lzmaMiddleware = require('../middleware/lzma'); const cors = require('../middleware/cors'); const user = require('../middleware/user'); +const sendResponse = require('../middleware/send-response'); const syntaxError = require('../middleware/syntax-error'); const errorMiddleware = require('../middleware/error-middleware'); @@ -84,6 +85,7 @@ module.exports = class TemplateRouter { this.tileTemplateController.register(templateRouter); this.adminTemplateController.register(templateRouter); + templateRouter.use(sendResponse()); templateRouter.use(syntaxError()); templateRouter.use(errorMiddleware()); diff --git a/lib/cartodb/controllers/template/admin.js b/lib/cartodb/controllers/template/admin.js index d91ca9fd..169f6b20 100644 --- a/lib/cartodb/controllers/template/admin.js +++ b/lib/cartodb/controllers/template/admin.js @@ -2,7 +2,6 @@ const { templateName } = require('../../backends/template_maps'); const credentials = require('../../middleware/credentials'); const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; -const sendResponse = require('../../middleware/send-response'); /** * @param {AuthApi} authApi @@ -27,8 +26,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { authorizedByAPIKey({ authApi: this.authApi, action: 'create', label: 'POST TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_CREATE), checkContentType({ action: 'POST', label: 'POST TEMPLATE' }), - createTemplate({ templateMaps: this.templateMaps }), - sendResponse() + createTemplate({ templateMaps: this.templateMaps }) ); templateRouter.put( @@ -37,8 +35,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { authorizedByAPIKey({ authApi: this.authApi, action: 'update', label: 'PUT TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_UPDATE), checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }), - updateTemplate({ templateMaps: this.templateMaps }), - sendResponse() + updateTemplate({ templateMaps: this.templateMaps }) ); templateRouter.get( @@ -46,8 +43,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { credentials(), authorizedByAPIKey({ authApi: this.authApi, action: 'get', label: 'GET TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_GET), - retrieveTemplate({ templateMaps: this.templateMaps }), - sendResponse() + retrieveTemplate({ templateMaps: this.templateMaps }) ); templateRouter.delete( @@ -55,8 +51,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { credentials(), authorizedByAPIKey({ authApi: this.authApi, action: 'delete', label: 'DELETE TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_DELETE), - destroyTemplate({ templateMaps: this.templateMaps }), - sendResponse() + destroyTemplate({ templateMaps: this.templateMaps }) ); templateRouter.get( @@ -64,8 +59,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { credentials(), authorizedByAPIKey({ authApi: this.authApi, action: 'list', label: 'GET TEMPLATE LIST' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_LIST), - listTemplates({ templateMaps: this.templateMaps }), - sendResponse() + listTemplates({ templateMaps: this.templateMaps }) ); }; diff --git a/lib/cartodb/controllers/template/preview.js b/lib/cartodb/controllers/template/preview.js index d1abc587..53f583de 100644 --- a/lib/cartodb/controllers/template/preview.js +++ b/lib/cartodb/controllers/template/preview.js @@ -7,7 +7,6 @@ const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); -const sendResponse = require('../../middleware/send-response'); const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; @@ -69,8 +68,7 @@ PreviewTemplateController.prototype.register = function (mapRouter) { cacheControlHeader(), cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - sendResponse() + lastModifiedHeader() ); }; diff --git a/lib/cartodb/controllers/template/tile.js b/lib/cartodb/controllers/template/tile.js index 29b7f852..86404100 100644 --- a/lib/cartodb/controllers/template/tile.js +++ b/lib/cartodb/controllers/template/tile.js @@ -7,7 +7,6 @@ const cacheControlHeader = require('../../middleware/cache-control-header'); const cacheChannelHeader = require('../../middleware/cache-channel-header'); const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); const lastModifiedHeader = require('../../middleware/last-modified-header'); -const sendResponse = require('../../middleware/send-response'); const vectorError = require('../../middleware/vector-error'); const rateLimit = require('../../middleware/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; @@ -51,7 +50,6 @@ TileTemplateController.prototype.register = function (templateRouter) { cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), lastModifiedHeader(), - sendResponse(), vectorError() ); }; From 11099c88dc759d75da15a66d9c7858b4d4fa50ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 4 Apr 2018 20:00:59 +0200 Subject: [PATCH 31/54] Improve routing via regular expressions --- lib/cartodb/controllers/layergroup/tile.js | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/lib/cartodb/controllers/layergroup/tile.js b/lib/cartodb/controllers/layergroup/tile.js index 17c35377..4008afa4 100644 --- a/lib/cartodb/controllers/layergroup/tile.js +++ b/lib/cartodb/controllers/layergroup/tile.js @@ -41,10 +41,11 @@ module.exports = class TileLayergroupController { } register (mapRouter) { - const number = (param) => `${param}(-?\\d+)`; + const number = () => `(-?\\d+)`; + const not = (val) => `(?!${val})([^\/]+?)`; mapRouter.get( - `/:token/:${number('z')}/:${number('x')}/:${number('y')}@:${number('scale_factor')}?x.:format`, + `/:token/:z${number()}/:x${number()}/:y${number()}@:scale_factor${number()}?x.:format`, layergroupToken(), credentials(), authorize(this.authApi), @@ -69,7 +70,7 @@ module.exports = class TileLayergroupController { ); mapRouter.get( - `/:token/:${number('z')}/:${number('x')}/:${number('y')}.:format`, + `/:token/:z${number()}/:x${number()}/:y${number()}.:format`, layergroupToken(), credentials(), authorize(this.authApi), @@ -94,8 +95,7 @@ module.exports = class TileLayergroupController { ); mapRouter.get( - `/:token/:layer/:${number('z')}/:${number('x')}/:${number('y')}.(:format)`, - distinguishLayergroupFromStaticRoute(), + `/:token${not('static')}/:layer/:z${number()}/:x${number()}/:y${number()}.(:format)`, layergroupToken(), credentials(), authorize(this.authApi), @@ -121,16 +121,6 @@ module.exports = class TileLayergroupController { } }; -function distinguishLayergroupFromStaticRoute () { - return function distinguishLayergroupFromStaticRouteMiddleware(req, res, next) { - if (req.params.token === 'static') { - return next('route'); - } - - next(); - }; -} - function parseFormat (format = '') { const prettyFormat = format.replace('.', '_'); return SUPPORTED_FORMATS[prettyFormat] ? prettyFormat : 'invalid'; From 5aa63d35ce0eb594f53dfddcfa4986e1de48d1a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 4 Apr 2018 20:07:53 +0200 Subject: [PATCH 32/54] Add comments --- lib/cartodb/controllers/layergroup/tile.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/cartodb/controllers/layergroup/tile.js b/lib/cartodb/controllers/layergroup/tile.js index 4008afa4..7837d116 100644 --- a/lib/cartodb/controllers/layergroup/tile.js +++ b/lib/cartodb/controllers/layergroup/tile.js @@ -41,7 +41,9 @@ module.exports = class TileLayergroupController { } register (mapRouter) { + // REGEXP matches with positive and negative numnbers const number = () => `(-?\\d+)`; + // REGEXP doesn't match with `val` const not = (val) => `(?!${val})([^\/]+?)`; mapRouter.get( From 4e754e0d865b175276cdba21c2e658ac49fe99f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Thu, 5 Apr 2018 19:42:20 +0200 Subject: [PATCH 33/54] Create API router to handle common stuff among child routers --- .../controllers/{factory.js => api-router.js} | 49 +++++++++++++++++-- lib/cartodb/controllers/map-router.js | 39 +++------------ lib/cartodb/controllers/template-router.js | 39 +++------------ lib/cartodb/server.js | 6 +-- 4 files changed, 61 insertions(+), 72 deletions(-) rename lib/cartodb/controllers/{factory.js => api-router.js} (88%) diff --git a/lib/cartodb/controllers/factory.js b/lib/cartodb/controllers/api-router.js similarity index 88% rename from lib/cartodb/controllers/factory.js rename to lib/cartodb/controllers/api-router.js index 33d76c2a..fe701985 100644 --- a/lib/cartodb/controllers/factory.js +++ b/lib/cartodb/controllers/api-router.js @@ -1,3 +1,5 @@ +const { Router: router } = require('express'); + const RedisPool = require('redis-mpool'); const cartodbRedis = require('cartodb-redis'); @@ -38,10 +40,21 @@ const ResourceLocator = require('../models/resource-locator'); const LayergroupMetadata = require('../utils/layergroup-metadata'); const RendererStatsReporter = require('../stats/reporter/renderer'); +const logger = require('../middleware/logger'); +const bodyParser = require('body-parser'); +const servedByHostHeader = require('../middleware/served-by-host-header'); +const stats = require('../middleware/stats'); +const lzmaMiddleware = require('../middleware/lzma'); +const cors = require('../middleware/cors'); +const user = require('../middleware/user'); +const sendResponse = require('../middleware/send-response'); +const syntaxError = require('../middleware/syntax-error'); +const errorMiddleware = require('../middleware/error-middleware'); + const MapRouter = require('./map-router'); const TemplateRouter = require('./template-router'); -module.exports = class ControllersFactory { +module.exports = class ApiRouter { constructor ({ serverOptions, environmentOptions }) { this.serverOptions = serverOptions; @@ -163,8 +176,8 @@ module.exports = class ControllersFactory { tablesExtentApi }; - this.mapRouter = new MapRouter({ collaborators, serverOptions }); - this.templateRouter = new TemplateRouter({ collaborators, serverOptions }); + this.mapRouter = new MapRouter({ collaborators }); + this.templateRouter = new TemplateRouter({ collaborators }); } register (app) { @@ -173,8 +186,34 @@ module.exports = class ControllersFactory { app.layergroupAffectedTablesCache = this.layergroupAffectedTablesCache; } - this.templateRouter.register(app); - this.mapRouter.register(app); + const apiRouter = router(); + + apiRouter.use(logger(this.serverOptions)); + apiRouter.use(bodyParser.json()); + apiRouter.use(servedByHostHeader()); + apiRouter.use(stats({ + enabled: this.serverOptions.useProfiler, + statsClient: global.statsClient + })); + apiRouter.use(lzmaMiddleware()); + apiRouter.use(cors()); + apiRouter.use(user()); + + this.templateRouter.register(apiRouter); + this.mapRouter.register(apiRouter); + + apiRouter.use(sendResponse()); + apiRouter.use(syntaxError()); + apiRouter.use(errorMiddleware()); + + const paths = [ + '/api/v1', + '/user/:user/api/v1', + '/tiles', + '/database/:dbname' + ]; + + app.use(`(?:${paths.join('|')})`, apiRouter); } }; diff --git a/lib/cartodb/controllers/map-router.js b/lib/cartodb/controllers/map-router.js index 5cc2bc7b..d02cd563 100644 --- a/lib/cartodb/controllers/map-router.js +++ b/lib/cartodb/controllers/map-router.js @@ -1,16 +1,5 @@ const { Router: router } = require('express'); -const logger = require('../middleware/logger'); -const bodyParser = require('body-parser'); -const servedByHostHeader = require('../middleware/served-by-host-header'); -const stats = require('../middleware/stats'); -const lzmaMiddleware = require('../middleware/lzma'); -const cors = require('../middleware/cors'); -const user = require('../middleware/user'); -const sendResponse = require('../middleware/send-response'); -const syntaxError = require('../middleware/syntax-error'); -const errorMiddleware = require('../middleware/error-middleware'); - const AnalysisLayergroupController = require('./layergroup/analysis'); const AttributesLayergroupController = require('./layergroup/attributes'); const DataviewLayergroupController = require('./layergroup/dataview'); @@ -21,9 +10,7 @@ const PreviewTemplateController = require('./template/preview'); const AnalysesController = require('./analyses'); module.exports = class MapRouter { - constructor ({ collaborators, serverOptions }) { - this.serverOptions = serverOptions; - + constructor ({ collaborators }) { const { analysisStatusBackend, attributesBackend, @@ -128,22 +115,9 @@ module.exports = class MapRouter { ); } - register (app) { - const mapConfigBasePath = this.serverOptions.base_url_mapconfig; - + register (apiRouter) { const mapRouter = router(); - mapRouter.use(logger(this.serverOptions)); - mapRouter.use(bodyParser.json()); - mapRouter.use(servedByHostHeader()); - mapRouter.use(stats({ - enabled: this.serverOptions.useProfiler, - statsClient: global.statsClient - })); - mapRouter.use(lzmaMiddleware()); - mapRouter.use(cors()); - mapRouter.use(user()); - this.analysisLayergroupController.register(mapRouter); this.attributesLayergroupController.register(mapRouter); this.dataviewLayergroupController.register(mapRouter); @@ -153,10 +127,11 @@ module.exports = class MapRouter { this.previewTemplateController.register(mapRouter); this.analysesController.register(mapRouter); - mapRouter.use(sendResponse()); - mapRouter.use(syntaxError()); - mapRouter.use(errorMiddleware()); + const paths = [ + '/map', + '/layergroup' + ]; - app.use(mapConfigBasePath, mapRouter); + apiRouter.use(`(?:${paths.join('|')})`, mapRouter); } }; diff --git a/lib/cartodb/controllers/template-router.js b/lib/cartodb/controllers/template-router.js index 50287b43..d549dafd 100644 --- a/lib/cartodb/controllers/template-router.js +++ b/lib/cartodb/controllers/template-router.js @@ -1,24 +1,11 @@ const { Router: router } = require('express'); -const logger = require('../middleware/logger'); -const bodyParser = require('body-parser'); -const servedByHostHeader = require('../middleware/served-by-host-header'); -const stats = require('../middleware/stats'); -const lzmaMiddleware = require('../middleware/lzma'); -const cors = require('../middleware/cors'); -const user = require('../middleware/user'); -const sendResponse = require('../middleware/send-response'); -const syntaxError = require('../middleware/syntax-error'); -const errorMiddleware = require('../middleware/error-middleware'); - const NamedMapController = require('./map/named'); const AdminTemplateController = require('./template/admin'); const TileTemplateController = require('./template/tile'); module.exports = class TemplateRouter { - constructor ({ collaborators, serverOptions }) { - this.serverOptions = serverOptions; - + constructor ({ collaborators }) { const { pgConnection, templateMaps, @@ -65,30 +52,18 @@ module.exports = class TemplateRouter { ); } - register (app) { - const templateBasePath = this.serverOptions.base_url_templated; - + register (apiRouter) { const templateRouter = router(); - templateRouter.use(logger(this.serverOptions)); - templateRouter.use(bodyParser.json()); - templateRouter.use(servedByHostHeader()); - templateRouter.use(stats({ - enabled: this.serverOptions.useProfiler, - statsClient: global.statsClient - })); - templateRouter.use(lzmaMiddleware()); - templateRouter.use(cors()); - templateRouter.use(user()); - this.namedMapController.register(templateRouter); this.tileTemplateController.register(templateRouter); this.adminTemplateController.register(templateRouter); - templateRouter.use(sendResponse()); - templateRouter.use(syntaxError()); - templateRouter.use(errorMiddleware()); + const paths = [ + '/map/named', + '/template' + ]; - app.use(templateBasePath, templateRouter); + apiRouter.use(`(?:${paths.join('|')})`, templateRouter); } }; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 847b7090..ab6fcc62 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -5,7 +5,7 @@ const { mapnik } = windshaft; const jsonReplacer = require('./utils/json-replacer'); -const ControllersFactory = require('./controllers/factory'); +const ApiRouter = require('./controllers/api-router'); const ServerInfoController = require('./controllers/server-info'); const StatsClient = require('./stats/client'); @@ -27,8 +27,8 @@ module.exports = function createServer (serverOptions) { app.disable('etag'); app.set('json replacer', jsonReplacer()); - const controllers = new ControllersFactory({ serverOptions, environmentOptions: global.environment }); - controllers.register(app); + const apiRouter = new ApiRouter({ serverOptions, environmentOptions: global.environment }); + apiRouter.register(app); const versions = getAndValidateVersions(serverOptions); From 61fc15cec07c291d953e4c02704e430ed2592f9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 6 Apr 2018 11:13:34 +0200 Subject: [PATCH 34/54] Add comment to indicate deprecated paths --- lib/cartodb/controllers/api-router.js | 4 ++-- lib/cartodb/server_options.js | 3 +++ test/acceptance/ported/support/ported_server_options.js | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/cartodb/controllers/api-router.js b/lib/cartodb/controllers/api-router.js index fe701985..537be27b 100644 --- a/lib/cartodb/controllers/api-router.js +++ b/lib/cartodb/controllers/api-router.js @@ -209,8 +209,8 @@ module.exports = class ApiRouter { const paths = [ '/api/v1', '/user/:user/api/v1', - '/tiles', - '/database/:dbname' + '/tiles', // Deprecated + '/database/:dbname' // Deprecated: used in ported test from windshaft ]; app.use(`(?:${paths.join('|')})`, apiRouter); diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index 1891e208..adc03003 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -49,12 +49,14 @@ module.exports = { port: global.environment.port, host: global.environment.host }, + // FIXME: Remove it. This is no longer needed, paths are defined in routers // This is for inline maps and table maps base_url: global.environment.base_url_legacy || '/tiles/:table', /// @deprecated with Windshaft-0.17.0 ///base_url_notable: '/tiles', + // FIXME: Remove it. This is no longer needed, paths are defined in routers // This is for Detached maps // // "maps" is the official, while @@ -62,6 +64,7 @@ module.exports = { // base_url_mapconfig: global.environment.base_url_detached || '(?:/maps|/tiles/layergroup)', + // FIXME: Remove it. This is no longer needed, paths are defined in routers base_url_templated: global.environment.base_url_templated || '(?:/maps/named|/tiles/template)', grainstore: { diff --git a/test/acceptance/ported/support/ported_server_options.js b/test/acceptance/ported/support/ported_server_options.js index 8b8ec339..1ce262af 100644 --- a/test/acceptance/ported/support/ported_server_options.js +++ b/test/acceptance/ported/support/ported_server_options.js @@ -7,7 +7,9 @@ var overviewsQueryRewriter = new OverviewsQueryRewriter({ }); module.exports = _.extend({}, serverOptions, { + // FIXME: Remove it. This is no longer needed, paths are defined in routers base_url: '/database/:dbname/table/:table', + // FIXME: Remove it. This is no longer needed, paths are defined in routers base_url_mapconfig: '/database/:dbname/layergroup', grainstore: { datasource: { From 3bfc7d3d23f5da8d2c9646acd794c04f6f7a7b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 6 Apr 2018 13:53:50 +0200 Subject: [PATCH 35/54] Rename controllers folder by routers --- lib/cartodb/{controllers => routers}/analyses.js | 0 lib/cartodb/{controllers => routers}/api-router.js | 0 lib/cartodb/{controllers => routers}/layergroup/analysis.js | 0 lib/cartodb/{controllers => routers}/layergroup/attributes.js | 0 lib/cartodb/{controllers => routers}/layergroup/dataview.js | 0 .../layergroup/middlewares/map-store-map-config-provider.js | 0 lib/cartodb/{controllers => routers}/layergroup/preview.js | 0 lib/cartodb/{controllers => routers}/layergroup/tile.js | 0 lib/cartodb/{controllers => routers}/map-router.js | 0 lib/cartodb/{controllers => routers}/map/anonymous.js | 0 .../map/middlewares/augment-layergroup-data.js | 0 .../map/middlewares/check-json-content-type.js | 0 .../map/middlewares/increment-map-view-count.js | 0 .../{controllers => routers}/map/middlewares/init-profiler.js | 0 .../map/middlewares/last-updated-time-layergroup.js | 0 .../{controllers => routers}/map/middlewares/layer-stats.js | 0 .../map/middlewares/layergroup-id-header.js | 0 .../map/middlewares/layergroup-metadata.js | 0 .../{controllers => routers}/map/middlewares/map-error.js | 0 lib/cartodb/{controllers => routers}/map/named.js | 0 lib/cartodb/{controllers => routers}/server-info.js | 0 lib/cartodb/{controllers => routers}/template-router.js | 0 lib/cartodb/{controllers => routers}/template/admin.js | 0 .../template/middlewares/named-map-provider.js | 0 lib/cartodb/{controllers => routers}/template/preview.js | 0 lib/cartodb/{controllers => routers}/template/tile.js | 0 lib/cartodb/server.js | 4 ++-- 27 files changed, 2 insertions(+), 2 deletions(-) rename lib/cartodb/{controllers => routers}/analyses.js (100%) rename lib/cartodb/{controllers => routers}/api-router.js (100%) rename lib/cartodb/{controllers => routers}/layergroup/analysis.js (100%) rename lib/cartodb/{controllers => routers}/layergroup/attributes.js (100%) rename lib/cartodb/{controllers => routers}/layergroup/dataview.js (100%) rename lib/cartodb/{controllers => routers}/layergroup/middlewares/map-store-map-config-provider.js (100%) rename lib/cartodb/{controllers => routers}/layergroup/preview.js (100%) rename lib/cartodb/{controllers => routers}/layergroup/tile.js (100%) rename lib/cartodb/{controllers => routers}/map-router.js (100%) rename lib/cartodb/{controllers => routers}/map/anonymous.js (100%) rename lib/cartodb/{controllers => routers}/map/middlewares/augment-layergroup-data.js (100%) rename lib/cartodb/{controllers => routers}/map/middlewares/check-json-content-type.js (100%) rename lib/cartodb/{controllers => routers}/map/middlewares/increment-map-view-count.js (100%) rename lib/cartodb/{controllers => routers}/map/middlewares/init-profiler.js (100%) rename lib/cartodb/{controllers => routers}/map/middlewares/last-updated-time-layergroup.js (100%) rename lib/cartodb/{controllers => routers}/map/middlewares/layer-stats.js (100%) rename lib/cartodb/{controllers => routers}/map/middlewares/layergroup-id-header.js (100%) rename lib/cartodb/{controllers => routers}/map/middlewares/layergroup-metadata.js (100%) rename lib/cartodb/{controllers => routers}/map/middlewares/map-error.js (100%) rename lib/cartodb/{controllers => routers}/map/named.js (100%) rename lib/cartodb/{controllers => routers}/server-info.js (100%) rename lib/cartodb/{controllers => routers}/template-router.js (100%) rename lib/cartodb/{controllers => routers}/template/admin.js (100%) rename lib/cartodb/{controllers => routers}/template/middlewares/named-map-provider.js (100%) rename lib/cartodb/{controllers => routers}/template/preview.js (100%) rename lib/cartodb/{controllers => routers}/template/tile.js (100%) diff --git a/lib/cartodb/controllers/analyses.js b/lib/cartodb/routers/analyses.js similarity index 100% rename from lib/cartodb/controllers/analyses.js rename to lib/cartodb/routers/analyses.js diff --git a/lib/cartodb/controllers/api-router.js b/lib/cartodb/routers/api-router.js similarity index 100% rename from lib/cartodb/controllers/api-router.js rename to lib/cartodb/routers/api-router.js diff --git a/lib/cartodb/controllers/layergroup/analysis.js b/lib/cartodb/routers/layergroup/analysis.js similarity index 100% rename from lib/cartodb/controllers/layergroup/analysis.js rename to lib/cartodb/routers/layergroup/analysis.js diff --git a/lib/cartodb/controllers/layergroup/attributes.js b/lib/cartodb/routers/layergroup/attributes.js similarity index 100% rename from lib/cartodb/controllers/layergroup/attributes.js rename to lib/cartodb/routers/layergroup/attributes.js diff --git a/lib/cartodb/controllers/layergroup/dataview.js b/lib/cartodb/routers/layergroup/dataview.js similarity index 100% rename from lib/cartodb/controllers/layergroup/dataview.js rename to lib/cartodb/routers/layergroup/dataview.js diff --git a/lib/cartodb/controllers/layergroup/middlewares/map-store-map-config-provider.js b/lib/cartodb/routers/layergroup/middlewares/map-store-map-config-provider.js similarity index 100% rename from lib/cartodb/controllers/layergroup/middlewares/map-store-map-config-provider.js rename to lib/cartodb/routers/layergroup/middlewares/map-store-map-config-provider.js diff --git a/lib/cartodb/controllers/layergroup/preview.js b/lib/cartodb/routers/layergroup/preview.js similarity index 100% rename from lib/cartodb/controllers/layergroup/preview.js rename to lib/cartodb/routers/layergroup/preview.js diff --git a/lib/cartodb/controllers/layergroup/tile.js b/lib/cartodb/routers/layergroup/tile.js similarity index 100% rename from lib/cartodb/controllers/layergroup/tile.js rename to lib/cartodb/routers/layergroup/tile.js diff --git a/lib/cartodb/controllers/map-router.js b/lib/cartodb/routers/map-router.js similarity index 100% rename from lib/cartodb/controllers/map-router.js rename to lib/cartodb/routers/map-router.js diff --git a/lib/cartodb/controllers/map/anonymous.js b/lib/cartodb/routers/map/anonymous.js similarity index 100% rename from lib/cartodb/controllers/map/anonymous.js rename to lib/cartodb/routers/map/anonymous.js diff --git a/lib/cartodb/controllers/map/middlewares/augment-layergroup-data.js b/lib/cartodb/routers/map/middlewares/augment-layergroup-data.js similarity index 100% rename from lib/cartodb/controllers/map/middlewares/augment-layergroup-data.js rename to lib/cartodb/routers/map/middlewares/augment-layergroup-data.js diff --git a/lib/cartodb/controllers/map/middlewares/check-json-content-type.js b/lib/cartodb/routers/map/middlewares/check-json-content-type.js similarity index 100% rename from lib/cartodb/controllers/map/middlewares/check-json-content-type.js rename to lib/cartodb/routers/map/middlewares/check-json-content-type.js diff --git a/lib/cartodb/controllers/map/middlewares/increment-map-view-count.js b/lib/cartodb/routers/map/middlewares/increment-map-view-count.js similarity index 100% rename from lib/cartodb/controllers/map/middlewares/increment-map-view-count.js rename to lib/cartodb/routers/map/middlewares/increment-map-view-count.js diff --git a/lib/cartodb/controllers/map/middlewares/init-profiler.js b/lib/cartodb/routers/map/middlewares/init-profiler.js similarity index 100% rename from lib/cartodb/controllers/map/middlewares/init-profiler.js rename to lib/cartodb/routers/map/middlewares/init-profiler.js diff --git a/lib/cartodb/controllers/map/middlewares/last-updated-time-layergroup.js b/lib/cartodb/routers/map/middlewares/last-updated-time-layergroup.js similarity index 100% rename from lib/cartodb/controllers/map/middlewares/last-updated-time-layergroup.js rename to lib/cartodb/routers/map/middlewares/last-updated-time-layergroup.js diff --git a/lib/cartodb/controllers/map/middlewares/layer-stats.js b/lib/cartodb/routers/map/middlewares/layer-stats.js similarity index 100% rename from lib/cartodb/controllers/map/middlewares/layer-stats.js rename to lib/cartodb/routers/map/middlewares/layer-stats.js diff --git a/lib/cartodb/controllers/map/middlewares/layergroup-id-header.js b/lib/cartodb/routers/map/middlewares/layergroup-id-header.js similarity index 100% rename from lib/cartodb/controllers/map/middlewares/layergroup-id-header.js rename to lib/cartodb/routers/map/middlewares/layergroup-id-header.js diff --git a/lib/cartodb/controllers/map/middlewares/layergroup-metadata.js b/lib/cartodb/routers/map/middlewares/layergroup-metadata.js similarity index 100% rename from lib/cartodb/controllers/map/middlewares/layergroup-metadata.js rename to lib/cartodb/routers/map/middlewares/layergroup-metadata.js diff --git a/lib/cartodb/controllers/map/middlewares/map-error.js b/lib/cartodb/routers/map/middlewares/map-error.js similarity index 100% rename from lib/cartodb/controllers/map/middlewares/map-error.js rename to lib/cartodb/routers/map/middlewares/map-error.js diff --git a/lib/cartodb/controllers/map/named.js b/lib/cartodb/routers/map/named.js similarity index 100% rename from lib/cartodb/controllers/map/named.js rename to lib/cartodb/routers/map/named.js diff --git a/lib/cartodb/controllers/server-info.js b/lib/cartodb/routers/server-info.js similarity index 100% rename from lib/cartodb/controllers/server-info.js rename to lib/cartodb/routers/server-info.js diff --git a/lib/cartodb/controllers/template-router.js b/lib/cartodb/routers/template-router.js similarity index 100% rename from lib/cartodb/controllers/template-router.js rename to lib/cartodb/routers/template-router.js diff --git a/lib/cartodb/controllers/template/admin.js b/lib/cartodb/routers/template/admin.js similarity index 100% rename from lib/cartodb/controllers/template/admin.js rename to lib/cartodb/routers/template/admin.js diff --git a/lib/cartodb/controllers/template/middlewares/named-map-provider.js b/lib/cartodb/routers/template/middlewares/named-map-provider.js similarity index 100% rename from lib/cartodb/controllers/template/middlewares/named-map-provider.js rename to lib/cartodb/routers/template/middlewares/named-map-provider.js diff --git a/lib/cartodb/controllers/template/preview.js b/lib/cartodb/routers/template/preview.js similarity index 100% rename from lib/cartodb/controllers/template/preview.js rename to lib/cartodb/routers/template/preview.js diff --git a/lib/cartodb/controllers/template/tile.js b/lib/cartodb/routers/template/tile.js similarity index 100% rename from lib/cartodb/controllers/template/tile.js rename to lib/cartodb/routers/template/tile.js diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index ab6fcc62..40f1195c 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -5,8 +5,8 @@ const { mapnik } = windshaft; const jsonReplacer = require('./utils/json-replacer'); -const ApiRouter = require('./controllers/api-router'); -const ServerInfoController = require('./controllers/server-info'); +const ApiRouter = require('./routers/api-router'); +const ServerInfoController = require('./routers/server-info'); const StatsClient = require('./stats/client'); From 7e68f5270d821f151526c0e82c336483264f1e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 6 Apr 2018 18:20:33 +0200 Subject: [PATCH 36/54] Move application middlewares to routers folder --- lib/cartodb/routers/analyses.js | 12 ++--- lib/cartodb/routers/api-router.js | 18 ++++---- lib/cartodb/routers/layergroup/analysis.js | 12 ++--- lib/cartodb/routers/layergroup/attributes.js | 20 ++++----- lib/cartodb/routers/layergroup/dataview.js | 20 ++++----- lib/cartodb/routers/layergroup/preview.js | 20 ++++----- lib/cartodb/routers/layergroup/tile.js | 22 +++++----- lib/cartodb/routers/map/anonymous.js | 18 ++++---- lib/cartodb/routers/map/named.js | 18 ++++---- .../middlewares}/authorize.js | 0 .../middlewares}/cache-channel-header.js | 0 .../middlewares}/cache-control-header.js | 0 .../middlewares}/clean-up-query-params.js | 0 .../middlewares}/cors.js | 0 .../middlewares}/credentials.js | 0 .../middlewares}/db-conn-setup.js | 0 .../middlewares}/error-middleware.js | 0 .../middlewares}/last-modified-header.js | 0 .../middlewares}/layergroup-token.js | 2 +- .../middlewares}/logger.js | 0 .../middlewares}/lzma.js | 0 .../middlewares}/rate-limit.js | 0 .../middlewares}/send-response.js | 0 .../middlewares}/served-by-host-header.js | 0 .../middlewares}/stats.js | 2 +- .../middlewares}/surrogate-key-header.js | 4 +- .../middlewares}/syntax-error.js | 0 .../middlewares}/user.js | 2 +- .../middlewares}/vector-error.js | 2 +- lib/cartodb/routers/template/admin.js | 4 +- lib/cartodb/routers/template/preview.js | 18 ++++---- lib/cartodb/routers/template/tile.js | 20 ++++----- test/acceptance/rate-limit.test.js | 44 +++++++++---------- test/unit/cartodb/error-middleware.test.js | 10 ++--- test/unit/cartodb/error_messages.test.js | 2 +- test/unit/cartodb/lzmaMiddleware.test.js | 2 +- test/unit/cartodb/prepare-context.test.js | 8 ++-- 37 files changed, 140 insertions(+), 140 deletions(-) rename lib/cartodb/{middleware => routers/middlewares}/authorize.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/cache-channel-header.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/cache-control-header.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/clean-up-query-params.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/cors.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/credentials.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/db-conn-setup.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/error-middleware.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/last-modified-header.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/layergroup-token.js (93%) rename lib/cartodb/{middleware => routers/middlewares}/logger.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/lzma.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/rate-limit.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/send-response.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/served-by-host-header.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/stats.js (93%) rename lib/cartodb/{middleware => routers/middlewares}/surrogate-key-header.js (84%) rename lib/cartodb/{middleware => routers/middlewares}/syntax-error.js (100%) rename lib/cartodb/{middleware => routers/middlewares}/user.js (79%) rename lib/cartodb/{middleware => routers/middlewares}/vector-error.js (95%) diff --git a/lib/cartodb/routers/analyses.js b/lib/cartodb/routers/analyses.js index cc6dd3a6..145d6a0d 100644 --- a/lib/cartodb/routers/analyses.js +++ b/lib/cartodb/routers/analyses.js @@ -1,11 +1,11 @@ const PSQL = require('cartodb-psql'); -const cleanUpQueryParams = require('../middleware/clean-up-query-params'); -const credentials = require('../middleware/credentials'); -const authorize = require('../middleware/authorize'); -const dbConnSetup = require('../middleware/db-conn-setup'); -const rateLimit = require('../middleware/rate-limit'); +const cleanUpQueryParams = require('./middlewares/clean-up-query-params'); +const credentials = require('./middlewares/credentials'); +const authorize = require('./middlewares/authorize'); +const dbConnSetup = require('./middlewares/db-conn-setup'); +const rateLimit = require('./middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; -const cacheControlHeader = require('../middleware/cache-control-header'); +const cacheControlHeader = require('./middlewares/cache-control-header'); const dbParamsFromResLocals = require('../utils/database-params'); function AnalysesController(pgConnection, authApi, userLimitsApi) { diff --git a/lib/cartodb/routers/api-router.js b/lib/cartodb/routers/api-router.js index 537be27b..ca46d6ae 100644 --- a/lib/cartodb/routers/api-router.js +++ b/lib/cartodb/routers/api-router.js @@ -40,16 +40,16 @@ const ResourceLocator = require('../models/resource-locator'); const LayergroupMetadata = require('../utils/layergroup-metadata'); const RendererStatsReporter = require('../stats/reporter/renderer'); -const logger = require('../middleware/logger'); +const logger = require('./middlewares/logger'); const bodyParser = require('body-parser'); -const servedByHostHeader = require('../middleware/served-by-host-header'); -const stats = require('../middleware/stats'); -const lzmaMiddleware = require('../middleware/lzma'); -const cors = require('../middleware/cors'); -const user = require('../middleware/user'); -const sendResponse = require('../middleware/send-response'); -const syntaxError = require('../middleware/syntax-error'); -const errorMiddleware = require('../middleware/error-middleware'); +const servedByHostHeader = require('./middlewares/served-by-host-header'); +const stats = require('./middlewares/stats'); +const lzmaMiddleware = require('./middlewares/lzma'); +const cors = require('./middlewares/cors'); +const user = require('./middlewares/user'); +const sendResponse = require('./middlewares/send-response'); +const syntaxError = require('./middlewares/syntax-error'); +const errorMiddleware = require('./middlewares/error-middleware'); const MapRouter = require('./map-router'); const TemplateRouter = require('./template-router'); diff --git a/lib/cartodb/routers/layergroup/analysis.js b/lib/cartodb/routers/layergroup/analysis.js index 36f20991..b2164140 100644 --- a/lib/cartodb/routers/layergroup/analysis.js +++ b/lib/cartodb/routers/layergroup/analysis.js @@ -1,9 +1,9 @@ -const layergroupToken = require('../../middleware/layergroup-token'); -const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); -const credentials = require('../../middleware/credentials'); -const dbConnSetup = require('../../middleware/db-conn-setup'); -const authorize = require('../../middleware/authorize'); -const rateLimit = require('../../middleware/rate-limit'); +const layergroupToken = require('../middlewares/layergroup-token'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const authorize = require('../middlewares/authorize'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const dbParamsFromResLocals = require('../../utils/database-params'); diff --git a/lib/cartodb/routers/layergroup/attributes.js b/lib/cartodb/routers/layergroup/attributes.js index c4c5af38..3666483a 100644 --- a/lib/cartodb/routers/layergroup/attributes.js +++ b/lib/cartodb/routers/layergroup/attributes.js @@ -1,15 +1,15 @@ -const layergroupToken = require('../../middleware/layergroup-token'); -const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); -const credentials = require('../../middleware/credentials'); -const dbConnSetup = require('../../middleware/db-conn-setup'); -const authorize = require('../../middleware/authorize'); -const rateLimit = require('../../middleware/rate-limit'); +const layergroupToken = require('../middlewares/layergroup-token'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const authorize = require('../middlewares/authorize'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const createMapStoreMapConfigProvider = require('./middlewares/map-store-map-config-provider'); -const cacheControlHeader = require('../../middleware/cache-control-header'); -const cacheChannelHeader = require('../../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../../middleware/last-modified-header'); +const cacheControlHeader = require('../middlewares/cache-control-header'); +const cacheChannelHeader = require('../middlewares/cache-channel-header'); +const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); +const lastModifiedHeader = require('../middlewares/last-modified-header'); module.exports = class AttributesLayergroupController { constructor ( diff --git a/lib/cartodb/routers/layergroup/dataview.js b/lib/cartodb/routers/layergroup/dataview.js index c13e0eaa..559a51d2 100644 --- a/lib/cartodb/routers/layergroup/dataview.js +++ b/lib/cartodb/routers/layergroup/dataview.js @@ -1,15 +1,15 @@ -const layergroupToken = require('../../middleware/layergroup-token'); -const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); -const credentials = require('../../middleware/credentials'); -const dbConnSetup = require('../../middleware/db-conn-setup'); -const authorize = require('../../middleware/authorize'); -const rateLimit = require('../../middleware/rate-limit'); +const layergroupToken = require('../middlewares/layergroup-token'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const authorize = require('../middlewares/authorize'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const createMapStoreMapConfigProvider = require('./middlewares/map-store-map-config-provider'); -const cacheControlHeader = require('../../middleware/cache-control-header'); -const cacheChannelHeader = require('../../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../../middleware/last-modified-header'); +const cacheControlHeader = require('../middlewares/cache-control-header'); +const cacheChannelHeader = require('../middlewares/cache-channel-header'); +const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); +const lastModifiedHeader = require('../middlewares/last-modified-header'); const ALLOWED_DATAVIEW_QUERY_PARAMS = [ 'filters', // json diff --git a/lib/cartodb/routers/layergroup/preview.js b/lib/cartodb/routers/layergroup/preview.js index 8885e45c..d22efffd 100644 --- a/lib/cartodb/routers/layergroup/preview.js +++ b/lib/cartodb/routers/layergroup/preview.js @@ -1,15 +1,15 @@ -const layergroupToken = require('../../middleware/layergroup-token'); -const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); -const credentials = require('../../middleware/credentials'); -const dbConnSetup = require('../../middleware/db-conn-setup'); -const authorize = require('../../middleware/authorize'); -const rateLimit = require('../../middleware/rate-limit'); +const layergroupToken = require('../middlewares/layergroup-token'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const authorize = require('../middlewares/authorize'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const createMapStoreMapConfigProvider = require('./middlewares/map-store-map-config-provider'); -const cacheControlHeader = require('../../middleware/cache-control-header'); -const cacheChannelHeader = require('../../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../../middleware/last-modified-header'); +const cacheControlHeader = require('../middlewares/cache-control-header'); +const cacheChannelHeader = require('../middlewares/cache-channel-header'); +const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); +const lastModifiedHeader = require('../middlewares/last-modified-header'); module.exports = class PreviewLayergroupController { constructor ( diff --git a/lib/cartodb/routers/layergroup/tile.js b/lib/cartodb/routers/layergroup/tile.js index 7837d116..0443ca4e 100644 --- a/lib/cartodb/routers/layergroup/tile.js +++ b/lib/cartodb/routers/layergroup/tile.js @@ -1,16 +1,16 @@ -const layergroupToken = require('../../middleware/layergroup-token'); -const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); -const credentials = require('../../middleware/credentials'); -const dbConnSetup = require('../../middleware/db-conn-setup'); -const authorize = require('../../middleware/authorize'); -const rateLimit = require('../../middleware/rate-limit'); +const layergroupToken = require('../middlewares/layergroup-token'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const authorize = require('../middlewares/authorize'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const createMapStoreMapConfigProvider = require('./middlewares/map-store-map-config-provider'); -const cacheControlHeader = require('../../middleware/cache-control-header'); -const cacheChannelHeader = require('../../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../../middleware/last-modified-header'); -const vectorError = require('../../middleware/vector-error'); +const cacheControlHeader = require('../middlewares/cache-control-header'); +const cacheChannelHeader = require('../middlewares/cache-channel-header'); +const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); +const lastModifiedHeader = require('../middlewares/last-modified-header'); +const vectorError = require('../middlewares/vector-error'); const SUPPORTED_FORMATS = { grid_json: true, diff --git a/lib/cartodb/routers/map/anonymous.js b/lib/cartodb/routers/map/anonymous.js index 433da3e4..3e2a3582 100644 --- a/lib/cartodb/routers/map/anonymous.js +++ b/lib/cartodb/routers/map/anonymous.js @@ -1,25 +1,25 @@ const windshaft = require('windshaft'); const MapConfig = windshaft.model.MapConfig; const Datasource = windshaft.model.Datasource; -const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); -const credentials = require('../../middleware/credentials'); -const dbConnSetup = require('../../middleware/db-conn-setup'); -const authorize = require('../../middleware/authorize'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const authorize = require('../middlewares/authorize'); const initProfiler = require('./middlewares/init-profiler'); const checkJsonContentType = require('./middlewares/check-json-content-type'); const incrementMapViewCount = require('./middlewares/increment-map-view-count'); const augmentLayergroupData = require('./middlewares/augment-layergroup-data'); -const cacheControlHeader = require('../../middleware/cache-control-header'); -const cacheChannelHeader = require('../../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../../middleware/last-modified-header'); +const cacheControlHeader = require('../middlewares/cache-control-header'); +const cacheChannelHeader = require('../middlewares/cache-channel-header'); +const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); +const lastModifiedHeader = require('../middlewares/last-modified-header'); const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); const layerStats = require('./middlewares/layer-stats'); const layergroupIdHeader = require('./middlewares/layergroup-id-header'); const layergroupMetadata = require('./middlewares/layergroup-metadata'); const mapError = require('./middlewares/map-error'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); -const rateLimit = require('../../middleware/rate-limit'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; /** diff --git a/lib/cartodb/routers/map/named.js b/lib/cartodb/routers/map/named.js index 2258b62f..47699e83 100644 --- a/lib/cartodb/routers/map/named.js +++ b/lib/cartodb/routers/map/named.js @@ -1,15 +1,15 @@ -const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); -const credentials = require('../../middleware/credentials'); -const dbConnSetup = require('../../middleware/db-conn-setup'); -const authorize = require('../../middleware/authorize'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const authorize = require('../middlewares/authorize'); const initProfiler = require('./middlewares/init-profiler'); const checkJsonContentType = require('./middlewares/check-json-content-type'); const incrementMapViewCount = require('./middlewares/increment-map-view-count'); const augmentLayergroupData = require('./middlewares/augment-layergroup-data'); -const cacheControlHeader = require('../../middleware/cache-control-header'); -const cacheChannelHeader = require('../../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../../middleware/last-modified-header'); +const cacheControlHeader = require('../middlewares/cache-control-header'); +const cacheChannelHeader = require('../middlewares/cache-channel-header'); +const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); +const lastModifiedHeader = require('../middlewares/last-modified-header'); const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); const layerStats = require('./middlewares/layer-stats'); const layergroupIdHeader = require('./middlewares/layergroup-id-header'); @@ -17,7 +17,7 @@ const layergroupMetadata = require('./middlewares/layergroup-metadata'); const mapError = require('./middlewares/map-error'); const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); -const rateLimit = require('../../middleware/rate-limit'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; /** diff --git a/lib/cartodb/middleware/authorize.js b/lib/cartodb/routers/middlewares/authorize.js similarity index 100% rename from lib/cartodb/middleware/authorize.js rename to lib/cartodb/routers/middlewares/authorize.js diff --git a/lib/cartodb/middleware/cache-channel-header.js b/lib/cartodb/routers/middlewares/cache-channel-header.js similarity index 100% rename from lib/cartodb/middleware/cache-channel-header.js rename to lib/cartodb/routers/middlewares/cache-channel-header.js diff --git a/lib/cartodb/middleware/cache-control-header.js b/lib/cartodb/routers/middlewares/cache-control-header.js similarity index 100% rename from lib/cartodb/middleware/cache-control-header.js rename to lib/cartodb/routers/middlewares/cache-control-header.js diff --git a/lib/cartodb/middleware/clean-up-query-params.js b/lib/cartodb/routers/middlewares/clean-up-query-params.js similarity index 100% rename from lib/cartodb/middleware/clean-up-query-params.js rename to lib/cartodb/routers/middlewares/clean-up-query-params.js diff --git a/lib/cartodb/middleware/cors.js b/lib/cartodb/routers/middlewares/cors.js similarity index 100% rename from lib/cartodb/middleware/cors.js rename to lib/cartodb/routers/middlewares/cors.js diff --git a/lib/cartodb/middleware/credentials.js b/lib/cartodb/routers/middlewares/credentials.js similarity index 100% rename from lib/cartodb/middleware/credentials.js rename to lib/cartodb/routers/middlewares/credentials.js diff --git a/lib/cartodb/middleware/db-conn-setup.js b/lib/cartodb/routers/middlewares/db-conn-setup.js similarity index 100% rename from lib/cartodb/middleware/db-conn-setup.js rename to lib/cartodb/routers/middlewares/db-conn-setup.js diff --git a/lib/cartodb/middleware/error-middleware.js b/lib/cartodb/routers/middlewares/error-middleware.js similarity index 100% rename from lib/cartodb/middleware/error-middleware.js rename to lib/cartodb/routers/middlewares/error-middleware.js diff --git a/lib/cartodb/middleware/last-modified-header.js b/lib/cartodb/routers/middlewares/last-modified-header.js similarity index 100% rename from lib/cartodb/middleware/last-modified-header.js rename to lib/cartodb/routers/middlewares/last-modified-header.js diff --git a/lib/cartodb/middleware/layergroup-token.js b/lib/cartodb/routers/middlewares/layergroup-token.js similarity index 93% rename from lib/cartodb/middleware/layergroup-token.js rename to lib/cartodb/routers/middlewares/layergroup-token.js index 1a32e413..0e6553d2 100644 --- a/lib/cartodb/middleware/layergroup-token.js +++ b/lib/cartodb/routers/middlewares/layergroup-token.js @@ -1,4 +1,4 @@ -const LayergroupToken = require('../models/layergroup-token'); +const LayergroupToken = require('../../models/layergroup-token'); const authErrorMessageTemplate = function (signer, user) { return `Cannot use map signature of user "${signer}" on db of user "${user}"`; }; diff --git a/lib/cartodb/middleware/logger.js b/lib/cartodb/routers/middlewares/logger.js similarity index 100% rename from lib/cartodb/middleware/logger.js rename to lib/cartodb/routers/middlewares/logger.js diff --git a/lib/cartodb/middleware/lzma.js b/lib/cartodb/routers/middlewares/lzma.js similarity index 100% rename from lib/cartodb/middleware/lzma.js rename to lib/cartodb/routers/middlewares/lzma.js diff --git a/lib/cartodb/middleware/rate-limit.js b/lib/cartodb/routers/middlewares/rate-limit.js similarity index 100% rename from lib/cartodb/middleware/rate-limit.js rename to lib/cartodb/routers/middlewares/rate-limit.js diff --git a/lib/cartodb/middleware/send-response.js b/lib/cartodb/routers/middlewares/send-response.js similarity index 100% rename from lib/cartodb/middleware/send-response.js rename to lib/cartodb/routers/middlewares/send-response.js diff --git a/lib/cartodb/middleware/served-by-host-header.js b/lib/cartodb/routers/middlewares/served-by-host-header.js similarity index 100% rename from lib/cartodb/middleware/served-by-host-header.js rename to lib/cartodb/routers/middlewares/served-by-host-header.js diff --git a/lib/cartodb/middleware/stats.js b/lib/cartodb/routers/middlewares/stats.js similarity index 93% rename from lib/cartodb/middleware/stats.js rename to lib/cartodb/routers/middlewares/stats.js index 83ff3054..53d2cf9a 100644 --- a/lib/cartodb/middleware/stats.js +++ b/lib/cartodb/routers/middlewares/stats.js @@ -1,4 +1,4 @@ -const Profiler = require('../stats/profiler_proxy'); +const Profiler = require('../../stats/profiler_proxy'); const debug = require('debug')('windshaft:cartodb:stats'); const onHeaders = require('on-headers'); diff --git a/lib/cartodb/middleware/surrogate-key-header.js b/lib/cartodb/routers/middlewares/surrogate-key-header.js similarity index 84% rename from lib/cartodb/middleware/surrogate-key-header.js rename to lib/cartodb/routers/middlewares/surrogate-key-header.js index 51cec1c1..d2a3243c 100644 --- a/lib/cartodb/middleware/surrogate-key-header.js +++ b/lib/cartodb/routers/middlewares/surrogate-key-header.js @@ -1,5 +1,5 @@ -const NamedMapsCacheEntry = require('../cache/model/named_maps_entry'); -const NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider'); +const NamedMapsCacheEntry = require('../../cache/model/named_maps_entry'); +const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); module.exports = function setSurrogateKeyHeader ({ surrogateKeysCache }) { return function setSurrogateKeyHeaderMiddleware(req, res, next) { diff --git a/lib/cartodb/middleware/syntax-error.js b/lib/cartodb/routers/middlewares/syntax-error.js similarity index 100% rename from lib/cartodb/middleware/syntax-error.js rename to lib/cartodb/routers/middlewares/syntax-error.js diff --git a/lib/cartodb/middleware/user.js b/lib/cartodb/routers/middlewares/user.js similarity index 79% rename from lib/cartodb/middleware/user.js rename to lib/cartodb/routers/middlewares/user.js index 9c7968bc..551fa001 100644 --- a/lib/cartodb/middleware/user.js +++ b/lib/cartodb/routers/middlewares/user.js @@ -1,4 +1,4 @@ -const CdbRequest = require('../models/cdb_request'); +const CdbRequest = require('../../models/cdb_request'); module.exports = function user () { const cdbRequest = new CdbRequest(); diff --git a/lib/cartodb/middleware/vector-error.js b/lib/cartodb/routers/middlewares/vector-error.js similarity index 95% rename from lib/cartodb/middleware/vector-error.js rename to lib/cartodb/routers/middlewares/vector-error.js index 8268ec1f..7e2ec75f 100644 --- a/lib/cartodb/middleware/vector-error.js +++ b/lib/cartodb/routers/middlewares/vector-error.js @@ -1,5 +1,5 @@ const fs = require('fs'); -const timeoutErrorVectorTile = fs.readFileSync(__dirname + '/../../../assets/render-timeout-fallback.mvt'); +const timeoutErrorVectorTile = fs.readFileSync(__dirname + '/../../../../assets/render-timeout-fallback.mvt'); module.exports = function vectorError() { return function vectorErrorMiddleware(err, req, res, next) { diff --git a/lib/cartodb/routers/template/admin.js b/lib/cartodb/routers/template/admin.js index 169f6b20..b5d1b964 100644 --- a/lib/cartodb/routers/template/admin.js +++ b/lib/cartodb/routers/template/admin.js @@ -1,6 +1,6 @@ const { templateName } = require('../../backends/template_maps'); -const credentials = require('../../middleware/credentials'); -const rateLimit = require('../../middleware/rate-limit'); +const credentials = require('../middlewares/credentials'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; /** diff --git a/lib/cartodb/routers/template/preview.js b/lib/cartodb/routers/template/preview.js index 53f583de..224579ad 100644 --- a/lib/cartodb/routers/template/preview.js +++ b/lib/cartodb/routers/template/preview.js @@ -1,13 +1,13 @@ -const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); -const credentials = require('../../middleware/credentials'); -const dbConnSetup = require('../../middleware/db-conn-setup'); -const authorize = require('../../middleware/authorize'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const authorize = require('../middlewares/authorize'); const namedMapProvider = require('./middlewares/named-map-provider'); -const cacheControlHeader = require('../../middleware/cache-control-header'); -const cacheChannelHeader = require('../../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../../middleware/last-modified-header'); -const rateLimit = require('../../middleware/rate-limit'); +const cacheControlHeader = require('../middlewares/cache-control-header'); +const cacheChannelHeader = require('../middlewares/cache-channel-header'); +const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); +const lastModifiedHeader = require('../middlewares/last-modified-header'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const DEFAULT_ZOOM_CENTER = { diff --git a/lib/cartodb/routers/template/tile.js b/lib/cartodb/routers/template/tile.js index 86404100..730f7e9d 100644 --- a/lib/cartodb/routers/template/tile.js +++ b/lib/cartodb/routers/template/tile.js @@ -1,14 +1,14 @@ -const cleanUpQueryParams = require('../../middleware/clean-up-query-params'); -const credentials = require('../../middleware/credentials'); -const dbConnSetup = require('../../middleware/db-conn-setup'); -const authorize = require('../../middleware/authorize'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const authorize = require('../middlewares/authorize'); const namedMapProvider = require('./middlewares/named-map-provider'); -const cacheControlHeader = require('../../middleware/cache-control-header'); -const cacheChannelHeader = require('../../middleware/cache-channel-header'); -const surrogateKeyHeader = require('../../middleware/surrogate-key-header'); -const lastModifiedHeader = require('../../middleware/last-modified-header'); -const vectorError = require('../../middleware/vector-error'); -const rateLimit = require('../../middleware/rate-limit'); +const cacheControlHeader = require('../middlewares/cache-control-header'); +const cacheChannelHeader = require('../middlewares/cache-channel-header'); +const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); +const lastModifiedHeader = require('../middlewares/last-modified-header'); +const vectorError = require('../middlewares/vector-error'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; function TileTemplateController ( diff --git a/test/acceptance/rate-limit.test.js b/test/acceptance/rate-limit.test.js index eb9f8954..568db07b 100644 --- a/test/acceptance/rate-limit.test.js +++ b/test/acceptance/rate-limit.test.js @@ -6,10 +6,10 @@ const RedisPool = require('redis-mpool'); const cartodbRedis = require('cartodb-redis'); const TestClient = require('../support/test-client'); const UserLimitsApi = require('../../lib/cartodb/api/user_limits_api'); -const rateLimitMiddleware = require('../../lib/cartodb/middleware/rate-limit'); +const rateLimitMiddleware = require('../../lib/cartodb/routers/middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimitMiddleware; -let userLimitsApi; +let userLimitsApi; let rateLimit; let redisClient; let testClient; @@ -112,11 +112,11 @@ function assertGetLayergroupRequest (status, limit, remaining, reset, retry, don 'Carto-Rate-Limit-Reset': reset } }; - + if(retry) { response.headers['Retry-After'] = retry; } - + testClient.getLayergroup({ response }, err => { assert.ifError(err); if (done) { @@ -133,11 +133,11 @@ function assertRateLimitRequest (status, limit, remaining, reset, retry, done) { "Carto-Rate-Limit-Remaining": remaining, "Carto-Rate-Limit-Reset": reset }; - + if(retry) { expectedHeaders['Retry-After'] = retry; } - + assert.deepEqual(res.headers, expectedHeaders); if(status === 200) { @@ -160,7 +160,7 @@ describe('rate limit', function() { before(function() { global.environment.enabledFeatures.rateLimitsEnabled = true; global.environment.enabledFeatures.rateLimitsByEndpoint.anonymous = true; - + redisClient = redis.createClient(global.environment.redis.port); testClient = new TestClient(createMapConfig(), 1234); }); @@ -183,7 +183,7 @@ describe('rate limit', function() { done(); }); }); - }); + }); it('should not be rate limited', function (done) { const count = 1; @@ -257,9 +257,9 @@ describe('rate limit middleware', function () { it("1 req/sec: 2 req/seg should be limited, removing SHA script from Redis", function (done) { userLimitsApi.metadataBackend.redisCmd( - 8, - 'SCRIPT', - ['FLUSH'], + 8, + 'SCRIPT', + ['FLUSH'], function () { assertRateLimitRequest(200, 1, 0, 1); setTimeout( () => assertRateLimitRequest(429, 1, 0, 0, 1), 500); @@ -277,7 +277,7 @@ describe('rate limit and vector tiles', function () { before(function(done) { global.environment.enabledFeatures.rateLimitsEnabled = true; global.environment.enabledFeatures.rateLimitsByEndpoint.tile = true; - + redisClient = redis.createClient(global.environment.redis.port); const count = 1; const period = 1; @@ -287,9 +287,9 @@ describe('rate limit and vector tiles', function () { testClient = new TestClient(createMapConfig(), 1234); testClient.getLayergroup({status: 200}, (err, res) => { assert.ifError(err); - + layergroupid = res.layergroupid; - + done(); }); }); @@ -336,12 +336,12 @@ describe('rate limit and vector tiles', function () { testClient.getTile(0, 0, 0, tileParams(204, '1', '0', '1'), (err) => { assert.ifError(err); - + testClient.getTile( - 0, - 0, - 0, - tileParams(429, '1', '0', '0', '1', 'application/x-protobuf'), + 0, + 0, + 0, + tileParams(429, '1', '0', '0', '1', 'application/x-protobuf'), (err, res, tile) => { assert.ifError(err); @@ -350,11 +350,11 @@ describe('rate limit and vector tiles', function () { assert.equal(tileJSON.length, 2); assert.equal(tileJSON[0].name, 'errorTileSquareLayer'); assert.equal(tileJSON[1].name, 'errorTileStripesLayer'); - + done(); } - ); + ); }); - + }); }); diff --git a/test/unit/cartodb/error-middleware.test.js b/test/unit/cartodb/error-middleware.test.js index 861bec54..74cb8fa5 100644 --- a/test/unit/cartodb/error-middleware.test.js +++ b/test/unit/cartodb/error-middleware.test.js @@ -1,7 +1,7 @@ require('../../support/test_helper.js'); var assert = require('assert'); -var errorMiddleware = require('../../../lib/cartodb/middleware/error-middleware'); +var errorMiddleware = require('../../../lib/cartodb/routers/middlewares/error-middleware'); describe('error-middleware', function() { @@ -28,7 +28,7 @@ describe('error-middleware', function() { error.subtype = 'test subtype'; const errors = [error, error]; - + const req = {}; const res = { headers: {}, @@ -43,7 +43,7 @@ describe('error-middleware', function() { send () {} }; - const errorHeader = { + const errorHeader = { mainError: { statusCode: 400, message: error.message, @@ -133,7 +133,7 @@ describe('error-middleware', function() { error.subtype = badString; const errors = [error, error]; - + const req = {}; const res = { headers: {}, @@ -148,7 +148,7 @@ describe('error-middleware', function() { send () {} }; - const errorHeader = { + const errorHeader = { mainError: { statusCode: 400, message: escapedString, diff --git a/test/unit/cartodb/error_messages.test.js b/test/unit/cartodb/error_messages.test.js index bfe0b03a..dfc489de 100644 --- a/test/unit/cartodb/error_messages.test.js +++ b/test/unit/cartodb/error_messages.test.js @@ -2,7 +2,7 @@ require('../../support/test_helper'); var assert = require('assert'); -var errorMiddleware = require('../../../lib/cartodb/middleware/error-middleware'); +var errorMiddleware = require('../../../lib/cartodb/routers/middlewares/error-middleware'); describe('error messages clean up', function() { diff --git a/test/unit/cartodb/lzmaMiddleware.test.js b/test/unit/cartodb/lzmaMiddleware.test.js index 3ad81962..06219a4d 100644 --- a/test/unit/cartodb/lzmaMiddleware.test.js +++ b/test/unit/cartodb/lzmaMiddleware.test.js @@ -1,7 +1,7 @@ var assert = require('assert'); var testHelper = require('../../support/test_helper'); -var lzmaMiddleware = require('../../../lib/cartodb/middleware/lzma'); +var lzmaMiddleware = require('../../../lib/cartodb/routers/middlewares/lzma'); describe('lzma-middleware', function() { diff --git a/test/unit/cartodb/prepare-context.test.js b/test/unit/cartodb/prepare-context.test.js index ff311cc6..37265f23 100644 --- a/test/unit/cartodb/prepare-context.test.js +++ b/test/unit/cartodb/prepare-context.test.js @@ -7,10 +7,10 @@ var PgConnection = require('../../../lib/cartodb/backends/pg_connection'); var AuthApi = require('../../../lib/cartodb/api/auth_api'); var TemplateMaps = require('../../../lib/cartodb/backends/template_maps'); -const cleanUpQueryParamsMiddleware = require('../../../lib/cartodb/middleware/clean-up-query-params'); -const authorizeMiddleware = require('../../../lib/cartodb/middleware/authorize'); -const dbConnSetupMiddleware = require('../../../lib/cartodb/middleware/db-conn-setup'); -const credentialsMiddleware = require('../../../lib/cartodb/middleware/credentials'); +const cleanUpQueryParamsMiddleware = require('../../../lib/cartodb/routers/middlewares/clean-up-query-params'); +const authorizeMiddleware = require('../../../lib/cartodb/routers/middlewares/authorize'); +const dbConnSetupMiddleware = require('../../../lib/cartodb/routers/middlewares/db-conn-setup'); +const credentialsMiddleware = require('../../../lib/cartodb/routers/middlewares/credentials'); var windshaft = require('windshaft'); From 6167562758bcbb171f1a5020e46635285c4dbc97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 9 Apr 2018 16:18:30 +0200 Subject: [PATCH 37/54] Meet application logic and folder struture --- lib/cartodb/{routers => api}/api-router.js | 14 +++++++------- .../map/analyses-catalog-controller.js} | 14 +++++++------- .../map/analysis-layergroup-controller.js} | 0 .../map/anonymous-map-controller.js} | 18 +++++++++--------- .../map/attributes-layergroup-controller.js} | 2 +- .../map/dataview-layergroup-controller.js} | 2 +- lib/cartodb/{routers => api/map}/map-router.js | 18 +++++++++--------- .../map/preview-layergroup-controller.js} | 2 +- .../map/preview-template-controller.js} | 2 +- .../map/tile-layergroup-controller.js} | 2 +- .../middlewares/augment-layergroup-data.js | 0 .../{routers => api}/middlewares/authorize.js | 0 .../middlewares/cache-channel-header.js | 0 .../middlewares/cache-control-header.js | 0 .../middlewares/check-json-content-type.js | 0 .../middlewares/clean-up-query-params.js | 0 .../{routers => api}/middlewares/cors.js | 0 .../middlewares/credentials.js | 0 .../middlewares/db-conn-setup.js | 0 .../middlewares/error-middleware.js | 0 .../middlewares/increment-map-view-count.js | 0 .../map => api}/middlewares/init-profiler.js | 0 .../middlewares/last-modified-header.js | 0 .../last-updated-time-layergroup.js | 0 .../map => api}/middlewares/layer-stats.js | 0 .../middlewares/layergroup-id-header.js | 0 .../middlewares/layergroup-metadata.js | 0 .../middlewares/layergroup-token.js | 0 .../{routers => api}/middlewares/logger.js | 0 .../{routers => api}/middlewares/lzma.js | 0 .../map => api}/middlewares/map-error.js | 0 .../map-store-map-config-provider.js | 2 +- .../middlewares/named-map-provider.js | 0 .../{routers => api}/middlewares/rate-limit.js | 0 .../middlewares/send-response.js | 0 .../middlewares/served-by-host-header.js | 0 .../{routers => api}/middlewares/stats.js | 0 .../middlewares/surrogate-key-header.js | 0 .../middlewares/syntax-error.js | 0 .../{routers => api}/middlewares/user.js | 0 .../middlewares/vector-error.js | 0 .../template/admin-template-controller.js} | 0 .../template/named-template-controller.js} | 18 +++++++++--------- .../template}/template-router.js | 6 +++--- .../template/tile-template-controller.js} | 2 +- lib/cartodb/{ => backends}/api/auth_api.js | 0 .../{ => backends}/api/filter_stats_api.js | 2 +- .../api/overviews_metadata_api.js | 2 +- .../{ => backends}/api/tables_extent_api.js | 0 .../{ => backends}/api/user_limits_api.js | 0 ...erver-info.js => server-info-controller.js} | 2 +- lib/cartodb/server.js | 4 ++-- test/acceptance/rate-limit.test.js | 4 ++-- .../integration/mapconfig_overviews_adapter.js | 4 ++-- test/integration/overviews-metadata-api.js | 2 +- test/unit/cartodb/error-middleware.test.js | 2 +- test/unit/cartodb/error_messages.test.js | 2 +- test/unit/cartodb/lzmaMiddleware.test.js | 2 +- test/unit/cartodb/prepare-context.test.js | 10 +++++----- 59 files changed, 69 insertions(+), 69 deletions(-) rename lib/cartodb/{routers => api}/api-router.js (96%) rename lib/cartodb/{routers/analyses.js => api/map/analyses-catalog-controller.js} (89%) rename lib/cartodb/{routers/layergroup/analysis.js => api/map/analysis-layergroup-controller.js} (100%) rename lib/cartodb/{routers/map/anonymous.js => api/map/anonymous-map-controller.js} (91%) rename lib/cartodb/{routers/layergroup/attributes.js => api/map/attributes-layergroup-controller.js} (96%) rename lib/cartodb/{routers/layergroup/dataview.js => api/map/dataview-layergroup-controller.js} (98%) rename lib/cartodb/{routers => api/map}/map-router.js (84%) rename lib/cartodb/{routers/layergroup/preview.js => api/map/preview-layergroup-controller.js} (98%) rename lib/cartodb/{routers/template/preview.js => api/map/preview-template-controller.js} (99%) rename lib/cartodb/{routers/layergroup/tile.js => api/map/tile-layergroup-controller.js} (98%) rename lib/cartodb/{routers/map => api}/middlewares/augment-layergroup-data.js (100%) rename lib/cartodb/{routers => api}/middlewares/authorize.js (100%) rename lib/cartodb/{routers => api}/middlewares/cache-channel-header.js (100%) rename lib/cartodb/{routers => api}/middlewares/cache-control-header.js (100%) rename lib/cartodb/{routers/map => api}/middlewares/check-json-content-type.js (100%) rename lib/cartodb/{routers => api}/middlewares/clean-up-query-params.js (100%) rename lib/cartodb/{routers => api}/middlewares/cors.js (100%) rename lib/cartodb/{routers => api}/middlewares/credentials.js (100%) rename lib/cartodb/{routers => api}/middlewares/db-conn-setup.js (100%) rename lib/cartodb/{routers => api}/middlewares/error-middleware.js (100%) rename lib/cartodb/{routers/map => api}/middlewares/increment-map-view-count.js (100%) rename lib/cartodb/{routers/map => api}/middlewares/init-profiler.js (100%) rename lib/cartodb/{routers => api}/middlewares/last-modified-header.js (100%) rename lib/cartodb/{routers/map => api}/middlewares/last-updated-time-layergroup.js (100%) rename lib/cartodb/{routers/map => api}/middlewares/layer-stats.js (100%) rename lib/cartodb/{routers/map => api}/middlewares/layergroup-id-header.js (100%) rename lib/cartodb/{routers/map => api}/middlewares/layergroup-metadata.js (100%) rename lib/cartodb/{routers => api}/middlewares/layergroup-token.js (100%) rename lib/cartodb/{routers => api}/middlewares/logger.js (100%) rename lib/cartodb/{routers => api}/middlewares/lzma.js (100%) rename lib/cartodb/{routers/map => api}/middlewares/map-error.js (100%) rename lib/cartodb/{routers/layergroup => api}/middlewares/map-store-map-config-provider.js (91%) rename lib/cartodb/{routers/template => api}/middlewares/named-map-provider.js (100%) rename lib/cartodb/{routers => api}/middlewares/rate-limit.js (100%) rename lib/cartodb/{routers => api}/middlewares/send-response.js (100%) rename lib/cartodb/{routers => api}/middlewares/served-by-host-header.js (100%) rename lib/cartodb/{routers => api}/middlewares/stats.js (100%) rename lib/cartodb/{routers => api}/middlewares/surrogate-key-header.js (100%) rename lib/cartodb/{routers => api}/middlewares/syntax-error.js (100%) rename lib/cartodb/{routers => api}/middlewares/user.js (100%) rename lib/cartodb/{routers => api}/middlewares/vector-error.js (100%) rename lib/cartodb/{routers/template/admin.js => api/template/admin-template-controller.js} (100%) rename lib/cartodb/{routers/map/named.js => api/template/named-template-controller.js} (91%) rename lib/cartodb/{routers => api/template}/template-router.js (89%) rename lib/cartodb/{routers/template/tile.js => api/template/tile-template-controller.js} (97%) rename lib/cartodb/{ => backends}/api/auth_api.js (100%) rename lib/cartodb/{ => backends}/api/filter_stats_api.js (96%) rename lib/cartodb/{ => backends}/api/overviews_metadata_api.js (95%) rename lib/cartodb/{ => backends}/api/tables_extent_api.js (100%) rename lib/cartodb/{ => backends}/api/user_limits_api.js (100%) rename lib/cartodb/{routers/server-info.js => server-info-controller.js} (96%) diff --git a/lib/cartodb/routers/api-router.js b/lib/cartodb/api/api-router.js similarity index 96% rename from lib/cartodb/routers/api-router.js rename to lib/cartodb/api/api-router.js index ca46d6ae..4608d477 100644 --- a/lib/cartodb/routers/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -13,11 +13,11 @@ const TemplateMaps = require('../backends/template_maps.js'); const PgQueryRunner = require('../backends/pg_query_runner'); const StatsBackend = require('../backends/stats'); -const AuthApi = require('../api/auth_api'); -const UserLimitsApi = require('../api/user_limits_api'); -const OverviewsMetadataApi = require('../api/overviews_metadata_api'); -const FilterStatsApi = require('../api/filter_stats_api'); -const TablesExtentApi = require('../api/tables_extent_api'); +const AuthApi = require('../backends/api/auth_api'); +const UserLimitsApi = require('../backends/api/user_limits_api'); +const OverviewsMetadataApi = require('../backends/api/overviews_metadata_api'); +const FilterStatsApi = require('../backends/api/filter_stats_api'); +const TablesExtentApi = require('../backends/api/tables_extent_api'); const LayergroupAffectedTablesCache = require('../cache/layergroup_affected_tables'); const SurrogateKeysCache = require('../cache/surrogate_keys_cache'); @@ -51,8 +51,8 @@ const sendResponse = require('./middlewares/send-response'); const syntaxError = require('./middlewares/syntax-error'); const errorMiddleware = require('./middlewares/error-middleware'); -const MapRouter = require('./map-router'); -const TemplateRouter = require('./template-router'); +const MapRouter = require('./map/map-router'); +const TemplateRouter = require('./template/template-router'); module.exports = class ApiRouter { constructor ({ serverOptions, environmentOptions }) { diff --git a/lib/cartodb/routers/analyses.js b/lib/cartodb/api/map/analyses-catalog-controller.js similarity index 89% rename from lib/cartodb/routers/analyses.js rename to lib/cartodb/api/map/analyses-catalog-controller.js index 145d6a0d..300345c2 100644 --- a/lib/cartodb/routers/analyses.js +++ b/lib/cartodb/api/map/analyses-catalog-controller.js @@ -1,12 +1,12 @@ const PSQL = require('cartodb-psql'); -const cleanUpQueryParams = require('./middlewares/clean-up-query-params'); -const credentials = require('./middlewares/credentials'); -const authorize = require('./middlewares/authorize'); -const dbConnSetup = require('./middlewares/db-conn-setup'); -const rateLimit = require('./middlewares/rate-limit'); +const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); +const credentials = require('../middlewares/credentials'); +const authorize = require('../middlewares/authorize'); +const dbConnSetup = require('../middlewares/db-conn-setup'); +const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; -const cacheControlHeader = require('./middlewares/cache-control-header'); -const dbParamsFromResLocals = require('../utils/database-params'); +const cacheControlHeader = require('../middlewares/cache-control-header'); +const dbParamsFromResLocals = require('../../utils/database-params'); function AnalysesController(pgConnection, authApi, userLimitsApi) { this.pgConnection = pgConnection; diff --git a/lib/cartodb/routers/layergroup/analysis.js b/lib/cartodb/api/map/analysis-layergroup-controller.js similarity index 100% rename from lib/cartodb/routers/layergroup/analysis.js rename to lib/cartodb/api/map/analysis-layergroup-controller.js diff --git a/lib/cartodb/routers/map/anonymous.js b/lib/cartodb/api/map/anonymous-map-controller.js similarity index 91% rename from lib/cartodb/routers/map/anonymous.js rename to lib/cartodb/api/map/anonymous-map-controller.js index 3e2a3582..4c65988b 100644 --- a/lib/cartodb/routers/map/anonymous.js +++ b/lib/cartodb/api/map/anonymous-map-controller.js @@ -5,19 +5,19 @@ const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); const credentials = require('../middlewares/credentials'); const dbConnSetup = require('../middlewares/db-conn-setup'); const authorize = require('../middlewares/authorize'); -const initProfiler = require('./middlewares/init-profiler'); -const checkJsonContentType = require('./middlewares/check-json-content-type'); -const incrementMapViewCount = require('./middlewares/increment-map-view-count'); -const augmentLayergroupData = require('./middlewares/augment-layergroup-data'); +const initProfiler = require('../middlewares/init-profiler'); +const checkJsonContentType = require('../middlewares/check-json-content-type'); +const incrementMapViewCount = require('../middlewares/increment-map-view-count'); +const augmentLayergroupData = require('../middlewares/augment-layergroup-data'); const cacheControlHeader = require('../middlewares/cache-control-header'); const cacheChannelHeader = require('../middlewares/cache-channel-header'); const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); const lastModifiedHeader = require('../middlewares/last-modified-header'); -const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); -const layerStats = require('./middlewares/layer-stats'); -const layergroupIdHeader = require('./middlewares/layergroup-id-header'); -const layergroupMetadata = require('./middlewares/layergroup-metadata'); -const mapError = require('./middlewares/map-error'); +const lastUpdatedTimeLayergroup = require('../middlewares/last-updated-time-layergroup'); +const layerStats = require('../middlewares/layer-stats'); +const layergroupIdHeader = require('../middlewares/layergroup-id-header'); +const layergroupMetadata = require('../middlewares/layergroup-metadata'); +const mapError = require('../middlewares/map-error'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; diff --git a/lib/cartodb/routers/layergroup/attributes.js b/lib/cartodb/api/map/attributes-layergroup-controller.js similarity index 96% rename from lib/cartodb/routers/layergroup/attributes.js rename to lib/cartodb/api/map/attributes-layergroup-controller.js index 3666483a..52ba5f30 100644 --- a/lib/cartodb/routers/layergroup/attributes.js +++ b/lib/cartodb/api/map/attributes-layergroup-controller.js @@ -5,7 +5,7 @@ const dbConnSetup = require('../middlewares/db-conn-setup'); const authorize = require('../middlewares/authorize'); const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; -const createMapStoreMapConfigProvider = require('./middlewares/map-store-map-config-provider'); +const createMapStoreMapConfigProvider = require('../middlewares/map-store-map-config-provider'); const cacheControlHeader = require('../middlewares/cache-control-header'); const cacheChannelHeader = require('../middlewares/cache-channel-header'); const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); diff --git a/lib/cartodb/routers/layergroup/dataview.js b/lib/cartodb/api/map/dataview-layergroup-controller.js similarity index 98% rename from lib/cartodb/routers/layergroup/dataview.js rename to lib/cartodb/api/map/dataview-layergroup-controller.js index 559a51d2..219723bc 100644 --- a/lib/cartodb/routers/layergroup/dataview.js +++ b/lib/cartodb/api/map/dataview-layergroup-controller.js @@ -5,7 +5,7 @@ const dbConnSetup = require('../middlewares/db-conn-setup'); const authorize = require('../middlewares/authorize'); const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; -const createMapStoreMapConfigProvider = require('./middlewares/map-store-map-config-provider'); +const createMapStoreMapConfigProvider = require('../middlewares/map-store-map-config-provider'); const cacheControlHeader = require('../middlewares/cache-control-header'); const cacheChannelHeader = require('../middlewares/cache-channel-header'); const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); diff --git a/lib/cartodb/routers/map-router.js b/lib/cartodb/api/map/map-router.js similarity index 84% rename from lib/cartodb/routers/map-router.js rename to lib/cartodb/api/map/map-router.js index d02cd563..8303040f 100644 --- a/lib/cartodb/routers/map-router.js +++ b/lib/cartodb/api/map/map-router.js @@ -1,13 +1,13 @@ const { Router: router } = require('express'); -const AnalysisLayergroupController = require('./layergroup/analysis'); -const AttributesLayergroupController = require('./layergroup/attributes'); -const DataviewLayergroupController = require('./layergroup/dataview'); -const PreviewLayergroupController = require('./layergroup/preview'); -const TileLayergroupController = require('./layergroup/tile'); -const AnonymousMapController = require('./map/anonymous'); -const PreviewTemplateController = require('./template/preview'); -const AnalysesController = require('./analyses'); +const AnalysisLayergroupController = require('./analysis-layergroup-controller'); +const AttributesLayergroupController = require('./attributes-layergroup-controller'); +const DataviewLayergroupController = require('./dataview-layergroup-controller'); +const PreviewLayergroupController = require('./preview-layergroup-controller'); +const TileLayergroupController = require('./tile-layergroup-controller'); +const AnonymousMapController = require('./anonymous-map-controller'); +const PreviewTemplateController = require('./preview-template-controller'); +const AnalysesCatalogController = require('./analyses-catalog-controller'); module.exports = class MapRouter { constructor ({ collaborators }) { @@ -108,7 +108,7 @@ module.exports = class MapRouter { userLimitsApi ); - this.analysesController = new AnalysesController( + this.analysesController = new AnalysesCatalogController( pgConnection, authApi, userLimitsApi diff --git a/lib/cartodb/routers/layergroup/preview.js b/lib/cartodb/api/map/preview-layergroup-controller.js similarity index 98% rename from lib/cartodb/routers/layergroup/preview.js rename to lib/cartodb/api/map/preview-layergroup-controller.js index d22efffd..1fbf7754 100644 --- a/lib/cartodb/routers/layergroup/preview.js +++ b/lib/cartodb/api/map/preview-layergroup-controller.js @@ -5,7 +5,7 @@ const dbConnSetup = require('../middlewares/db-conn-setup'); const authorize = require('../middlewares/authorize'); const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; -const createMapStoreMapConfigProvider = require('./middlewares/map-store-map-config-provider'); +const createMapStoreMapConfigProvider = require('../middlewares/map-store-map-config-provider'); const cacheControlHeader = require('../middlewares/cache-control-header'); const cacheChannelHeader = require('../middlewares/cache-channel-header'); const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); diff --git a/lib/cartodb/routers/template/preview.js b/lib/cartodb/api/map/preview-template-controller.js similarity index 99% rename from lib/cartodb/routers/template/preview.js rename to lib/cartodb/api/map/preview-template-controller.js index 224579ad..ecce4b7f 100644 --- a/lib/cartodb/routers/template/preview.js +++ b/lib/cartodb/api/map/preview-template-controller.js @@ -2,7 +2,7 @@ const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); const credentials = require('../middlewares/credentials'); const dbConnSetup = require('../middlewares/db-conn-setup'); const authorize = require('../middlewares/authorize'); -const namedMapProvider = require('./middlewares/named-map-provider'); +const namedMapProvider = require('../middlewares/named-map-provider'); const cacheControlHeader = require('../middlewares/cache-control-header'); const cacheChannelHeader = require('../middlewares/cache-channel-header'); const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); diff --git a/lib/cartodb/routers/layergroup/tile.js b/lib/cartodb/api/map/tile-layergroup-controller.js similarity index 98% rename from lib/cartodb/routers/layergroup/tile.js rename to lib/cartodb/api/map/tile-layergroup-controller.js index 0443ca4e..34abcbda 100644 --- a/lib/cartodb/routers/layergroup/tile.js +++ b/lib/cartodb/api/map/tile-layergroup-controller.js @@ -5,7 +5,7 @@ const dbConnSetup = require('../middlewares/db-conn-setup'); const authorize = require('../middlewares/authorize'); const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; -const createMapStoreMapConfigProvider = require('./middlewares/map-store-map-config-provider'); +const createMapStoreMapConfigProvider = require('../middlewares/map-store-map-config-provider'); const cacheControlHeader = require('../middlewares/cache-control-header'); const cacheChannelHeader = require('../middlewares/cache-channel-header'); const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); diff --git a/lib/cartodb/routers/map/middlewares/augment-layergroup-data.js b/lib/cartodb/api/middlewares/augment-layergroup-data.js similarity index 100% rename from lib/cartodb/routers/map/middlewares/augment-layergroup-data.js rename to lib/cartodb/api/middlewares/augment-layergroup-data.js diff --git a/lib/cartodb/routers/middlewares/authorize.js b/lib/cartodb/api/middlewares/authorize.js similarity index 100% rename from lib/cartodb/routers/middlewares/authorize.js rename to lib/cartodb/api/middlewares/authorize.js diff --git a/lib/cartodb/routers/middlewares/cache-channel-header.js b/lib/cartodb/api/middlewares/cache-channel-header.js similarity index 100% rename from lib/cartodb/routers/middlewares/cache-channel-header.js rename to lib/cartodb/api/middlewares/cache-channel-header.js diff --git a/lib/cartodb/routers/middlewares/cache-control-header.js b/lib/cartodb/api/middlewares/cache-control-header.js similarity index 100% rename from lib/cartodb/routers/middlewares/cache-control-header.js rename to lib/cartodb/api/middlewares/cache-control-header.js diff --git a/lib/cartodb/routers/map/middlewares/check-json-content-type.js b/lib/cartodb/api/middlewares/check-json-content-type.js similarity index 100% rename from lib/cartodb/routers/map/middlewares/check-json-content-type.js rename to lib/cartodb/api/middlewares/check-json-content-type.js diff --git a/lib/cartodb/routers/middlewares/clean-up-query-params.js b/lib/cartodb/api/middlewares/clean-up-query-params.js similarity index 100% rename from lib/cartodb/routers/middlewares/clean-up-query-params.js rename to lib/cartodb/api/middlewares/clean-up-query-params.js diff --git a/lib/cartodb/routers/middlewares/cors.js b/lib/cartodb/api/middlewares/cors.js similarity index 100% rename from lib/cartodb/routers/middlewares/cors.js rename to lib/cartodb/api/middlewares/cors.js diff --git a/lib/cartodb/routers/middlewares/credentials.js b/lib/cartodb/api/middlewares/credentials.js similarity index 100% rename from lib/cartodb/routers/middlewares/credentials.js rename to lib/cartodb/api/middlewares/credentials.js diff --git a/lib/cartodb/routers/middlewares/db-conn-setup.js b/lib/cartodb/api/middlewares/db-conn-setup.js similarity index 100% rename from lib/cartodb/routers/middlewares/db-conn-setup.js rename to lib/cartodb/api/middlewares/db-conn-setup.js diff --git a/lib/cartodb/routers/middlewares/error-middleware.js b/lib/cartodb/api/middlewares/error-middleware.js similarity index 100% rename from lib/cartodb/routers/middlewares/error-middleware.js rename to lib/cartodb/api/middlewares/error-middleware.js diff --git a/lib/cartodb/routers/map/middlewares/increment-map-view-count.js b/lib/cartodb/api/middlewares/increment-map-view-count.js similarity index 100% rename from lib/cartodb/routers/map/middlewares/increment-map-view-count.js rename to lib/cartodb/api/middlewares/increment-map-view-count.js diff --git a/lib/cartodb/routers/map/middlewares/init-profiler.js b/lib/cartodb/api/middlewares/init-profiler.js similarity index 100% rename from lib/cartodb/routers/map/middlewares/init-profiler.js rename to lib/cartodb/api/middlewares/init-profiler.js diff --git a/lib/cartodb/routers/middlewares/last-modified-header.js b/lib/cartodb/api/middlewares/last-modified-header.js similarity index 100% rename from lib/cartodb/routers/middlewares/last-modified-header.js rename to lib/cartodb/api/middlewares/last-modified-header.js diff --git a/lib/cartodb/routers/map/middlewares/last-updated-time-layergroup.js b/lib/cartodb/api/middlewares/last-updated-time-layergroup.js similarity index 100% rename from lib/cartodb/routers/map/middlewares/last-updated-time-layergroup.js rename to lib/cartodb/api/middlewares/last-updated-time-layergroup.js diff --git a/lib/cartodb/routers/map/middlewares/layer-stats.js b/lib/cartodb/api/middlewares/layer-stats.js similarity index 100% rename from lib/cartodb/routers/map/middlewares/layer-stats.js rename to lib/cartodb/api/middlewares/layer-stats.js diff --git a/lib/cartodb/routers/map/middlewares/layergroup-id-header.js b/lib/cartodb/api/middlewares/layergroup-id-header.js similarity index 100% rename from lib/cartodb/routers/map/middlewares/layergroup-id-header.js rename to lib/cartodb/api/middlewares/layergroup-id-header.js diff --git a/lib/cartodb/routers/map/middlewares/layergroup-metadata.js b/lib/cartodb/api/middlewares/layergroup-metadata.js similarity index 100% rename from lib/cartodb/routers/map/middlewares/layergroup-metadata.js rename to lib/cartodb/api/middlewares/layergroup-metadata.js diff --git a/lib/cartodb/routers/middlewares/layergroup-token.js b/lib/cartodb/api/middlewares/layergroup-token.js similarity index 100% rename from lib/cartodb/routers/middlewares/layergroup-token.js rename to lib/cartodb/api/middlewares/layergroup-token.js diff --git a/lib/cartodb/routers/middlewares/logger.js b/lib/cartodb/api/middlewares/logger.js similarity index 100% rename from lib/cartodb/routers/middlewares/logger.js rename to lib/cartodb/api/middlewares/logger.js diff --git a/lib/cartodb/routers/middlewares/lzma.js b/lib/cartodb/api/middlewares/lzma.js similarity index 100% rename from lib/cartodb/routers/middlewares/lzma.js rename to lib/cartodb/api/middlewares/lzma.js diff --git a/lib/cartodb/routers/map/middlewares/map-error.js b/lib/cartodb/api/middlewares/map-error.js similarity index 100% rename from lib/cartodb/routers/map/middlewares/map-error.js rename to lib/cartodb/api/middlewares/map-error.js diff --git a/lib/cartodb/routers/layergroup/middlewares/map-store-map-config-provider.js b/lib/cartodb/api/middlewares/map-store-map-config-provider.js similarity index 91% rename from lib/cartodb/routers/layergroup/middlewares/map-store-map-config-provider.js rename to lib/cartodb/api/middlewares/map-store-map-config-provider.js index 7d64cb01..f84dd3fc 100644 --- a/lib/cartodb/routers/layergroup/middlewares/map-store-map-config-provider.js +++ b/lib/cartodb/api/middlewares/map-store-map-config-provider.js @@ -1,4 +1,4 @@ -const MapStoreMapConfigProvider = require('../../../models/mapconfig/provider/map-store-provider'); +const MapStoreMapConfigProvider = require('../../models/mapconfig/provider/map-store-provider'); module.exports = function createMapStoreMapConfigProvider ( mapStore, diff --git a/lib/cartodb/routers/template/middlewares/named-map-provider.js b/lib/cartodb/api/middlewares/named-map-provider.js similarity index 100% rename from lib/cartodb/routers/template/middlewares/named-map-provider.js rename to lib/cartodb/api/middlewares/named-map-provider.js diff --git a/lib/cartodb/routers/middlewares/rate-limit.js b/lib/cartodb/api/middlewares/rate-limit.js similarity index 100% rename from lib/cartodb/routers/middlewares/rate-limit.js rename to lib/cartodb/api/middlewares/rate-limit.js diff --git a/lib/cartodb/routers/middlewares/send-response.js b/lib/cartodb/api/middlewares/send-response.js similarity index 100% rename from lib/cartodb/routers/middlewares/send-response.js rename to lib/cartodb/api/middlewares/send-response.js diff --git a/lib/cartodb/routers/middlewares/served-by-host-header.js b/lib/cartodb/api/middlewares/served-by-host-header.js similarity index 100% rename from lib/cartodb/routers/middlewares/served-by-host-header.js rename to lib/cartodb/api/middlewares/served-by-host-header.js diff --git a/lib/cartodb/routers/middlewares/stats.js b/lib/cartodb/api/middlewares/stats.js similarity index 100% rename from lib/cartodb/routers/middlewares/stats.js rename to lib/cartodb/api/middlewares/stats.js diff --git a/lib/cartodb/routers/middlewares/surrogate-key-header.js b/lib/cartodb/api/middlewares/surrogate-key-header.js similarity index 100% rename from lib/cartodb/routers/middlewares/surrogate-key-header.js rename to lib/cartodb/api/middlewares/surrogate-key-header.js diff --git a/lib/cartodb/routers/middlewares/syntax-error.js b/lib/cartodb/api/middlewares/syntax-error.js similarity index 100% rename from lib/cartodb/routers/middlewares/syntax-error.js rename to lib/cartodb/api/middlewares/syntax-error.js diff --git a/lib/cartodb/routers/middlewares/user.js b/lib/cartodb/api/middlewares/user.js similarity index 100% rename from lib/cartodb/routers/middlewares/user.js rename to lib/cartodb/api/middlewares/user.js diff --git a/lib/cartodb/routers/middlewares/vector-error.js b/lib/cartodb/api/middlewares/vector-error.js similarity index 100% rename from lib/cartodb/routers/middlewares/vector-error.js rename to lib/cartodb/api/middlewares/vector-error.js diff --git a/lib/cartodb/routers/template/admin.js b/lib/cartodb/api/template/admin-template-controller.js similarity index 100% rename from lib/cartodb/routers/template/admin.js rename to lib/cartodb/api/template/admin-template-controller.js diff --git a/lib/cartodb/routers/map/named.js b/lib/cartodb/api/template/named-template-controller.js similarity index 91% rename from lib/cartodb/routers/map/named.js rename to lib/cartodb/api/template/named-template-controller.js index 47699e83..140523b1 100644 --- a/lib/cartodb/routers/map/named.js +++ b/lib/cartodb/api/template/named-template-controller.js @@ -2,19 +2,19 @@ const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); const credentials = require('../middlewares/credentials'); const dbConnSetup = require('../middlewares/db-conn-setup'); const authorize = require('../middlewares/authorize'); -const initProfiler = require('./middlewares/init-profiler'); -const checkJsonContentType = require('./middlewares/check-json-content-type'); -const incrementMapViewCount = require('./middlewares/increment-map-view-count'); -const augmentLayergroupData = require('./middlewares/augment-layergroup-data'); +const initProfiler = require('../middlewares/init-profiler'); +const checkJsonContentType = require('../middlewares/check-json-content-type'); +const incrementMapViewCount = require('../middlewares/increment-map-view-count'); +const augmentLayergroupData = require('../middlewares/augment-layergroup-data'); const cacheControlHeader = require('../middlewares/cache-control-header'); const cacheChannelHeader = require('../middlewares/cache-channel-header'); const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); const lastModifiedHeader = require('../middlewares/last-modified-header'); -const lastUpdatedTimeLayergroup = require('./middlewares/last-updated-time-layergroup'); -const layerStats = require('./middlewares/layer-stats'); -const layergroupIdHeader = require('./middlewares/layergroup-id-header'); -const layergroupMetadata = require('./middlewares/layergroup-metadata'); -const mapError = require('./middlewares/map-error'); +const lastUpdatedTimeLayergroup = require('../middlewares/last-updated-time-layergroup'); +const layerStats = require('../middlewares/layer-stats'); +const layergroupIdHeader = require('../middlewares/layergroup-id-header'); +const layergroupMetadata = require('../middlewares/layergroup-metadata'); +const mapError = require('../middlewares/map-error'); const NamedMapMapConfigProvider = require('../../models/mapconfig/provider/named-map-provider'); const CreateLayergroupMapConfigProvider = require('../../models/mapconfig/provider/create-layergroup-provider'); const rateLimit = require('../middlewares/rate-limit'); diff --git a/lib/cartodb/routers/template-router.js b/lib/cartodb/api/template/template-router.js similarity index 89% rename from lib/cartodb/routers/template-router.js rename to lib/cartodb/api/template/template-router.js index d549dafd..b4a70715 100644 --- a/lib/cartodb/routers/template-router.js +++ b/lib/cartodb/api/template/template-router.js @@ -1,8 +1,8 @@ const { Router: router } = require('express'); -const NamedMapController = require('./map/named'); -const AdminTemplateController = require('./template/admin'); -const TileTemplateController = require('./template/tile'); +const NamedMapController = require('./named-template-controller'); +const AdminTemplateController = require('./admin-template-controller'); +const TileTemplateController = require('./tile-template-controller'); module.exports = class TemplateRouter { constructor ({ collaborators }) { diff --git a/lib/cartodb/routers/template/tile.js b/lib/cartodb/api/template/tile-template-controller.js similarity index 97% rename from lib/cartodb/routers/template/tile.js rename to lib/cartodb/api/template/tile-template-controller.js index 730f7e9d..11c0bc19 100644 --- a/lib/cartodb/routers/template/tile.js +++ b/lib/cartodb/api/template/tile-template-controller.js @@ -2,7 +2,7 @@ const cleanUpQueryParams = require('../middlewares/clean-up-query-params'); const credentials = require('../middlewares/credentials'); const dbConnSetup = require('../middlewares/db-conn-setup'); const authorize = require('../middlewares/authorize'); -const namedMapProvider = require('./middlewares/named-map-provider'); +const namedMapProvider = require('../middlewares/named-map-provider'); const cacheControlHeader = require('../middlewares/cache-control-header'); const cacheChannelHeader = require('../middlewares/cache-channel-header'); const surrogateKeyHeader = require('../middlewares/surrogate-key-header'); diff --git a/lib/cartodb/api/auth_api.js b/lib/cartodb/backends/api/auth_api.js similarity index 100% rename from lib/cartodb/api/auth_api.js rename to lib/cartodb/backends/api/auth_api.js diff --git a/lib/cartodb/api/filter_stats_api.js b/lib/cartodb/backends/api/filter_stats_api.js similarity index 96% rename from lib/cartodb/api/filter_stats_api.js rename to lib/cartodb/backends/api/filter_stats_api.js index 31e90a25..72fd970f 100644 --- a/lib/cartodb/api/filter_stats_api.js +++ b/lib/cartodb/backends/api/filter_stats_api.js @@ -1,6 +1,6 @@ var _ = require('underscore'); var step = require('step'); -var AnalysisFilter = require('../models/filter/analysis'); +var AnalysisFilter = require('../../models/filter/analysis'); function FilterStatsApi(pgQueryRunner) { this.pgQueryRunner = pgQueryRunner; diff --git a/lib/cartodb/api/overviews_metadata_api.js b/lib/cartodb/backends/api/overviews_metadata_api.js similarity index 95% rename from lib/cartodb/api/overviews_metadata_api.js rename to lib/cartodb/backends/api/overviews_metadata_api.js index 55b4966f..dda51d7e 100644 --- a/lib/cartodb/api/overviews_metadata_api.js +++ b/lib/cartodb/backends/api/overviews_metadata_api.js @@ -1,4 +1,4 @@ -var SubstitutionTokens = require('../utils/substitution-tokens'); +var SubstitutionTokens = require('../../utils/substitution-tokens'); function OverviewsMetadataApi(pgQueryRunner) { this.pgQueryRunner = pgQueryRunner; diff --git a/lib/cartodb/api/tables_extent_api.js b/lib/cartodb/backends/api/tables_extent_api.js similarity index 100% rename from lib/cartodb/api/tables_extent_api.js rename to lib/cartodb/backends/api/tables_extent_api.js diff --git a/lib/cartodb/api/user_limits_api.js b/lib/cartodb/backends/api/user_limits_api.js similarity index 100% rename from lib/cartodb/api/user_limits_api.js rename to lib/cartodb/backends/api/user_limits_api.js diff --git a/lib/cartodb/routers/server-info.js b/lib/cartodb/server-info-controller.js similarity index 96% rename from lib/cartodb/routers/server-info.js rename to lib/cartodb/server-info-controller.js index 12f6432b..17e0649c 100644 --- a/lib/cartodb/routers/server-info.js +++ b/lib/cartodb/server-info-controller.js @@ -1,4 +1,4 @@ -var HealthCheck = require('../monitoring/health_check'); +var HealthCheck = require('./monitoring/health_check'); var WELCOME_MSG = "This is the CartoDB Maps API, " + "see the documentation at http://docs.cartodb.com/cartodb-platform/maps-api.html"; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 40f1195c..ea51f2db 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -5,8 +5,8 @@ const { mapnik } = windshaft; const jsonReplacer = require('./utils/json-replacer'); -const ApiRouter = require('./routers/api-router'); -const ServerInfoController = require('./routers/server-info'); +const ApiRouter = require('./api/api-router'); +const ServerInfoController = require('./server-info-controller'); const StatsClient = require('./stats/client'); diff --git a/test/acceptance/rate-limit.test.js b/test/acceptance/rate-limit.test.js index 568db07b..5b7cdbc0 100644 --- a/test/acceptance/rate-limit.test.js +++ b/test/acceptance/rate-limit.test.js @@ -5,8 +5,8 @@ const redis = require('redis'); const RedisPool = require('redis-mpool'); const cartodbRedis = require('cartodb-redis'); const TestClient = require('../support/test-client'); -const UserLimitsApi = require('../../lib/cartodb/api/user_limits_api'); -const rateLimitMiddleware = require('../../lib/cartodb/routers/middlewares/rate-limit'); +const UserLimitsApi = require('../../lib/cartodb/backends/api/user_limits_api'); +const rateLimitMiddleware = require('../../lib/cartodb/api/middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimitMiddleware; let userLimitsApi; diff --git a/test/integration/mapconfig_overviews_adapter.js b/test/integration/mapconfig_overviews_adapter.js index 87a87935..79196e3b 100644 --- a/test/integration/mapconfig_overviews_adapter.js +++ b/test/integration/mapconfig_overviews_adapter.js @@ -5,8 +5,8 @@ var RedisPool = require('redis-mpool'); var cartodbRedis = require('cartodb-redis'); var PgConnection = require(__dirname + '/../../lib/cartodb/backends/pg_connection'); var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); -var OverviewsMetadataApi = require('../../lib/cartodb/api/overviews_metadata_api'); -var FilterStatsApi = require('../../lib/cartodb/api/filter_stats_api'); +var OverviewsMetadataApi = require('../../lib/cartodb/backends/api/overviews_metadata_api'); +var FilterStatsApi = require('../../lib/cartodb/backends/api/filter_stats_api'); var MapConfigOverviewsAdapter = require('../../lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter'); var redisPool = new RedisPool(global.environment.redis); diff --git a/test/integration/overviews-metadata-api.js b/test/integration/overviews-metadata-api.js index 4d015870..e51c2129 100644 --- a/test/integration/overviews-metadata-api.js +++ b/test/integration/overviews-metadata-api.js @@ -7,7 +7,7 @@ var cartodbRedis = require('cartodb-redis'); var PgConnection = require('../../lib/cartodb/backends/pg_connection'); var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); -var OverviewsMetadataApi = require('../../lib/cartodb/api/overviews_metadata_api'); +var OverviewsMetadataApi = require('../../lib/cartodb/backends/api/overviews_metadata_api'); describe('OverviewsMetadataApi', function() { diff --git a/test/unit/cartodb/error-middleware.test.js b/test/unit/cartodb/error-middleware.test.js index 74cb8fa5..88b1ed6e 100644 --- a/test/unit/cartodb/error-middleware.test.js +++ b/test/unit/cartodb/error-middleware.test.js @@ -1,7 +1,7 @@ require('../../support/test_helper.js'); var assert = require('assert'); -var errorMiddleware = require('../../../lib/cartodb/routers/middlewares/error-middleware'); +var errorMiddleware = require('../../../lib/cartodb/api/middlewares/error-middleware'); describe('error-middleware', function() { diff --git a/test/unit/cartodb/error_messages.test.js b/test/unit/cartodb/error_messages.test.js index dfc489de..ecc6fe3c 100644 --- a/test/unit/cartodb/error_messages.test.js +++ b/test/unit/cartodb/error_messages.test.js @@ -2,7 +2,7 @@ require('../../support/test_helper'); var assert = require('assert'); -var errorMiddleware = require('../../../lib/cartodb/routers/middlewares/error-middleware'); +var errorMiddleware = require('../../../lib/cartodb/api/middlewares/error-middleware'); describe('error messages clean up', function() { diff --git a/test/unit/cartodb/lzmaMiddleware.test.js b/test/unit/cartodb/lzmaMiddleware.test.js index 06219a4d..9701d7ca 100644 --- a/test/unit/cartodb/lzmaMiddleware.test.js +++ b/test/unit/cartodb/lzmaMiddleware.test.js @@ -1,7 +1,7 @@ var assert = require('assert'); var testHelper = require('../../support/test_helper'); -var lzmaMiddleware = require('../../../lib/cartodb/routers/middlewares/lzma'); +var lzmaMiddleware = require('../../../lib/cartodb/api/middlewares/lzma'); describe('lzma-middleware', function() { diff --git a/test/unit/cartodb/prepare-context.test.js b/test/unit/cartodb/prepare-context.test.js index 37265f23..e9f0a320 100644 --- a/test/unit/cartodb/prepare-context.test.js +++ b/test/unit/cartodb/prepare-context.test.js @@ -4,13 +4,13 @@ var _ = require('underscore'); var RedisPool = require('redis-mpool'); var cartodbRedis = require('cartodb-redis'); var PgConnection = require('../../../lib/cartodb/backends/pg_connection'); -var AuthApi = require('../../../lib/cartodb/api/auth_api'); +var AuthApi = require('../../../lib/cartodb/backends/api/auth_api'); var TemplateMaps = require('../../../lib/cartodb/backends/template_maps'); -const cleanUpQueryParamsMiddleware = require('../../../lib/cartodb/routers/middlewares/clean-up-query-params'); -const authorizeMiddleware = require('../../../lib/cartodb/routers/middlewares/authorize'); -const dbConnSetupMiddleware = require('../../../lib/cartodb/routers/middlewares/db-conn-setup'); -const credentialsMiddleware = require('../../../lib/cartodb/routers/middlewares/credentials'); +const cleanUpQueryParamsMiddleware = require('../../../lib/cartodb/api/middlewares/clean-up-query-params'); +const authorizeMiddleware = require('../../../lib/cartodb/api/middlewares/authorize'); +const dbConnSetupMiddleware = require('../../../lib/cartodb/api/middlewares/db-conn-setup'); +const credentialsMiddleware = require('../../../lib/cartodb/api/middlewares/credentials'); var windshaft = require('windshaft'); From 8dec4814a9a025dd0c329d4430d55973aa5bb7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 9 Apr 2018 18:08:56 +0200 Subject: [PATCH 38/54] Rename AuthAppi by AuthBackend --- lib/cartodb/api/api-router.js | 6 +++--- .../api/map/analyses-catalog-controller.js | 6 +++--- .../api/map/analysis-layergroup-controller.js | 6 +++--- .../api/map/anonymous-map-controller.js | 8 ++++---- .../map/attributes-layergroup-controller.js | 6 +++--- .../api/map/dataview-layergroup-controller.js | 12 +++++------ lib/cartodb/api/map/map-router.js | 18 ++++++++--------- .../api/map/preview-layergroup-controller.js | 8 ++++---- .../api/map/preview-template-controller.js | 6 +++--- .../api/map/tile-layergroup-controller.js | 10 +++++----- lib/cartodb/api/middlewares/authorize.js | 4 ++-- .../api/template/admin-template-controller.js | 20 +++++++++---------- .../api/template/named-template-controller.js | 8 ++++---- lib/cartodb/api/template/template-router.js | 8 ++++---- .../api/template/tile-template-controller.js | 6 +++--- .../backends/{api/auth_api.js => auth.js} | 12 +++++------ test/unit/cartodb/prepare-context.test.js | 6 +++--- 17 files changed, 75 insertions(+), 75 deletions(-) rename lib/cartodb/backends/{api/auth_api.js => auth.js} (94%) diff --git a/lib/cartodb/api/api-router.js b/lib/cartodb/api/api-router.js index 4608d477..f5b40c9e 100644 --- a/lib/cartodb/api/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -12,8 +12,8 @@ const DataviewBackend = require('../backends/dataview'); const TemplateMaps = require('../backends/template_maps.js'); const PgQueryRunner = require('../backends/pg_query_runner'); const StatsBackend = require('../backends/stats'); +const AuthBackend = require('../backends/auth'); -const AuthApi = require('../backends/api/auth_api'); const UserLimitsApi = require('../backends/api/user_limits_api'); const OverviewsMetadataApi = require('../backends/api/overviews_metadata_api'); const FilterStatsApi = require('../backends/api/filter_stats_api'); @@ -113,7 +113,7 @@ module.exports = class ApiRouter { rateLimitsEnabled: global.environment.enabledFeatures.rateLimitsEnabled } }); - const authApi = new AuthApi(pgConnection, metadataBackend, mapStore, templateMaps); + const authBackend = new AuthBackend(pgConnection, metadataBackend, mapStore, templateMaps); const layergroupAffectedTablesCache = new LayergroupAffectedTablesCache(); @@ -164,7 +164,7 @@ module.exports = class ApiRouter { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache, templateMaps, mapBackend, diff --git a/lib/cartodb/api/map/analyses-catalog-controller.js b/lib/cartodb/api/map/analyses-catalog-controller.js index 300345c2..855666dd 100644 --- a/lib/cartodb/api/map/analyses-catalog-controller.js +++ b/lib/cartodb/api/map/analyses-catalog-controller.js @@ -8,9 +8,9 @@ const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const cacheControlHeader = require('../middlewares/cache-control-header'); const dbParamsFromResLocals = require('../../utils/database-params'); -function AnalysesController(pgConnection, authApi, userLimitsApi) { +function AnalysesController(pgConnection, authBackend, userLimitsApi) { this.pgConnection = pgConnection; - this.authApi = authApi; + this.authBackend = authBackend; this.userLimitsApi = userLimitsApi; } @@ -20,7 +20,7 @@ AnalysesController.prototype.register = function (mapRouter) { mapRouter.get( `/analyses/catalog`, credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS_CATALOG), cleanUpQueryParams(), diff --git a/lib/cartodb/api/map/analysis-layergroup-controller.js b/lib/cartodb/api/map/analysis-layergroup-controller.js index b2164140..e0cf3222 100644 --- a/lib/cartodb/api/map/analysis-layergroup-controller.js +++ b/lib/cartodb/api/map/analysis-layergroup-controller.js @@ -14,7 +14,7 @@ module.exports = class AnalysisLayergroupController { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ) { this.analysisStatusBackend = analysisStatusBackend; @@ -22,7 +22,7 @@ module.exports = class AnalysisLayergroupController { this.mapStore = mapStore; this.userLimitsApi = userLimitsApi; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - this.authApi = authApi; + this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; } @@ -31,7 +31,7 @@ module.exports = class AnalysisLayergroupController { `/:token/analysis/node/:nodeId`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS), cleanUpQueryParams(), diff --git a/lib/cartodb/api/map/anonymous-map-controller.js b/lib/cartodb/api/map/anonymous-map-controller.js index 4c65988b..a20b1407 100644 --- a/lib/cartodb/api/map/anonymous-map-controller.js +++ b/lib/cartodb/api/map/anonymous-map-controller.js @@ -23,7 +23,7 @@ const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; /** - * @param {AuthApi} authApi + * @param {AuthBackend} authBackend * @param {PgConnection} pgConnection * @param {TemplateMaps} templateMaps * @param {MapBackend} mapBackend @@ -45,7 +45,7 @@ function AnonymousMapController ( layergroupAffectedTables, mapConfigAdapter, statsBackend, - authApi, + authBackend, layergroupMetadata ) { this.pgConnection = pgConnection; @@ -57,7 +57,7 @@ function AnonymousMapController ( this.layergroupAffectedTables = layergroupAffectedTables; this.mapConfigAdapter = mapConfigAdapter; this.statsBackend = statsBackend; - this.authApi = authApi; + this.authBackend = authBackend; this.layergroupMetadata = layergroupMetadata; } @@ -78,7 +78,7 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { return [ credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS), cleanUpQueryParams(['aggregation']), diff --git a/lib/cartodb/api/map/attributes-layergroup-controller.js b/lib/cartodb/api/map/attributes-layergroup-controller.js index 52ba5f30..17af3df7 100644 --- a/lib/cartodb/api/map/attributes-layergroup-controller.js +++ b/lib/cartodb/api/map/attributes-layergroup-controller.js @@ -18,7 +18,7 @@ module.exports = class AttributesLayergroupController { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ) { this.attributesBackend = attributesBackend; @@ -26,7 +26,7 @@ module.exports = class AttributesLayergroupController { this.mapStore = mapStore; this.userLimitsApi = userLimitsApi; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - this.authApi = authApi; + this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; } @@ -35,7 +35,7 @@ module.exports = class AttributesLayergroupController { `/:token/:layer/attributes/:fid`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ATTRIBUTES), cleanUpQueryParams(), diff --git a/lib/cartodb/api/map/dataview-layergroup-controller.js b/lib/cartodb/api/map/dataview-layergroup-controller.js index 219723bc..84b4c905 100644 --- a/lib/cartodb/api/map/dataview-layergroup-controller.js +++ b/lib/cartodb/api/map/dataview-layergroup-controller.js @@ -33,7 +33,7 @@ module.exports = class DataviewLayergroupController { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ) { this.dataviewBackend = dataviewBackend; @@ -41,7 +41,7 @@ module.exports = class DataviewLayergroupController { this.mapStore = mapStore; this.userLimitsApi = userLimitsApi; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - this.authApi = authApi; + this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; } @@ -53,7 +53,7 @@ module.exports = class DataviewLayergroupController { `/:token/dataview/:dataviewName`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW), cleanUpQueryParams(ALLOWED_DATAVIEW_QUERY_PARAMS), @@ -74,7 +74,7 @@ module.exports = class DataviewLayergroupController { `/:token/:layer/widget/:dataviewName`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW), cleanUpQueryParams(ALLOWED_DATAVIEW_QUERY_PARAMS), @@ -95,7 +95,7 @@ module.exports = class DataviewLayergroupController { `/:token/dataview/:dataviewName/search`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW_SEARCH), cleanUpQueryParams(ALLOWED_DATAVIEW_QUERY_PARAMS), @@ -116,7 +116,7 @@ module.exports = class DataviewLayergroupController { `/:token/:layer/widget/:dataviewName/search`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW_SEARCH), cleanUpQueryParams(ALLOWED_DATAVIEW_QUERY_PARAMS), diff --git a/lib/cartodb/api/map/map-router.js b/lib/cartodb/api/map/map-router.js index 8303040f..2e2a3f4a 100644 --- a/lib/cartodb/api/map/map-router.js +++ b/lib/cartodb/api/map/map-router.js @@ -21,7 +21,7 @@ module.exports = class MapRouter { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache, templateMaps, mapBackend, @@ -39,7 +39,7 @@ module.exports = class MapRouter { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ); @@ -49,7 +49,7 @@ module.exports = class MapRouter { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ); @@ -59,7 +59,7 @@ module.exports = class MapRouter { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ); @@ -69,7 +69,7 @@ module.exports = class MapRouter { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ); @@ -79,7 +79,7 @@ module.exports = class MapRouter { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ); @@ -93,7 +93,7 @@ module.exports = class MapRouter { layergroupAffectedTablesCache, mapConfigAdapter, statsBackend, - authApi, + authBackend, layergroupMetadata ); @@ -104,13 +104,13 @@ module.exports = class MapRouter { tablesExtentApi, metadataBackend, pgConnection, - authApi, + authBackend, userLimitsApi ); this.analysesController = new AnalysesCatalogController( pgConnection, - authApi, + authBackend, userLimitsApi ); } diff --git a/lib/cartodb/api/map/preview-layergroup-controller.js b/lib/cartodb/api/map/preview-layergroup-controller.js index 1fbf7754..484b831c 100644 --- a/lib/cartodb/api/map/preview-layergroup-controller.js +++ b/lib/cartodb/api/map/preview-layergroup-controller.js @@ -18,7 +18,7 @@ module.exports = class PreviewLayergroupController { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ) { this.previewBackend = previewBackend; @@ -26,7 +26,7 @@ module.exports = class PreviewLayergroupController { this.mapStore = mapStore; this.userLimitsApi = userLimitsApi; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - this.authApi = authApi; + this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; } @@ -37,7 +37,7 @@ module.exports = class PreviewLayergroupController { `/static/center/:token/:z/:lat/:lng/:width/:height.:format`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC), cleanUpQueryParams(['layer']), @@ -59,7 +59,7 @@ module.exports = class PreviewLayergroupController { `/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC), cleanUpQueryParams(['layer']), diff --git a/lib/cartodb/api/map/preview-template-controller.js b/lib/cartodb/api/map/preview-template-controller.js index ecce4b7f..73a194e6 100644 --- a/lib/cartodb/api/map/preview-template-controller.js +++ b/lib/cartodb/api/map/preview-template-controller.js @@ -29,7 +29,7 @@ function PreviewTemplateController ( tablesExtentApi, metadataBackend, pgConnection, - authApi, + authBackend, userLimitsApi ) { this.namedMapProviderCache = namedMapProviderCache; @@ -38,7 +38,7 @@ function PreviewTemplateController ( this.tablesExtentApi = tablesExtentApi; this.metadataBackend = metadataBackend; this.pgConnection = pgConnection; - this.authApi = authApi; + this.authBackend = authBackend; this.userLimitsApi = userLimitsApi; } @@ -48,7 +48,7 @@ PreviewTemplateController.prototype.register = function (mapRouter) { mapRouter.get( `/static/named/:template_id/:width/:height.:format`, credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC_NAMED), cleanUpQueryParams(['layer', 'zoom', 'lon', 'lat', 'bbox']), diff --git a/lib/cartodb/api/map/tile-layergroup-controller.js b/lib/cartodb/api/map/tile-layergroup-controller.js index 34abcbda..d747d040 100644 --- a/lib/cartodb/api/map/tile-layergroup-controller.js +++ b/lib/cartodb/api/map/tile-layergroup-controller.js @@ -28,7 +28,7 @@ module.exports = class TileLayergroupController { mapStore, userLimitsApi, layergroupAffectedTablesCache, - authApi, + authBackend, surrogateKeysCache ) { this.tileBackend = tileBackend; @@ -36,7 +36,7 @@ module.exports = class TileLayergroupController { this.mapStore = mapStore; this.userLimitsApi = userLimitsApi; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; - this.authApi = authApi; + this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; } @@ -50,7 +50,7 @@ module.exports = class TileLayergroupController { `/:token/:z${number()}/:x${number()}/:y${number()}@:scale_factor${number()}?x.:format`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), cleanUpQueryParams(), @@ -75,7 +75,7 @@ module.exports = class TileLayergroupController { `/:token/:z${number()}/:x${number()}/:y${number()}.:format`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), cleanUpQueryParams(), @@ -100,7 +100,7 @@ module.exports = class TileLayergroupController { `/:token${not('static')}/:layer/:z${number()}/:x${number()}/:y${number()}.(:format)`, layergroupToken(), credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), cleanUpQueryParams(), diff --git a/lib/cartodb/api/middlewares/authorize.js b/lib/cartodb/api/middlewares/authorize.js index a1323fa9..54cab1c4 100644 --- a/lib/cartodb/api/middlewares/authorize.js +++ b/lib/cartodb/api/middlewares/authorize.js @@ -1,6 +1,6 @@ -module.exports = function authorize (authApi) { +module.exports = function authorize (authBackend) { return function authorizeMiddleware (req, res, next) { - authApi.authorize(req, res, (err, authorized) => { + authBackend.authorize(req, res, (err, authorized) => { req.profiler.done('authorize'); if (err) { diff --git a/lib/cartodb/api/template/admin-template-controller.js b/lib/cartodb/api/template/admin-template-controller.js index b5d1b964..e79f6bd9 100644 --- a/lib/cartodb/api/template/admin-template-controller.js +++ b/lib/cartodb/api/template/admin-template-controller.js @@ -4,13 +4,13 @@ const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; /** - * @param {AuthApi} authApi + * @param {AuthBackend} authBackend * @param {PgConnection} pgConnection * @param {TemplateMaps} templateMaps * @constructor */ -function AdminTemplateController(authApi, templateMaps, userLimitsApi) { - this.authApi = authApi; +function AdminTemplateController(authBackend, templateMaps, userLimitsApi) { + this.authBackend = authBackend; this.templateMaps = templateMaps; this.userLimitsApi = userLimitsApi; } @@ -23,7 +23,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { templateRouter.post( `/`, credentials(), - authorizedByAPIKey({ authApi: this.authApi, action: 'create', label: 'POST TEMPLATE' }), + authorizedByAPIKey({ authBackend: this.authBackend, action: 'create', label: 'POST TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_CREATE), checkContentType({ action: 'POST', label: 'POST TEMPLATE' }), createTemplate({ templateMaps: this.templateMaps }) @@ -32,7 +32,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { templateRouter.put( `/:template_id`, credentials(), - authorizedByAPIKey({ authApi: this.authApi, action: 'update', label: 'PUT TEMPLATE' }), + authorizedByAPIKey({ authBackend: this.authBackend, action: 'update', label: 'PUT TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_UPDATE), checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }), updateTemplate({ templateMaps: this.templateMaps }) @@ -41,7 +41,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { templateRouter.get( `/:template_id`, credentials(), - authorizedByAPIKey({ authApi: this.authApi, action: 'get', label: 'GET TEMPLATE' }), + authorizedByAPIKey({ authBackend: this.authBackend, action: 'get', label: 'GET TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_GET), retrieveTemplate({ templateMaps: this.templateMaps }) ); @@ -49,7 +49,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { templateRouter.delete( `/:template_id`, credentials(), - authorizedByAPIKey({ authApi: this.authApi, action: 'delete', label: 'DELETE TEMPLATE' }), + authorizedByAPIKey({ authBackend: this.authBackend, action: 'delete', label: 'DELETE TEMPLATE' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_DELETE), destroyTemplate({ templateMaps: this.templateMaps }) ); @@ -57,7 +57,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { templateRouter.get( `/`, credentials(), - authorizedByAPIKey({ authApi: this.authApi, action: 'list', label: 'GET TEMPLATE LIST' }), + authorizedByAPIKey({ authBackend: this.authBackend, action: 'list', label: 'GET TEMPLATE LIST' }), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_LIST), listTemplates({ templateMaps: this.templateMaps }) ); @@ -75,11 +75,11 @@ function checkContentType ({ action, label }) { }; } -function authorizedByAPIKey ({ authApi, action, label }) { +function authorizedByAPIKey ({ authBackend, action, label }) { return function authorizedByAPIKeyMiddleware (req, res, next) { const { user } = res.locals; - authApi.authorizedByAPIKey(user, res, (err, authenticated) => { + authBackend.authorizedByAPIKey(user, res, (err, authenticated) => { if (err) { return next(err); } diff --git a/lib/cartodb/api/template/named-template-controller.js b/lib/cartodb/api/template/named-template-controller.js index 140523b1..f61d5dc7 100644 --- a/lib/cartodb/api/template/named-template-controller.js +++ b/lib/cartodb/api/template/named-template-controller.js @@ -21,7 +21,7 @@ const rateLimit = require('../middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; /** - * @param {AuthApi} authApi + * @param {AuthBackend} authBackend * @param {PgConnection} pgConnection * @param {TemplateMaps} templateMaps * @param {MapBackend} mapBackend @@ -43,7 +43,7 @@ function NamedMapController ( layergroupAffectedTables, mapConfigAdapter, statsBackend, - authApi, + authBackend, layergroupMetadata ) { this.pgConnection = pgConnection; @@ -55,7 +55,7 @@ function NamedMapController ( this.layergroupAffectedTables = layergroupAffectedTables; this.mapConfigAdapter = mapConfigAdapter; this.statsBackend = statsBackend; - this.authApi = authApi; + this.authBackend = authBackend; this.layergroupMetadata = layergroupMetadata; } @@ -82,7 +82,7 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () return [ credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED), cleanUpQueryParams(['aggregation']), diff --git a/lib/cartodb/api/template/template-router.js b/lib/cartodb/api/template/template-router.js index b4a70715..87f381d1 100644 --- a/lib/cartodb/api/template/template-router.js +++ b/lib/cartodb/api/template/template-router.js @@ -16,7 +16,7 @@ module.exports = class TemplateRouter { layergroupAffectedTablesCache, mapConfigAdapter, statsBackend, - authApi, + authBackend, layergroupMetadata, namedMapProviderCache, tileBackend, @@ -32,7 +32,7 @@ module.exports = class TemplateRouter { layergroupAffectedTablesCache, mapConfigAdapter, statsBackend, - authApi, + authBackend, layergroupMetadata ); @@ -41,12 +41,12 @@ module.exports = class TemplateRouter { tileBackend, surrogateKeysCache, pgConnection, - authApi, + authBackend, userLimitsApi ); this.adminTemplateController = new AdminTemplateController( - authApi, + authBackend, templateMaps, userLimitsApi ); diff --git a/lib/cartodb/api/template/tile-template-controller.js b/lib/cartodb/api/template/tile-template-controller.js index 11c0bc19..5e2cb72b 100644 --- a/lib/cartodb/api/template/tile-template-controller.js +++ b/lib/cartodb/api/template/tile-template-controller.js @@ -16,14 +16,14 @@ function TileTemplateController ( tileBackend, surrogateKeysCache, pgConnection, - authApi, + authBackend, userLimitsApi ) { this.namedMapProviderCache = namedMapProviderCache; this.tileBackend = tileBackend; this.surrogateKeysCache = surrogateKeysCache; this.pgConnection = pgConnection; - this.authApi = authApi; + this.authBackend = authBackend; this.userLimitsApi = userLimitsApi; } @@ -33,7 +33,7 @@ TileTemplateController.prototype.register = function (templateRouter) { templateRouter.get( `/:template_id/:layer/:z/:x/:y.(:format)`, credentials(), - authorize(this.authApi), + authorize(this.authBackend), dbConnSetup(this.pgConnection), rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_TILES), cleanUpQueryParams(), diff --git a/lib/cartodb/backends/api/auth_api.js b/lib/cartodb/backends/auth.js similarity index 94% rename from lib/cartodb/backends/api/auth_api.js rename to lib/cartodb/backends/auth.js index d27ea3e1..e51084e1 100644 --- a/lib/cartodb/backends/api/auth_api.js +++ b/lib/cartodb/backends/auth.js @@ -7,16 +7,16 @@ var _ = require('underscore'); // AUTH_FALLBACK * @param {MapStore} mapStore * @param {TemplateMaps} templateMaps * @constructor - * @type {AuthApi} + * @type {AuthBackend} */ -function AuthApi(pgConnection, metadataBackend, mapStore, templateMaps) { +function AuthBackend(pgConnection, metadataBackend, mapStore, templateMaps) { this.pgConnection = pgConnection; this.metadataBackend = metadataBackend; this.mapStore = mapStore; this.templateMaps = templateMaps; } -module.exports = AuthApi; +module.exports = AuthBackend; // Check if the user is authorized by a signer // @@ -25,7 +25,7 @@ module.exports = AuthApi; // null if the request is not signed by anyone // or will be a string cartodb username otherwise. // -AuthApi.prototype.authorizedBySigner = function(req, res, callback) { +AuthBackend.prototype.authorizedBySigner = function(req, res, callback) { if ( ! res.locals.token || ! res.locals.signer ) { return callback(null, false); // no signer requested } @@ -60,7 +60,7 @@ function isValidApiKey(apikey) { // @param callback function(err, authorized) // NOTE: authorized is expected to be 0 or 1 (integer) // -AuthApi.prototype.authorizedByAPIKey = function(user, res, callback) { +AuthBackend.prototype.authorizedByAPIKey = function(user, res, callback) { const apikeyToken = res.locals.api_key; const basicAuthUsername = res.locals.basicAuthUsername; @@ -160,7 +160,7 @@ function usernameMatches (basicAuthUsername, requestUsername) { * @param res - standard res object. Contains the auth parameters in locals * @param callback function(err, allowed) is access allowed not? */ -AuthApi.prototype.authorize = function(req, res, callback) { +AuthBackend.prototype.authorize = function(req, res, callback) { var user = res.locals.user; this.authorizedByAPIKey(user, res, (err, isAuthorizedByApikey) => { diff --git a/test/unit/cartodb/prepare-context.test.js b/test/unit/cartodb/prepare-context.test.js index e9f0a320..02b63dc7 100644 --- a/test/unit/cartodb/prepare-context.test.js +++ b/test/unit/cartodb/prepare-context.test.js @@ -4,7 +4,7 @@ var _ = require('underscore'); var RedisPool = require('redis-mpool'); var cartodbRedis = require('cartodb-redis'); var PgConnection = require('../../../lib/cartodb/backends/pg_connection'); -var AuthApi = require('../../../lib/cartodb/backends/api/auth_api'); +var AuthBackend = require('../../../lib/cartodb/backends/auth'); var TemplateMaps = require('../../../lib/cartodb/backends/template_maps'); const cleanUpQueryParamsMiddleware = require('../../../lib/cartodb/api/middlewares/clean-up-query-params'); @@ -31,10 +31,10 @@ describe('prepare-context', function() { var metadataBackend = cartodbRedis({pool: redisPool}); var pgConnection = new PgConnection(metadataBackend); var templateMaps = new TemplateMaps(redisPool); - var authApi = new AuthApi(pgConnection, metadataBackend, mapStore, templateMaps); + var authBackend = new AuthBackend(pgConnection, metadataBackend, mapStore, templateMaps); cleanUpQueryParams = cleanUpQueryParamsMiddleware(); - authorize = authorizeMiddleware(authApi); + authorize = authorizeMiddleware(authBackend); dbConnSetup = dbConnSetupMiddleware(pgConnection); setCredentials = credentialsMiddleware(); }); From e0d8dc0334605dc44e0323be51505181a494a0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 9 Apr 2018 18:56:01 +0200 Subject: [PATCH 39/54] Rename filter stats api by filter stats backend --- lib/cartodb/api/api-router.js | 6 +++--- .../backends/{api/filter_stats_api.js => filter-stats.js} | 8 ++++---- .../mapconfig/adapter/mapconfig-overviews-adapter.js | 6 +++--- test/integration/mapconfig_overviews_adapter.js | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) rename lib/cartodb/backends/{api/filter_stats_api.js => filter-stats.js} (86%) diff --git a/lib/cartodb/api/api-router.js b/lib/cartodb/api/api-router.js index f5b40c9e..15469962 100644 --- a/lib/cartodb/api/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -16,7 +16,7 @@ const AuthBackend = require('../backends/auth'); const UserLimitsApi = require('../backends/api/user_limits_api'); const OverviewsMetadataApi = require('../backends/api/overviews_metadata_api'); -const FilterStatsApi = require('../backends/api/filter_stats_api'); +const FilterStatsApi = require('../backends/filter-stats'); const TablesExtentApi = require('../backends/api/tables_extent_api'); const LayergroupAffectedTablesCache = require('../cache/layergroup_affected_tables'); @@ -124,7 +124,7 @@ module.exports = class ApiRouter { const pgQueryRunner = new PgQueryRunner(pgConnection); const overviewsMetadataApi = new OverviewsMetadataApi(pgQueryRunner); - const filterStatsApi = new FilterStatsApi(pgQueryRunner); + const filterStatsBackend = new FilterStatsApi(pgQueryRunner); const tablesExtentApi = new TablesExtentApi(pgQueryRunner); const mapConfigAdapter = new MapConfigAdapter( @@ -134,7 +134,7 @@ module.exports = class ApiRouter { new DataviewsWidgetsAdapter(), new AnalysisMapConfigAdapter(analysisBackend), new AggregationMapConfigAdapter(pgConnection), - new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi), + new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsBackend), new TurboCartoAdapter() ); diff --git a/lib/cartodb/backends/api/filter_stats_api.js b/lib/cartodb/backends/filter-stats.js similarity index 86% rename from lib/cartodb/backends/api/filter_stats_api.js rename to lib/cartodb/backends/filter-stats.js index 72fd970f..ba427405 100644 --- a/lib/cartodb/backends/api/filter_stats_api.js +++ b/lib/cartodb/backends/filter-stats.js @@ -1,12 +1,12 @@ var _ = require('underscore'); var step = require('step'); -var AnalysisFilter = require('../../models/filter/analysis'); +var AnalysisFilter = require('../models/filter/analysis'); -function FilterStatsApi(pgQueryRunner) { +function FilterStatsBackends(pgQueryRunner) { this.pgQueryRunner = pgQueryRunner; } -module.exports = FilterStatsApi; +module.exports = FilterStatsBackends; function getEstimatedRows(pgQueryRunner, username, query, callback) { pgQueryRunner.run(username, "EXPLAIN (FORMAT JSON)"+query, function(err, result_rows) { @@ -23,7 +23,7 @@ function getEstimatedRows(pgQueryRunner, username, query, callback) { }); } -FilterStatsApi.prototype.getFilterStats = function (username, unfiltered_query, filters, callback) { +FilterStatsBackends.prototype.getFilterStats = function (username, unfiltered_query, filters, callback) { var stats = {}; var self = this; step( diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js index 72c29593..a3133da2 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js @@ -2,9 +2,9 @@ var step = require('step'); var queue = require('queue-async'); var _ = require('underscore'); -function MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi) { +function MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsBackend) { this.overviewsMetadataApi = overviewsMetadataApi; - this.filterStatsApi = filterStatsApi; + this.filterStatsBackend = filterStatsBackend; } module.exports = MapConfigOverviewsAdapter; @@ -53,7 +53,7 @@ MapConfigOverviewsAdapter.prototype.getMapConfig = function(user, requestMapConf function collectStatsData(err, filters, unfiltered_query) { var next_step = this; if ( filters ) { - self.filterStatsApi.getFilterStats( + self.filterStatsBackend.getFilterStats( user, unfiltered_query, filters, function(err, stats) { diff --git a/test/integration/mapconfig_overviews_adapter.js b/test/integration/mapconfig_overviews_adapter.js index 79196e3b..288c2560 100644 --- a/test/integration/mapconfig_overviews_adapter.js +++ b/test/integration/mapconfig_overviews_adapter.js @@ -6,7 +6,7 @@ var cartodbRedis = require('cartodb-redis'); var PgConnection = require(__dirname + '/../../lib/cartodb/backends/pg_connection'); var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); var OverviewsMetadataApi = require('../../lib/cartodb/backends/api/overviews_metadata_api'); -var FilterStatsApi = require('../../lib/cartodb/backends/api/filter_stats_api'); +var FilterStatsBackend = require('../../lib/cartodb/backends/filter-stats'); var MapConfigOverviewsAdapter = require('../../lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter'); var redisPool = new RedisPool(global.environment.redis); @@ -14,9 +14,9 @@ var metadataBackend = cartodbRedis({pool: redisPool}); var pgConnection = new PgConnection(metadataBackend); var pgQueryRunner = new PgQueryRunner(pgConnection); var overviewsMetadataApi = new OverviewsMetadataApi(pgQueryRunner); -var filterStatsApi = new FilterStatsApi(pgQueryRunner); +var filterStatsBackend = new FilterStatsBackend(pgQueryRunner); -var mapConfigOverviewsAdapter = new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi); +var mapConfigOverviewsAdapter = new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsBackend); describe('MapConfigOverviewsAdapter', function() { From ba36a4722814430ed17a1ce45be57e31ccfb2003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 9 Apr 2018 19:47:24 +0200 Subject: [PATCH 40/54] Rename overviews metadata api by overviews metadata backend --- lib/cartodb/api/api-router.js | 6 +++--- ...erviews_metadata_api.js => overviews-metadata.js} | 8 ++++---- .../mapconfig/adapter/mapconfig-overviews-adapter.js | 6 +++--- test/integration/mapconfig_overviews_adapter.js | 6 +++--- test/integration/overviews-metadata-api.js | 12 ++++++------ 5 files changed, 19 insertions(+), 19 deletions(-) rename lib/cartodb/backends/{api/overviews_metadata_api.js => overviews-metadata.js} (82%) diff --git a/lib/cartodb/api/api-router.js b/lib/cartodb/api/api-router.js index 15469962..3f0f7ac0 100644 --- a/lib/cartodb/api/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -15,7 +15,7 @@ const StatsBackend = require('../backends/stats'); const AuthBackend = require('../backends/auth'); const UserLimitsApi = require('../backends/api/user_limits_api'); -const OverviewsMetadataApi = require('../backends/api/overviews_metadata_api'); +const OverviewsMetadataBackend = require('../backends/overviews-metadata'); const FilterStatsApi = require('../backends/filter-stats'); const TablesExtentApi = require('../backends/api/tables_extent_api'); @@ -122,7 +122,7 @@ module.exports = class ApiRouter { } const pgQueryRunner = new PgQueryRunner(pgConnection); - const overviewsMetadataApi = new OverviewsMetadataApi(pgQueryRunner); + const overviewsMetadataBackend = new OverviewsMetadataBackend(pgQueryRunner); const filterStatsBackend = new FilterStatsApi(pgQueryRunner); const tablesExtentApi = new TablesExtentApi(pgQueryRunner); @@ -134,7 +134,7 @@ module.exports = class ApiRouter { new DataviewsWidgetsAdapter(), new AnalysisMapConfigAdapter(analysisBackend), new AggregationMapConfigAdapter(pgConnection), - new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsBackend), + new MapConfigOverviewsAdapter(overviewsMetadataBackend, filterStatsBackend), new TurboCartoAdapter() ); diff --git a/lib/cartodb/backends/api/overviews_metadata_api.js b/lib/cartodb/backends/overviews-metadata.js similarity index 82% rename from lib/cartodb/backends/api/overviews_metadata_api.js rename to lib/cartodb/backends/overviews-metadata.js index dda51d7e..31045534 100644 --- a/lib/cartodb/backends/api/overviews_metadata_api.js +++ b/lib/cartodb/backends/overviews-metadata.js @@ -1,10 +1,10 @@ -var SubstitutionTokens = require('../../utils/substitution-tokens'); +var SubstitutionTokens = require('../utils/substitution-tokens'); -function OverviewsMetadataApi(pgQueryRunner) { +function OverviewsMetadataBackend(pgQueryRunner) { this.pgQueryRunner = pgQueryRunner; } -module.exports = OverviewsMetadataApi; +module.exports = OverviewsMetadataBackend; function prepareSql(sql) { return sql && SubstitutionTokens.replace(sql, { @@ -15,7 +15,7 @@ function prepareSql(sql) { }); } -OverviewsMetadataApi.prototype.getOverviewsMetadata = function (username, sql, callback) { +OverviewsMetadataBackend.prototype.getOverviewsMetadata = function (username, sql, callback) { // FIXME: Currently using internal function _cdb_schema_name // CDB_Overviews should provide the schema information directly. var query = 'SELECT *, _cdb_schema_name(base_table)' + diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js index a3133da2..a104c592 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter.js @@ -2,8 +2,8 @@ var step = require('step'); var queue = require('queue-async'); var _ = require('underscore'); -function MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsBackend) { - this.overviewsMetadataApi = overviewsMetadataApi; +function MapConfigOverviewsAdapter(overviewsMetadataBackend, filterStatsBackend) { + this.overviewsMetadataBackend = overviewsMetadataBackend; this.filterStatsBackend = filterStatsBackend; } @@ -25,7 +25,7 @@ MapConfigOverviewsAdapter.prototype.getMapConfig = function(user, requestMapConf if ( layer.type !== 'mapnik' && layer.type !== 'cartodb' ) { return done(null, layer); } - self.overviewsMetadataApi.getOverviewsMetadata(user, layer.options.sql, function(err, metadata){ + self.overviewsMetadataBackend.getOverviewsMetadata(user, layer.options.sql, function(err, metadata){ if (err) { done(err, layer); } else { diff --git a/test/integration/mapconfig_overviews_adapter.js b/test/integration/mapconfig_overviews_adapter.js index 288c2560..d5414a7e 100644 --- a/test/integration/mapconfig_overviews_adapter.js +++ b/test/integration/mapconfig_overviews_adapter.js @@ -5,7 +5,7 @@ var RedisPool = require('redis-mpool'); var cartodbRedis = require('cartodb-redis'); var PgConnection = require(__dirname + '/../../lib/cartodb/backends/pg_connection'); var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); -var OverviewsMetadataApi = require('../../lib/cartodb/backends/api/overviews_metadata_api'); +var OverviewsMetadataBackend = require('../../lib/cartodb/backends/overviews-metadata'); var FilterStatsBackend = require('../../lib/cartodb/backends/filter-stats'); var MapConfigOverviewsAdapter = require('../../lib/cartodb/models/mapconfig/adapter/mapconfig-overviews-adapter'); @@ -13,10 +13,10 @@ var redisPool = new RedisPool(global.environment.redis); var metadataBackend = cartodbRedis({pool: redisPool}); var pgConnection = new PgConnection(metadataBackend); var pgQueryRunner = new PgQueryRunner(pgConnection); -var overviewsMetadataApi = new OverviewsMetadataApi(pgQueryRunner); +var overviewsMetadataBackend = new OverviewsMetadataBackend(pgQueryRunner); var filterStatsBackend = new FilterStatsBackend(pgQueryRunner); -var mapConfigOverviewsAdapter = new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsBackend); +var mapConfigOverviewsAdapter = new MapConfigOverviewsAdapter(overviewsMetadataBackend, filterStatsBackend); describe('MapConfigOverviewsAdapter', function() { diff --git a/test/integration/overviews-metadata-api.js b/test/integration/overviews-metadata-api.js index e51c2129..ce82a1d9 100644 --- a/test/integration/overviews-metadata-api.js +++ b/test/integration/overviews-metadata-api.js @@ -7,24 +7,24 @@ var cartodbRedis = require('cartodb-redis'); var PgConnection = require('../../lib/cartodb/backends/pg_connection'); var PgQueryRunner = require('../../lib/cartodb/backends/pg_query_runner'); -var OverviewsMetadataApi = require('../../lib/cartodb/backends/api/overviews_metadata_api'); +var OverviewsMetadataBackend = require('../../lib/cartodb/backends/overviews-metadata'); -describe('OverviewsMetadataApi', function() { +describe('OverviewsMetadataBackend', function() { - var overviewsMetadataApi; + var overviewsMetadataBackend; before(function() { var redisPool = new RedisPool(global.environment.redis); var metadataBackend = cartodbRedis({pool: redisPool}); var pgConnection = new PgConnection(metadataBackend); var pgQueryRunner = new PgQueryRunner(pgConnection); - overviewsMetadataApi = new OverviewsMetadataApi(pgQueryRunner); + overviewsMetadataBackend = new OverviewsMetadataBackend(pgQueryRunner); }); it('should return an empty relation for tables that have no overviews', function(done) { var query = 'select * from test_table'; - overviewsMetadataApi.getOverviewsMetadata('localhost', query, function(err, result) { + overviewsMetadataBackend.getOverviewsMetadata('localhost', query, function(err, result) { assert.ok(!err, err); assert.deepEqual(result, {}); @@ -35,7 +35,7 @@ describe('OverviewsMetadataApi', function() { it('should return overviews metadata', function(done) { var query = 'select * from test_table_overviews'; - overviewsMetadataApi.getOverviewsMetadata('localhost', query, function(err, result) { + overviewsMetadataBackend.getOverviewsMetadata('localhost', query, function(err, result) { assert.ok(!err, err); assert.deepEqual(result, { From 8519d2724b188ba08ed210fc1b887ec38492ee7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 10 Apr 2018 09:40:09 +0200 Subject: [PATCH 41/54] Rename tables extent api by tables extent backend --- lib/cartodb/api/api-router.js | 6 +++--- lib/cartodb/api/map/map-router.js | 4 ++-- lib/cartodb/api/map/preview-template-controller.js | 10 +++++----- .../{api/tables_extent_api.js => tables-extent.js} | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) rename lib/cartodb/backends/{api/tables_extent_api.js => tables-extent.js} (90%) diff --git a/lib/cartodb/api/api-router.js b/lib/cartodb/api/api-router.js index 3f0f7ac0..5a08eb6d 100644 --- a/lib/cartodb/api/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -17,7 +17,7 @@ const AuthBackend = require('../backends/auth'); const UserLimitsApi = require('../backends/api/user_limits_api'); const OverviewsMetadataBackend = require('../backends/overviews-metadata'); const FilterStatsApi = require('../backends/filter-stats'); -const TablesExtentApi = require('../backends/api/tables_extent_api'); +const TablesExtentBackend = require('../backends/tables-extent'); const LayergroupAffectedTablesCache = require('../cache/layergroup_affected_tables'); const SurrogateKeysCache = require('../cache/surrogate_keys_cache'); @@ -125,7 +125,7 @@ module.exports = class ApiRouter { const overviewsMetadataBackend = new OverviewsMetadataBackend(pgQueryRunner); const filterStatsBackend = new FilterStatsApi(pgQueryRunner); - const tablesExtentApi = new TablesExtentApi(pgQueryRunner); + const tablesExtentBackend = new TablesExtentBackend(pgQueryRunner); const mapConfigAdapter = new MapConfigAdapter( new MapConfigNamedLayersAdapter(templateMaps, pgConnection), @@ -173,7 +173,7 @@ module.exports = class ApiRouter { statsBackend, layergroupMetadata, namedMapProviderCache, - tablesExtentApi + tablesExtentBackend }; this.mapRouter = new MapRouter({ collaborators }); diff --git a/lib/cartodb/api/map/map-router.js b/lib/cartodb/api/map/map-router.js index 2e2a3f4a..78b87d1e 100644 --- a/lib/cartodb/api/map/map-router.js +++ b/lib/cartodb/api/map/map-router.js @@ -30,7 +30,7 @@ module.exports = class MapRouter { statsBackend, layergroupMetadata, namedMapProviderCache, - tablesExtentApi + tablesExtentBackend } = collaborators; this.analysisLayergroupController = new AnalysisLayergroupController( @@ -101,7 +101,7 @@ module.exports = class MapRouter { namedMapProviderCache, previewBackend, surrogateKeysCache, - tablesExtentApi, + tablesExtentBackend, metadataBackend, pgConnection, authBackend, diff --git a/lib/cartodb/api/map/preview-template-controller.js b/lib/cartodb/api/map/preview-template-controller.js index 73a194e6..acf58a91 100644 --- a/lib/cartodb/api/map/preview-template-controller.js +++ b/lib/cartodb/api/map/preview-template-controller.js @@ -26,7 +26,7 @@ function PreviewTemplateController ( namedMapProviderCache, previewBackend, surrogateKeysCache, - tablesExtentApi, + tablesExtentBackend, metadataBackend, pgConnection, authBackend, @@ -35,7 +35,7 @@ function PreviewTemplateController ( this.namedMapProviderCache = namedMapProviderCache; this.previewBackend = previewBackend; this.surrogateKeysCache = surrogateKeysCache; - this.tablesExtentApi = tablesExtentApi; + this.tablesExtentBackend = tablesExtentBackend; this.metadataBackend = metadataBackend; this.pgConnection = pgConnection; this.authBackend = authBackend; @@ -61,7 +61,7 @@ PreviewTemplateController.prototype.register = function (mapRouter) { namedMapProviderCache: this.namedMapProviderCache, label: 'STATIC_VIZ_MAP' }), - getStaticImageOptions({ tablesExtentApi: this.tablesExtentApi }), + getStaticImageOptions({ tablesExtentBackend: this.tablesExtentBackend }), getImage({ previewBackend: this.previewBackend, label: 'STATIC_VIZ_MAP' }), setContentTypeHeader(), incrementMapViews({ metadataBackend: this.metadataBackend }), @@ -138,7 +138,7 @@ function prepareLayerFilterFromPreviewLayers ({ namedMapProviderCache, label }) }; } -function getStaticImageOptions ({ tablesExtentApi }) { +function getStaticImageOptions ({ tablesExtentBackend }) { return function getStaticImageOptionsMiddleware(req, res, next) { const { user, mapConfigProvider, template } = res.locals; const { zoom, lon, lat, bbox } = req.query; @@ -164,7 +164,7 @@ function getStaticImageOptions ({ tablesExtentApi }) { return next(); } - tablesExtentApi.getBounds(user, tables, (err, bounds) => { + tablesExtentBackend.getBounds(user, tables, (err, bounds) => { if (err) { return next(); } diff --git a/lib/cartodb/backends/api/tables_extent_api.js b/lib/cartodb/backends/tables-extent.js similarity index 90% rename from lib/cartodb/backends/api/tables_extent_api.js rename to lib/cartodb/backends/tables-extent.js index 7b534a3f..5e78a6b1 100644 --- a/lib/cartodb/backends/api/tables_extent_api.js +++ b/lib/cartodb/backends/tables-extent.js @@ -1,8 +1,8 @@ -function TablesExtentApi(pgQueryRunner) { +function TablesExtentBackend(pgQueryRunner) { this.pgQueryRunner = pgQueryRunner; } -module.exports = TablesExtentApi; +module.exports = TablesExtentBackend; /** * Given a username and a list of tables it will return the estimated extent in SRID 4326 for all the tables based on @@ -13,7 +13,7 @@ module.exports = TablesExtentApi; * `table_name` format as valid input * @param {Function} callback function(err, result) {Object} result with `west`, `south`, `east`, `north` */ -TablesExtentApi.prototype.getBounds = function (username, tables, callback) { +TablesExtentBackend.prototype.getBounds = function (username, tables, callback) { var estimatedExtentSQLs = tables.map(function(table) { return "ST_EstimatedExtent('" + table.schema_name + "', '" + table.table_name + "', 'the_geom_webmercator')"; }); From d1a4057a8dfbbf109a1cdbbc56d9c8e3ac90f5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 10 Apr 2018 10:16:07 +0200 Subject: [PATCH 42/54] Rename user limits api by user limits backend --- lib/cartodb/api/api-router.js | 8 ++++---- .../api/map/analyses-catalog-controller.js | 6 +++--- .../api/map/analysis-layergroup-controller.js | 6 +++--- .../api/map/anonymous-map-controller.js | 14 ++++++------- .../map/attributes-layergroup-controller.js | 8 ++++---- .../api/map/dataview-layergroup-controller.js | 20 +++++++++---------- lib/cartodb/api/map/map-router.js | 18 ++++++++--------- .../api/map/preview-layergroup-controller.js | 12 +++++------ .../api/map/preview-template-controller.js | 6 +++--- .../api/map/tile-layergroup-controller.js | 16 +++++++-------- .../map-store-map-config-provider.js | 4 ++-- lib/cartodb/api/middlewares/rate-limit.js | 4 ++-- .../api/template/admin-template-controller.js | 14 ++++++------- .../api/template/named-template-controller.js | 20 +++++++++---------- lib/cartodb/api/template/template-router.js | 8 ++++---- .../api/template/tile-template-controller.js | 6 +++--- .../user_limits_api.js => user-limits.js} | 14 ++++++------- lib/cartodb/cache/named_map_provider_cache.js | 6 +++--- .../provider/create-layergroup-provider.js | 8 ++++---- .../mapconfig/provider/map-store-provider.js | 8 ++++---- .../mapconfig/provider/named-map-provider.js | 6 +++--- test/acceptance/rate-limit.test.js | 4 ++-- 22 files changed, 108 insertions(+), 108 deletions(-) rename lib/cartodb/backends/{api/user_limits_api.js => user-limits.js} (81%) diff --git a/lib/cartodb/api/api-router.js b/lib/cartodb/api/api-router.js index 5a08eb6d..7108bbbf 100644 --- a/lib/cartodb/api/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -14,7 +14,7 @@ const PgQueryRunner = require('../backends/pg_query_runner'); const StatsBackend = require('../backends/stats'); const AuthBackend = require('../backends/auth'); -const UserLimitsApi = require('../backends/api/user_limits_api'); +const UserLimitsBackend = require('../backends/user-limits'); const OverviewsMetadataBackend = require('../backends/overviews-metadata'); const FilterStatsApi = require('../backends/filter-stats'); const TablesExtentBackend = require('../backends/tables-extent'); @@ -106,7 +106,7 @@ module.exports = class ApiRouter { const dataviewBackend = new DataviewBackend(analysisBackend); const statsBackend = new StatsBackend(); - const userLimitsApi = new UserLimitsApi(metadataBackend, { + const userLimitsBackend = new UserLimitsBackend(metadataBackend, { limits: { cacheOnTimeout: serverOptions.renderer.mapnik.limits.cacheOnTimeout || false, render: serverOptions.renderer.mapnik.limits.render || 0, @@ -145,7 +145,7 @@ module.exports = class ApiRouter { templateMaps, pgConnection, metadataBackend, - userLimitsApi, + userLimitsBackend, mapConfigAdapter, layergroupAffectedTablesCache ); @@ -162,7 +162,7 @@ module.exports = class ApiRouter { tileBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache, diff --git a/lib/cartodb/api/map/analyses-catalog-controller.js b/lib/cartodb/api/map/analyses-catalog-controller.js index 855666dd..91defc21 100644 --- a/lib/cartodb/api/map/analyses-catalog-controller.js +++ b/lib/cartodb/api/map/analyses-catalog-controller.js @@ -8,10 +8,10 @@ const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const cacheControlHeader = require('../middlewares/cache-control-header'); const dbParamsFromResLocals = require('../../utils/database-params'); -function AnalysesController(pgConnection, authBackend, userLimitsApi) { +function AnalysesController(pgConnection, authBackend, userLimitsBackend) { this.pgConnection = pgConnection; this.authBackend = authBackend; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; } module.exports = AnalysesController; @@ -22,7 +22,7 @@ AnalysesController.prototype.register = function (mapRouter) { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS_CATALOG), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS_CATALOG), cleanUpQueryParams(), createPGClient(), getDataFromQuery({ queryTemplate: catalogQueryTpl, key: 'catalog' }), diff --git a/lib/cartodb/api/map/analysis-layergroup-controller.js b/lib/cartodb/api/map/analysis-layergroup-controller.js index e0cf3222..5d89803b 100644 --- a/lib/cartodb/api/map/analysis-layergroup-controller.js +++ b/lib/cartodb/api/map/analysis-layergroup-controller.js @@ -12,7 +12,7 @@ module.exports = class AnalysisLayergroupController { analysisStatusBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -20,7 +20,7 @@ module.exports = class AnalysisLayergroupController { this.analysisStatusBackend = analysisStatusBackend; this.pgConnection = pgConnection; this.mapStore = mapStore; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; @@ -33,7 +33,7 @@ module.exports = class AnalysisLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS), cleanUpQueryParams(), analysisNodeStatus(this.analysisStatusBackend) ); diff --git a/lib/cartodb/api/map/anonymous-map-controller.js b/lib/cartodb/api/map/anonymous-map-controller.js index a20b1407..964ffacd 100644 --- a/lib/cartodb/api/map/anonymous-map-controller.js +++ b/lib/cartodb/api/map/anonymous-map-controller.js @@ -29,7 +29,7 @@ const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; * @param {MapBackend} mapBackend * @param metadataBackend * @param {SurrogateKeysCache} surrogateKeysCache - * @param {UserLimitsApi} userLimitsApi + * @param {UserLimitsBackend} userLimitsBackend * @param {LayergroupAffectedTables} layergroupAffectedTables * @param {MapConfigAdapter} mapConfigAdapter * @param {StatsBackend} statsBackend @@ -41,7 +41,7 @@ function AnonymousMapController ( mapBackend, metadataBackend, surrogateKeysCache, - userLimitsApi, + userLimitsBackend, layergroupAffectedTables, mapConfigAdapter, statsBackend, @@ -53,7 +53,7 @@ function AnonymousMapController ( this.mapBackend = mapBackend; this.metadataBackend = metadataBackend; this.surrogateKeysCache = surrogateKeysCache; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.layergroupAffectedTables = layergroupAffectedTables; this.mapConfigAdapter = mapConfigAdapter; this.statsBackend = statsBackend; @@ -80,7 +80,7 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS), cleanUpQueryParams(['aggregation']), initProfiler(isTemplateInstantiation), checkJsonContentType(), @@ -88,7 +88,7 @@ AnonymousMapController.prototype.composeCreateMapMiddleware = function () { prepareAdapterMapConfig(this.mapConfigAdapter), createLayergroup ( this.mapBackend, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTables ), @@ -166,7 +166,7 @@ function prepareAdapterMapConfig (mapConfigAdapter) { }; } -function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTablesCache) { +function createLayergroup (mapBackend, userLimitsBackend, pgConnection, affectedTablesCache) { return function createLayergroupMiddleware (req, res, next) { const requestMapConfig = req.body; @@ -185,7 +185,7 @@ function createLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTabl const mapConfigProvider = new CreateLayergroupMapConfigProvider( mapConfig, user, - userLimitsApi, + userLimitsBackend, pgConnection, affectedTablesCache, params diff --git a/lib/cartodb/api/map/attributes-layergroup-controller.js b/lib/cartodb/api/map/attributes-layergroup-controller.js index 17af3df7..ef9614fc 100644 --- a/lib/cartodb/api/map/attributes-layergroup-controller.js +++ b/lib/cartodb/api/map/attributes-layergroup-controller.js @@ -16,7 +16,7 @@ module.exports = class AttributesLayergroupController { attributesBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -24,7 +24,7 @@ module.exports = class AttributesLayergroupController { this.attributesBackend = attributesBackend; this.pgConnection = pgConnection; this.mapStore = mapStore; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; @@ -37,11 +37,11 @@ module.exports = class AttributesLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ATTRIBUTES), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.ATTRIBUTES), cleanUpQueryParams(), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache ), diff --git a/lib/cartodb/api/map/dataview-layergroup-controller.js b/lib/cartodb/api/map/dataview-layergroup-controller.js index 84b4c905..0b6f8cc9 100644 --- a/lib/cartodb/api/map/dataview-layergroup-controller.js +++ b/lib/cartodb/api/map/dataview-layergroup-controller.js @@ -31,7 +31,7 @@ module.exports = class DataviewLayergroupController { dataviewBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -39,7 +39,7 @@ module.exports = class DataviewLayergroupController { this.dataviewBackend = dataviewBackend; this.pgConnection = pgConnection; this.mapStore = mapStore; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; @@ -55,11 +55,11 @@ module.exports = class DataviewLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW), cleanUpQueryParams(ALLOWED_DATAVIEW_QUERY_PARAMS), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache ), @@ -76,11 +76,11 @@ module.exports = class DataviewLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW), cleanUpQueryParams(ALLOWED_DATAVIEW_QUERY_PARAMS), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache ), @@ -97,11 +97,11 @@ module.exports = class DataviewLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW_SEARCH), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW_SEARCH), cleanUpQueryParams(ALLOWED_DATAVIEW_QUERY_PARAMS), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache ), @@ -118,11 +118,11 @@ module.exports = class DataviewLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW_SEARCH), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW_SEARCH), cleanUpQueryParams(ALLOWED_DATAVIEW_QUERY_PARAMS), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache ), diff --git a/lib/cartodb/api/map/map-router.js b/lib/cartodb/api/map/map-router.js index 78b87d1e..a6e91c29 100644 --- a/lib/cartodb/api/map/map-router.js +++ b/lib/cartodb/api/map/map-router.js @@ -19,7 +19,7 @@ module.exports = class MapRouter { tileBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache, @@ -37,7 +37,7 @@ module.exports = class MapRouter { analysisStatusBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -47,7 +47,7 @@ module.exports = class MapRouter { attributesBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -57,7 +57,7 @@ module.exports = class MapRouter { dataviewBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -67,7 +67,7 @@ module.exports = class MapRouter { previewBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -77,7 +77,7 @@ module.exports = class MapRouter { tileBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -89,7 +89,7 @@ module.exports = class MapRouter { mapBackend, metadataBackend, surrogateKeysCache, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, mapConfigAdapter, statsBackend, @@ -105,13 +105,13 @@ module.exports = class MapRouter { metadataBackend, pgConnection, authBackend, - userLimitsApi + userLimitsBackend ); this.analysesController = new AnalysesCatalogController( pgConnection, authBackend, - userLimitsApi + userLimitsBackend ); } diff --git a/lib/cartodb/api/map/preview-layergroup-controller.js b/lib/cartodb/api/map/preview-layergroup-controller.js index 484b831c..dcacc4f5 100644 --- a/lib/cartodb/api/map/preview-layergroup-controller.js +++ b/lib/cartodb/api/map/preview-layergroup-controller.js @@ -16,7 +16,7 @@ module.exports = class PreviewLayergroupController { previewBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -24,7 +24,7 @@ module.exports = class PreviewLayergroupController { this.previewBackend = previewBackend; this.pgConnection = pgConnection; this.mapStore = mapStore; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; @@ -39,11 +39,11 @@ module.exports = class PreviewLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC), cleanUpQueryParams(['layer']), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache, forcedFormat @@ -61,11 +61,11 @@ module.exports = class PreviewLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC), cleanUpQueryParams(['layer']), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache, forcedFormat diff --git a/lib/cartodb/api/map/preview-template-controller.js b/lib/cartodb/api/map/preview-template-controller.js index acf58a91..91a3f5b6 100644 --- a/lib/cartodb/api/map/preview-template-controller.js +++ b/lib/cartodb/api/map/preview-template-controller.js @@ -30,7 +30,7 @@ function PreviewTemplateController ( metadataBackend, pgConnection, authBackend, - userLimitsApi + userLimitsBackend ) { this.namedMapProviderCache = namedMapProviderCache; this.previewBackend = previewBackend; @@ -39,7 +39,7 @@ function PreviewTemplateController ( this.metadataBackend = metadataBackend; this.pgConnection = pgConnection; this.authBackend = authBackend; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; } module.exports = PreviewTemplateController; @@ -50,7 +50,7 @@ PreviewTemplateController.prototype.register = function (mapRouter) { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC_NAMED), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC_NAMED), cleanUpQueryParams(['layer', 'zoom', 'lon', 'lat', 'bbox']), namedMapProvider({ namedMapProviderCache: this.namedMapProviderCache, diff --git a/lib/cartodb/api/map/tile-layergroup-controller.js b/lib/cartodb/api/map/tile-layergroup-controller.js index d747d040..40d85b7c 100644 --- a/lib/cartodb/api/map/tile-layergroup-controller.js +++ b/lib/cartodb/api/map/tile-layergroup-controller.js @@ -26,7 +26,7 @@ module.exports = class TileLayergroupController { tileBackend, pgConnection, mapStore, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, authBackend, surrogateKeysCache @@ -34,7 +34,7 @@ module.exports = class TileLayergroupController { this.tileBackend = tileBackend; this.pgConnection = pgConnection; this.mapStore = mapStore; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; this.authBackend = authBackend; this.surrogateKeysCache = surrogateKeysCache; @@ -52,11 +52,11 @@ module.exports = class TileLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), cleanUpQueryParams(), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache ), @@ -77,11 +77,11 @@ module.exports = class TileLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), cleanUpQueryParams(), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache ), @@ -102,11 +102,11 @@ module.exports = class TileLayergroupController { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), cleanUpQueryParams(), createMapStoreMapConfigProvider( this.mapStore, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTablesCache ), diff --git a/lib/cartodb/api/middlewares/map-store-map-config-provider.js b/lib/cartodb/api/middlewares/map-store-map-config-provider.js index f84dd3fc..58cdb79e 100644 --- a/lib/cartodb/api/middlewares/map-store-map-config-provider.js +++ b/lib/cartodb/api/middlewares/map-store-map-config-provider.js @@ -2,7 +2,7 @@ const MapStoreMapConfigProvider = require('../../models/mapconfig/provider/map-s module.exports = function createMapStoreMapConfigProvider ( mapStore, - userLimitsApi, + userLimitsBackend, pgConnection, affectedTablesCache, forcedFormat = null @@ -26,7 +26,7 @@ module.exports = function createMapStoreMapConfigProvider ( res.locals.mapConfigProvider = new MapStoreMapConfigProvider( mapStore, user, - userLimitsApi, + userLimitsBackend, pgConnection, affectedTablesCache, params diff --git a/lib/cartodb/api/middlewares/rate-limit.js b/lib/cartodb/api/middlewares/rate-limit.js index b3c6d7fe..55062d76 100644 --- a/lib/cartodb/api/middlewares/rate-limit.js +++ b/lib/cartodb/api/middlewares/rate-limit.js @@ -19,13 +19,13 @@ const RATE_LIMIT_ENDPOINTS_GROUPS = { NAMED_TILES: 'named_tiles' }; -function rateLimit(userLimitsApi, endpointGroup = null) { +function rateLimit(userLimitsBackend, endpointGroup = null) { if (!isRateLimitEnabled(endpointGroup)) { return function rateLimitDisabledMiddleware(req, res, next) { next(); }; } return function rateLimitMiddleware(req, res, next) { - userLimitsApi.getRateLimit(res.locals.user, endpointGroup, function (err, userRateLimit) { + userLimitsBackend.getRateLimit(res.locals.user, endpointGroup, function (err, userRateLimit) { if (err) { return next(err); } diff --git a/lib/cartodb/api/template/admin-template-controller.js b/lib/cartodb/api/template/admin-template-controller.js index e79f6bd9..b4d1b65f 100644 --- a/lib/cartodb/api/template/admin-template-controller.js +++ b/lib/cartodb/api/template/admin-template-controller.js @@ -9,10 +9,10 @@ const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; * @param {TemplateMaps} templateMaps * @constructor */ -function AdminTemplateController(authBackend, templateMaps, userLimitsApi) { +function AdminTemplateController(authBackend, templateMaps, userLimitsBackend) { this.authBackend = authBackend; this.templateMaps = templateMaps; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; } module.exports = AdminTemplateController; @@ -24,7 +24,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { `/`, credentials(), authorizedByAPIKey({ authBackend: this.authBackend, action: 'create', label: 'POST TEMPLATE' }), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_CREATE), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_CREATE), checkContentType({ action: 'POST', label: 'POST TEMPLATE' }), createTemplate({ templateMaps: this.templateMaps }) ); @@ -33,7 +33,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { `/:template_id`, credentials(), authorizedByAPIKey({ authBackend: this.authBackend, action: 'update', label: 'PUT TEMPLATE' }), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_UPDATE), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_UPDATE), checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }), updateTemplate({ templateMaps: this.templateMaps }) ); @@ -42,7 +42,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { `/:template_id`, credentials(), authorizedByAPIKey({ authBackend: this.authBackend, action: 'get', label: 'GET TEMPLATE' }), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_GET), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_GET), retrieveTemplate({ templateMaps: this.templateMaps }) ); @@ -50,7 +50,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { `/:template_id`, credentials(), authorizedByAPIKey({ authBackend: this.authBackend, action: 'delete', label: 'DELETE TEMPLATE' }), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_DELETE), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_DELETE), destroyTemplate({ templateMaps: this.templateMaps }) ); @@ -58,7 +58,7 @@ AdminTemplateController.prototype.register = function (templateRouter) { `/`, credentials(), authorizedByAPIKey({ authBackend: this.authBackend, action: 'list', label: 'GET TEMPLATE LIST' }), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_LIST), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_LIST), listTemplates({ templateMaps: this.templateMaps }) ); }; diff --git a/lib/cartodb/api/template/named-template-controller.js b/lib/cartodb/api/template/named-template-controller.js index f61d5dc7..eed39b34 100644 --- a/lib/cartodb/api/template/named-template-controller.js +++ b/lib/cartodb/api/template/named-template-controller.js @@ -27,7 +27,7 @@ const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; * @param {MapBackend} mapBackend * @param metadataBackend * @param {SurrogateKeysCache} surrogateKeysCache - * @param {UserLimitsApi} userLimitsApi + * @param {UserLimitsBackend} userLimitsBackend * @param {LayergroupAffectedTables} layergroupAffectedTables * @param {MapConfigAdapter} mapConfigAdapter * @param {StatsBackend} statsBackend @@ -39,7 +39,7 @@ function NamedMapController ( mapBackend, metadataBackend, surrogateKeysCache, - userLimitsApi, + userLimitsBackend, layergroupAffectedTables, mapConfigAdapter, statsBackend, @@ -51,7 +51,7 @@ function NamedMapController ( this.mapBackend = mapBackend; this.metadataBackend = metadataBackend; this.surrogateKeysCache = surrogateKeysCache; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.layergroupAffectedTables = layergroupAffectedTables; this.mapConfigAdapter = mapConfigAdapter; this.statsBackend = statsBackend; @@ -84,7 +84,7 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED), cleanUpQueryParams(['aggregation']), initProfiler(isTemplateInstantiation), checkJsonContentType(), @@ -93,13 +93,13 @@ NamedMapController.prototype.composeInstantiateTemplateMiddleware = function () this.templateMaps, this.pgConnection, this.metadataBackend, - this.userLimitsApi, + this.userLimitsBackend, this.mapConfigAdapter, this.layergroupAffectedTables ), instantiateLayergroup( this.mapBackend, - this.userLimitsApi, + this.userLimitsBackend, this.pgConnection, this.layergroupAffectedTables ), @@ -145,7 +145,7 @@ function getTemplate ( templateMaps, pgConnection, metadataBackend, - userLimitsApi, + userLimitsBackend, mapConfigAdapter, affectedTablesCache ) { @@ -161,7 +161,7 @@ function getTemplate ( templateMaps, pgConnection, metadataBackend, - userLimitsApi, + userLimitsBackend, mapConfigAdapter, affectedTablesCache, user, @@ -186,13 +186,13 @@ function getTemplate ( }; } -function instantiateLayergroup (mapBackend, userLimitsApi, pgConnection, affectedTablesCache) { +function instantiateLayergroup (mapBackend, userLimitsBackend, pgConnection, affectedTablesCache) { return function instantiateLayergroupMiddleware (req, res, next) { const { user, mapConfig, rendererParams } = res.locals; const mapConfigProvider = new CreateLayergroupMapConfigProvider( mapConfig, user, - userLimitsApi, + userLimitsBackend, pgConnection, affectedTablesCache, rendererParams diff --git a/lib/cartodb/api/template/template-router.js b/lib/cartodb/api/template/template-router.js index 87f381d1..643e83c3 100644 --- a/lib/cartodb/api/template/template-router.js +++ b/lib/cartodb/api/template/template-router.js @@ -12,7 +12,7 @@ module.exports = class TemplateRouter { mapBackend, metadataBackend, surrogateKeysCache, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, mapConfigAdapter, statsBackend, @@ -28,7 +28,7 @@ module.exports = class TemplateRouter { mapBackend, metadataBackend, surrogateKeysCache, - userLimitsApi, + userLimitsBackend, layergroupAffectedTablesCache, mapConfigAdapter, statsBackend, @@ -42,13 +42,13 @@ module.exports = class TemplateRouter { surrogateKeysCache, pgConnection, authBackend, - userLimitsApi + userLimitsBackend ); this.adminTemplateController = new AdminTemplateController( authBackend, templateMaps, - userLimitsApi + userLimitsBackend ); } diff --git a/lib/cartodb/api/template/tile-template-controller.js b/lib/cartodb/api/template/tile-template-controller.js index 5e2cb72b..c99a0aea 100644 --- a/lib/cartodb/api/template/tile-template-controller.js +++ b/lib/cartodb/api/template/tile-template-controller.js @@ -17,14 +17,14 @@ function TileTemplateController ( surrogateKeysCache, pgConnection, authBackend, - userLimitsApi + userLimitsBackend ) { this.namedMapProviderCache = namedMapProviderCache; this.tileBackend = tileBackend; this.surrogateKeysCache = surrogateKeysCache; this.pgConnection = pgConnection; this.authBackend = authBackend; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; } module.exports = TileTemplateController; @@ -35,7 +35,7 @@ TileTemplateController.prototype.register = function (templateRouter) { credentials(), authorize(this.authBackend), dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_TILES), + rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_TILES), cleanUpQueryParams(), namedMapProvider({ namedMapProviderCache: this.namedMapProviderCache, diff --git a/lib/cartodb/backends/api/user_limits_api.js b/lib/cartodb/backends/user-limits.js similarity index 81% rename from lib/cartodb/backends/api/user_limits_api.js rename to lib/cartodb/backends/user-limits.js index caf9f151..519f1cd1 100644 --- a/lib/cartodb/backends/api/user_limits_api.js +++ b/lib/cartodb/backends/user-limits.js @@ -5,9 +5,9 @@ var step = require('step'); * @param metadataBackend * @param options * @constructor - * @type {UserLimitsApi} + * @type {UserLimitsBackend} */ -function UserLimitsApi(metadataBackend, options) { +function UserLimitsBackend(metadataBackend, options) { this.metadataBackend = metadataBackend; this.options = options || {}; this.options.limits = this.options.limits || {}; @@ -15,9 +15,9 @@ function UserLimitsApi(metadataBackend, options) { this.preprareRateLimit(); } -module.exports = UserLimitsApi; +module.exports = UserLimitsBackend; -UserLimitsApi.prototype.getRenderLimits = function (username, apiKey, callback) { +UserLimitsBackend.prototype.getRenderLimits = function (username, apiKey, callback) { var self = this; var limits = { @@ -40,7 +40,7 @@ UserLimitsApi.prototype.getRenderLimits = function (username, apiKey, callback) }); }; -UserLimitsApi.prototype.getTimeoutRenderLimit = function (username, apiKey, callback) { +UserLimitsBackend.prototype.getTimeoutRenderLimit = function (username, apiKey, callback) { var self = this; step( @@ -80,12 +80,12 @@ UserLimitsApi.prototype.getTimeoutRenderLimit = function (username, apiKey, call ); }; -UserLimitsApi.prototype.preprareRateLimit = function () { +UserLimitsBackend.prototype.preprareRateLimit = function () { if (this.options.limits.rateLimitsEnabled) { this.metadataBackend.loadRateLimitsScript(); } }; -UserLimitsApi.prototype.getRateLimit = function (user, endpointGroup, callback) { +UserLimitsBackend.prototype.getRateLimit = function (user, endpointGroup, callback) { this.metadataBackend.getRateLimit(user, 'maps', endpointGroup, callback); }; diff --git a/lib/cartodb/cache/named_map_provider_cache.js b/lib/cartodb/cache/named_map_provider_cache.js index e0850822..b64decb1 100644 --- a/lib/cartodb/cache/named_map_provider_cache.js +++ b/lib/cartodb/cache/named_map_provider_cache.js @@ -10,14 +10,14 @@ function NamedMapProviderCache( templateMaps, pgConnection, metadataBackend, - userLimitsApi, + userLimitsBackend, mapConfigAdapter, affectedTablesCache ) { this.templateMaps = templateMaps; this.pgConnection = pgConnection; this.metadataBackend = metadataBackend; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.mapConfigAdapter = mapConfigAdapter; this.affectedTablesCache = affectedTablesCache; @@ -36,7 +36,7 @@ NamedMapProviderCache.prototype.get = function(user, templateId, config, authTok this.templateMaps, this.pgConnection, this.metadataBackend, - this.userLimitsApi, + this.userLimitsBackend, this.mapConfigAdapter, this.affectedTablesCache, user, diff --git a/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js b/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js index b3b3f191..fe92bb47 100644 --- a/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js +++ b/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js @@ -7,16 +7,16 @@ const QueryTables = require('cartodb-query-tables'); /** * @param {MapConfig} mapConfig * @param {String} user - * @param {UserLimitsApi} userLimitsApi + * @param {UserLimitsBackend} userLimitsBackend * @param {Object} params * @constructor * @type {CreateLayergroupMapConfigProvider} */ -function CreateLayergroupMapConfigProvider(mapConfig, user, userLimitsApi, pgConnection, affectedTablesCache, params) { +function CreateLayergroupMapConfigProvider(mapConfig, user, userLimitsBackend, pgConnection, affectedTablesCache, params) { this.mapConfig = mapConfig; this.user = user; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.pgConnection = pgConnection; this.affectedTablesCache = affectedTablesCache; this.params = params; @@ -36,7 +36,7 @@ CreateLayergroupMapConfigProvider.prototype.getMapConfig = function(callback) { step( function prepareContextLimits() { - self.userLimitsApi.getRenderLimits(self.user, self.params.api_key, this); + self.userLimitsBackend.getRenderLimits(self.user, self.params.api_key, this); }, function handleRenderLimits(err, renderLimits) { assert.ifError(err); diff --git a/lib/cartodb/models/mapconfig/provider/map-store-provider.js b/lib/cartodb/models/mapconfig/provider/map-store-provider.js index f89a79ce..d57c8d7b 100644 --- a/lib/cartodb/models/mapconfig/provider/map-store-provider.js +++ b/lib/cartodb/models/mapconfig/provider/map-store-provider.js @@ -7,15 +7,15 @@ const QueryTables = require('cartodb-query-tables'); /** * @param {MapStore} mapStore * @param {String} user - * @param {UserLimitsApi} userLimitsApi + * @param {UserLimitsBackend} userLimitsBackend * @param {Object} params * @constructor * @type {MapStoreMapConfigProvider} */ -function MapStoreMapConfigProvider(mapStore, user, userLimitsApi, pgConnection, affectedTablesCache, params) { +function MapStoreMapConfigProvider(mapStore, user, userLimitsBackend, pgConnection, affectedTablesCache, params) { this.mapStore = mapStore; this.user = user; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.pgConnection = pgConnection; this.affectedTablesCache = affectedTablesCache; this.token = params.token; @@ -38,7 +38,7 @@ MapStoreMapConfigProvider.prototype.getMapConfig = function(callback) { step( function prepareContextLimits() { - self.userLimitsApi.getRenderLimits(self.user, self.params.api_key, this); + self.userLimitsBackend.getRenderLimits(self.user, self.params.api_key, this); }, function handleRenderLimits(err, renderLimits) { assert.ifError(err); diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 50612065..5e931679 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -15,7 +15,7 @@ function NamedMapMapConfigProvider( templateMaps, pgConnection, metadataBackend, - userLimitsApi, + userLimitsBackend, mapConfigAdapter, affectedTablesCache, owner, @@ -27,7 +27,7 @@ function NamedMapMapConfigProvider( this.templateMaps = templateMaps; this.pgConnection = pgConnection; this.metadataBackend = metadataBackend; - this.userLimitsApi = userLimitsApi; + this.userLimitsBackend = userLimitsBackend; this.mapConfigAdapter = mapConfigAdapter; this.owner = owner; @@ -125,7 +125,7 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { function prepareContextLimits(err, _mapConfig) { assert.ifError(err); mapConfig = _mapConfig; - self.userLimitsApi.getRenderLimits(self.owner, self.params.api_key, this); + self.userLimitsBackend.getRenderLimits(self.owner, self.params.api_key, this); }, function cacheAndReturnMapConfig(err, renderLimits) { self.err = err; diff --git a/test/acceptance/rate-limit.test.js b/test/acceptance/rate-limit.test.js index 5b7cdbc0..925d5028 100644 --- a/test/acceptance/rate-limit.test.js +++ b/test/acceptance/rate-limit.test.js @@ -5,7 +5,7 @@ const redis = require('redis'); const RedisPool = require('redis-mpool'); const cartodbRedis = require('cartodb-redis'); const TestClient = require('../support/test-client'); -const UserLimitsApi = require('../../lib/cartodb/backends/api/user_limits_api'); +const UserLimitsBackend = require('../../lib/cartodb/backends/user-limits'); const rateLimitMiddleware = require('../../lib/cartodb/api/middlewares/rate-limit'); const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimitMiddleware; @@ -218,7 +218,7 @@ describe('rate limit middleware', function () { const redisPool = new RedisPool(global.environment.redis); const metadataBackend = cartodbRedis({ pool: redisPool }); - userLimitsApi = new UserLimitsApi(metadataBackend, { + userLimitsApi = new UserLimitsBackend(metadataBackend, { limits: { rateLimitsEnabled: global.environment.enabledFeatures.rateLimitsEnabled } From 1bbd84b37a514581d7a7dfa2b817e4250b71ee83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 10 Apr 2018 15:56:52 +0200 Subject: [PATCH 43/54] Please jshint --- .../mapconfig/provider/create-layergroup-provider.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js b/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js index fe92bb47..7e48a9bb 100644 --- a/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js +++ b/lib/cartodb/models/mapconfig/provider/create-layergroup-provider.js @@ -13,7 +13,14 @@ const QueryTables = require('cartodb-query-tables'); * @type {CreateLayergroupMapConfigProvider} */ -function CreateLayergroupMapConfigProvider(mapConfig, user, userLimitsBackend, pgConnection, affectedTablesCache, params) { +function CreateLayergroupMapConfigProvider( + mapConfig, + user, + userLimitsBackend, + pgConnection, + affectedTablesCache, + params +) { this.mapConfig = mapConfig; this.user = user; this.userLimitsBackend = userLimitsBackend; From c0943a7c580d9b355f7cec4b4b67ca162f03549c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 10 Apr 2018 20:26:36 +0200 Subject: [PATCH 44/54] Use config to define base path for express routers --- lib/cartodb/api/api-router.js | 11 +++-------- lib/cartodb/api/map/map-router.js | 9 ++++----- lib/cartodb/api/template/template-router.js | 9 ++++----- lib/cartodb/server_options.js | 13 +++++++++++++ .../ported/support/ported_server_options.js | 14 ++++++++++++++ 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/lib/cartodb/api/api-router.js b/lib/cartodb/api/api-router.js index 7108bbbf..d75d23a5 100644 --- a/lib/cartodb/api/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -176,8 +176,8 @@ module.exports = class ApiRouter { tablesExtentBackend }; - this.mapRouter = new MapRouter({ collaborators }); - this.templateRouter = new TemplateRouter({ collaborators }); + this.mapRouter = new MapRouter({ collaborators, serverOptions }); + this.templateRouter = new TemplateRouter({ collaborators, serverOptions }); } register (app) { @@ -206,12 +206,7 @@ module.exports = class ApiRouter { apiRouter.use(syntaxError()); apiRouter.use(errorMiddleware()); - const paths = [ - '/api/v1', - '/user/:user/api/v1', - '/tiles', // Deprecated - '/database/:dbname' // Deprecated: used in ported test from windshaft - ]; + const paths = this.serverOptions.api_base_paths; app.use(`(?:${paths.join('|')})`, apiRouter); } diff --git a/lib/cartodb/api/map/map-router.js b/lib/cartodb/api/map/map-router.js index a6e91c29..e8a3c2fb 100644 --- a/lib/cartodb/api/map/map-router.js +++ b/lib/cartodb/api/map/map-router.js @@ -10,7 +10,9 @@ const PreviewTemplateController = require('./preview-template-controller'); const AnalysesCatalogController = require('./analyses-catalog-controller'); module.exports = class MapRouter { - constructor ({ collaborators }) { + constructor ({ collaborators, serverOptions }) { + this.serverOptions = serverOptions; + const { analysisStatusBackend, attributesBackend, @@ -127,10 +129,7 @@ module.exports = class MapRouter { this.previewTemplateController.register(mapRouter); this.analysesController.register(mapRouter); - const paths = [ - '/map', - '/layergroup' - ]; + const paths = this.serverOptions.map_base_paths; apiRouter.use(`(?:${paths.join('|')})`, mapRouter); } diff --git a/lib/cartodb/api/template/template-router.js b/lib/cartodb/api/template/template-router.js index 643e83c3..9b759f0a 100644 --- a/lib/cartodb/api/template/template-router.js +++ b/lib/cartodb/api/template/template-router.js @@ -5,7 +5,9 @@ const AdminTemplateController = require('./admin-template-controller'); const TileTemplateController = require('./tile-template-controller'); module.exports = class TemplateRouter { - constructor ({ collaborators }) { + constructor ({ collaborators, serverOptions }) { + this.serverOptions = serverOptions; + const { pgConnection, templateMaps, @@ -59,10 +61,7 @@ module.exports = class TemplateRouter { this.tileTemplateController.register(templateRouter); this.adminTemplateController.register(templateRouter); - const paths = [ - '/map/named', - '/template' - ]; + const paths = this.serverOptions.template_base_paths; apiRouter.use(`(?:${paths.join('|')})`, templateRouter); } diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index adc03003..c73a6bca 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -67,6 +67,19 @@ module.exports = { // FIXME: Remove it. This is no longer needed, paths are defined in routers base_url_templated: global.environment.base_url_templated || '(?:/maps/named|/tiles/template)', + api_base_paths: global.environment.api_base_paths || [ + '/api/v1', + '/user/:user/api/v1' + ], + + map_base_paths: global.environment.map_base_paths || [ + '/map' + ], + + template_base_paths: global.environment.template_base_paths || [ + '/map/named' + ], + grainstore: { map: { // TODO: allow to specify in configuration diff --git a/test/acceptance/ported/support/ported_server_options.js b/test/acceptance/ported/support/ported_server_options.js index 1ce262af..931fa584 100644 --- a/test/acceptance/ported/support/ported_server_options.js +++ b/test/acceptance/ported/support/ported_server_options.js @@ -11,6 +11,20 @@ module.exports = _.extend({}, serverOptions, { base_url: '/database/:dbname/table/:table', // FIXME: Remove it. This is no longer needed, paths are defined in routers base_url_mapconfig: '/database/:dbname/layergroup', + + api_base_paths: [ + '/tiles', + '/database/:dbname' + ], + + map_base_paths: [ + '/layergroup' + ], + + template_base_paths: [ + '/template' + ], + grainstore: { datasource: { geometry_field: 'the_geom', From e06d3200c31f4e9e15b444980653d4c450f7f31e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 11 Apr 2018 12:33:07 +0200 Subject: [PATCH 45/54] Use a better API to define public routes --- lib/cartodb/api/api-router.js | 2 +- lib/cartodb/api/map/map-router.js | 2 +- lib/cartodb/api/template/template-router.js | 2 +- lib/cartodb/server_options.js | 30 +++++++++++-------- .../ported/support/ported_server_options.js | 30 +++++++++++-------- 5 files changed, 39 insertions(+), 27 deletions(-) diff --git a/lib/cartodb/api/api-router.js b/lib/cartodb/api/api-router.js index d75d23a5..b122a343 100644 --- a/lib/cartodb/api/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -206,7 +206,7 @@ module.exports = class ApiRouter { apiRouter.use(syntaxError()); apiRouter.use(errorMiddleware()); - const paths = this.serverOptions.api_base_paths; + const paths = this.serverOptions.routes.api.paths; app.use(`(?:${paths.join('|')})`, apiRouter); } diff --git a/lib/cartodb/api/map/map-router.js b/lib/cartodb/api/map/map-router.js index e8a3c2fb..ae681168 100644 --- a/lib/cartodb/api/map/map-router.js +++ b/lib/cartodb/api/map/map-router.js @@ -129,7 +129,7 @@ module.exports = class MapRouter { this.previewTemplateController.register(mapRouter); this.analysesController.register(mapRouter); - const paths = this.serverOptions.map_base_paths; + const paths = this.serverOptions.routes.api.map.paths; apiRouter.use(`(?:${paths.join('|')})`, mapRouter); } diff --git a/lib/cartodb/api/template/template-router.js b/lib/cartodb/api/template/template-router.js index 9b759f0a..cfb883e7 100644 --- a/lib/cartodb/api/template/template-router.js +++ b/lib/cartodb/api/template/template-router.js @@ -61,7 +61,7 @@ module.exports = class TemplateRouter { this.tileTemplateController.register(templateRouter); this.adminTemplateController.register(templateRouter); - const paths = this.serverOptions.template_base_paths; + const paths = this.serverOptions.routes.api.template.paths; apiRouter.use(`(?:${paths.join('|')})`, templateRouter); } diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index c73a6bca..d05e5e1d 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -67,18 +67,24 @@ module.exports = { // FIXME: Remove it. This is no longer needed, paths are defined in routers base_url_templated: global.environment.base_url_templated || '(?:/maps/named|/tiles/template)', - api_base_paths: global.environment.api_base_paths || [ - '/api/v1', - '/user/:user/api/v1' - ], - - map_base_paths: global.environment.map_base_paths || [ - '/map' - ], - - template_base_paths: global.environment.template_base_paths || [ - '/map/named' - ], + routes: global.environment.routes || { + api: { + paths: [ + '/api/v1', + '/user/:user/api/v1' + ], + map: { + paths: [ + '/map' + ] + }, + template: { + paths: [ + '/map/named' + ] + } + } + }, grainstore: { map: { diff --git a/test/acceptance/ported/support/ported_server_options.js b/test/acceptance/ported/support/ported_server_options.js index 931fa584..d850b1c9 100644 --- a/test/acceptance/ported/support/ported_server_options.js +++ b/test/acceptance/ported/support/ported_server_options.js @@ -12,18 +12,24 @@ module.exports = _.extend({}, serverOptions, { // FIXME: Remove it. This is no longer needed, paths are defined in routers base_url_mapconfig: '/database/:dbname/layergroup', - api_base_paths: [ - '/tiles', - '/database/:dbname' - ], - - map_base_paths: [ - '/layergroup' - ], - - template_base_paths: [ - '/template' - ], + routes: { + api: { + paths: [ + '/tiles', + '/database/:dbname' + ], + map: { + paths: [ + '/layergroup' + ] + }, + template: { + paths: [ + '/template' + ] + } + } + }, grainstore: { datasource: { From 9a52edacb2a7ac56659af060bb490e34e6956c19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 11 Apr 2018 16:00:14 +0200 Subject: [PATCH 46/54] Add routes configuration to config example files --- config/environments/development.js.example | 34 ++++++++++++++++++++++ config/environments/production.js.example | 34 ++++++++++++++++++++++ config/environments/staging.js.example | 34 ++++++++++++++++++++++ 3 files changed, 102 insertions(+) diff --git a/config/environments/development.js.example b/config/environments/development.js.example index 12de0912..95711dad 100644 --- a/config/environments/development.js.example +++ b/config/environments/development.js.example @@ -13,6 +13,8 @@ var config = { // from hostname. Must have a single grabbing block. ,user_from_host: '^(.*)\\.localhost' + // DEPRECATED: use routes property instead + // --------------------------------------- // Base URLs for the APIs // // See http://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API @@ -26,6 +28,38 @@ var config = { // "tiles/layergroup" is for compatibility with versions up to 1.6.x ,base_url_detached: '(?:/api/v1/map|/user/:user/api/v1/map|/tiles/layergroup)' + // Base URLs for the APIs + // + // See https://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API + ,routes: { + api: { + // "/tiles" is for compatibility with versions up to 1.6.x + paths: [ + '/api/v1', + '/user/:user/api/v1', + '/tiles' // for compatibility with versions up to 1.6.x + ], + // Base url for the Detached Maps API + // "maps" is the the new API, + // "tiles/layergroup" is for compatibility with versions up to 1.6.x + map: { + paths: [ + '/map', + '/layergroup' + ] + }, + // Base url for the Templated Maps API + // "/api/v1/map/named" is the new API, + // "/tiles/template" is for compatibility with versions up to 1.6.x + template: { + paths: [ + '/map/named', + '/template' + ] + } + } + } + // Resource URLs expose endpoints to request/retrieve metadata associated to Maps: dataviews, analysis node status. // // This URLs depend on how `base_url_detached` and `user_from_host` are configured: the application can be diff --git a/config/environments/production.js.example b/config/environments/production.js.example index beb9f15c..7b552507 100644 --- a/config/environments/production.js.example +++ b/config/environments/production.js.example @@ -13,6 +13,8 @@ var config = { // from hostname. Must have a single grabbing block. ,user_from_host: '^(.*)\\.cartodb\\.com$' + // DEPRECATED: use routes property instead + // --------------------------------------- // Base URLs for the APIs // // See http://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API @@ -26,6 +28,38 @@ var config = { // "tiles/layergroup" is for compatibility with versions up to 1.6.x ,base_url_detached: '(?:/api/v1/map|/user/:user/api/v1/map|/tiles/layergroup)' + // Base URLs for the APIs + // + // See https://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API + ,routes: { + api: { + // "/tiles" is for compatibility with versions up to 1.6.x + paths: [ + '/api/v1', + '/user/:user/api/v1', + '/tiles' // for compatibility with versions up to 1.6.x + ], + // Base url for the Detached Maps API + // "maps" is the the new API, + // "tiles/layergroup" is for compatibility with versions up to 1.6.x + map: { + paths: [ + '/map', + '/layergroup' + ] + }, + // Base url for the Templated Maps API + // "/api/v1/map/named" is the new API, + // "/tiles/template" is for compatibility with versions up to 1.6.x + template: { + paths: [ + '/map/named', + '/template' + ] + } + } + } + // Resource URLs expose endpoints to request/retrieve metadata associated to Maps: dataviews, analysis node status. // // This URLs depend on how `base_url_detached` and `user_from_host` are configured: the application can be diff --git a/config/environments/staging.js.example b/config/environments/staging.js.example index 40d3bb8b..29c15781 100644 --- a/config/environments/staging.js.example +++ b/config/environments/staging.js.example @@ -13,6 +13,8 @@ var config = { // from hostname. Must have a single grabbing block. ,user_from_host: '^(.*)\\.cartodb\\.com$' + // DEPRECATED: use routes property instead + // --------------------------------------- // Base URLs for the APIs // // See http://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API @@ -26,6 +28,38 @@ var config = { // "/tiles/layergroup" is for compatibility with versions up to 1.6.x ,base_url_detached: '(?:/api/v1/map|/user/:user/api/v1/map|/tiles/layergroup)' + // Base URLs for the APIs + // + // See https://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API + ,routes: { + api: { + // "/tiles" is for compatibility with versions up to 1.6.x + paths: [ + '/api/v1', + '/user/:user/api/v1', + '/tiles' // for compatibility with versions up to 1.6.x + ], + // Base url for the Detached Maps API + // "maps" is the the new API, + // "tiles/layergroup" is for compatibility with versions up to 1.6.x + map: { + paths: [ + '/map', + '/layergroup' + ] + }, + // Base url for the Templated Maps API + // "/api/v1/map/named" is the new API, + // "/tiles/template" is for compatibility with versions up to 1.6.x + template: { + paths: [ + '/map/named', + '/template' + ] + } + } + } + // Resource URLs expose endpoints to request/retrieve metadata associated to Maps: dataviews, analysis node status. // // This URLs depend on how `base_url_detached` and `user_from_host` are configured: the application can be From 730b29c9cc5b5fbf5521f50ba72779a6271217f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 11 Apr 2018 18:51:44 +0200 Subject: [PATCH 47/54] Remove defined dependecies but never used --- .../api/map/analysis-layergroup-controller.js | 13 +------------ lib/cartodb/api/map/map-router.js | 5 +---- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/lib/cartodb/api/map/analysis-layergroup-controller.js b/lib/cartodb/api/map/analysis-layergroup-controller.js index 5d89803b..0e46dc81 100644 --- a/lib/cartodb/api/map/analysis-layergroup-controller.js +++ b/lib/cartodb/api/map/analysis-layergroup-controller.js @@ -8,22 +8,11 @@ const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit; const dbParamsFromResLocals = require('../../utils/database-params'); module.exports = class AnalysisLayergroupController { - constructor ( - analysisStatusBackend, - pgConnection, - mapStore, - userLimitsBackend, - layergroupAffectedTablesCache, - authBackend, - surrogateKeysCache - ) { + constructor (analysisStatusBackend, pgConnection, userLimitsBackend, authBackend) { this.analysisStatusBackend = analysisStatusBackend; this.pgConnection = pgConnection; - this.mapStore = mapStore; this.userLimitsBackend = userLimitsBackend; - this.layergroupAffectedTablesCache = layergroupAffectedTablesCache; this.authBackend = authBackend; - this.surrogateKeysCache = surrogateKeysCache; } register (mapRouter) { diff --git a/lib/cartodb/api/map/map-router.js b/lib/cartodb/api/map/map-router.js index ae681168..a3c2bbaa 100644 --- a/lib/cartodb/api/map/map-router.js +++ b/lib/cartodb/api/map/map-router.js @@ -38,11 +38,8 @@ module.exports = class MapRouter { this.analysisLayergroupController = new AnalysisLayergroupController( analysisStatusBackend, pgConnection, - mapStore, userLimitsBackend, - layergroupAffectedTablesCache, - authBackend, - surrogateKeysCache + authBackend ); this.attributesLayergroupController = new AttributesLayergroupController( From 56495522b8a23d96db22789dd654ec6d032ee3d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 18 Apr 2018 18:52:09 +0200 Subject: [PATCH 48/54] Use array of path to avoid collisions and extract scale-factor param properly --- .../api/map/tile-layergroup-controller.js | 32 ++----------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/lib/cartodb/api/map/tile-layergroup-controller.js b/lib/cartodb/api/map/tile-layergroup-controller.js index c79929b7..2c049019 100644 --- a/lib/cartodb/api/map/tile-layergroup-controller.js +++ b/lib/cartodb/api/map/tile-layergroup-controller.js @@ -42,13 +42,11 @@ module.exports = class TileLayergroupController { } register (mapRouter) { - // REGEXP matches with positive and negative numnbers - const number = () => `(-?\\d+)`; // REGEXP doesn't match with `val` const not = (val) => `(?!${val})([^\/]+?)`; mapRouter.get( - `/:token/:z${number()}/:x${number()}/:y${number()}@:scale_factor${number()}?x.:format`, + [ `/:token/:z/:x/:y@:scale_factor?x.:format`, `/:token/:z/:x/:y.:format` ], layergroupToken(), coordinates(), credentials(), @@ -74,33 +72,7 @@ module.exports = class TileLayergroupController { ); mapRouter.get( - `/:token/:z${number()}/:x${number()}/:y${number()}.:format`, - layergroupToken(), - coordinates(), - credentials(), - authorize(this.authBackend), - dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), - cleanUpQueryParams(), - createMapStoreMapConfigProvider( - this.mapStore, - this.userLimitsBackend, - this.pgConnection, - this.layergroupAffectedTablesCache - ), - getTile(this.tileBackend, 'map_tile'), - cacheControlHeader(), - cacheChannelHeader(), - surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - incrementSuccessMetrics(global.statsClient), - incrementErrorMetrics(global.statsClient), - tileError(), - vectorError() - ); - - mapRouter.get( - `/:token${not('static')}/:layer/:z${number()}/:x${number()}/:y${number()}.(:format)`, + `/:token${not('static')}/:layer/:z/:x/:y.(:format)`, layergroupToken(), coordinates(), credentials(), From 9bd9503e9bb22fd2b65ecdc2d032b913ab546b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 18 Apr 2018 19:07:38 +0200 Subject: [PATCH 49/54] Merge paths to perform the same middleware stack --- .../api/map/tile-layergroup-controller.js | 39 ++++--------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/lib/cartodb/api/map/tile-layergroup-controller.js b/lib/cartodb/api/map/tile-layergroup-controller.js index 2c049019..f882d13c 100644 --- a/lib/cartodb/api/map/tile-layergroup-controller.js +++ b/lib/cartodb/api/map/tile-layergroup-controller.js @@ -45,8 +45,11 @@ module.exports = class TileLayergroupController { // REGEXP doesn't match with `val` const not = (val) => `(?!${val})([^\/]+?)`; - mapRouter.get( - [ `/:token/:z/:x/:y@:scale_factor?x.:format`, `/:token/:z/:x/:y.:format` ], + mapRouter.get([ + `/:token/:z/:x/:y@:scale_factor?x.:format`, + `/:token/:z/:x/:y.:format`, + `/:token${not('static')}/:layer/:z/:x/:y.(:format)` + ], layergroupToken(), coordinates(), credentials(), @@ -60,33 +63,7 @@ module.exports = class TileLayergroupController { this.pgConnection, this.layergroupAffectedTablesCache ), - getTile(this.tileBackend, 'map_tile'), - cacheControlHeader(), - cacheChannelHeader(), - surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), - lastModifiedHeader(), - incrementSuccessMetrics(global.statsClient), - incrementErrorMetrics(global.statsClient), - tileError(), - vectorError() - ); - - mapRouter.get( - `/:token${not('static')}/:layer/:z/:x/:y.(:format)`, - layergroupToken(), - coordinates(), - credentials(), - authorize(this.authBackend), - dbConnSetup(this.pgConnection), - rateLimit(this.userLimitsBackend, RATE_LIMIT_ENDPOINTS_GROUPS.TILE), - cleanUpQueryParams(), - createMapStoreMapConfigProvider( - this.mapStore, - this.userLimitsBackend, - this.pgConnection, - this.layergroupAffectedTablesCache - ), - getTile(this.tileBackend, 'maplayer_tile'), + getTile(this.tileBackend), cacheControlHeader(), cacheChannelHeader(), surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }), @@ -108,9 +85,9 @@ function getStatusCode(tile, format){ return tile.length === 0 && format === 'mvt' ? 204 : 200; } -function getTile (tileBackend, profileLabel = 'tile') { +function getTile (tileBackend) { return function getTileMiddleware (req, res, next) { - req.profiler.start(`windshaft.${profileLabel}`); + req.profiler.start(`windshaft.${req.params.layer ? 'maplayer_tile' : 'map_tile'}`); const { mapConfigProvider } = res.locals; const { token } = res.locals; From 3c3731252dfffb2a197f6b18ad89a49c5859ab67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 7 May 2018 18:24:41 +0200 Subject: [PATCH 50/54] Respect default values with object.assign --- lib/cartodb/controllers/factory.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/cartodb/controllers/factory.js b/lib/cartodb/controllers/factory.js index ce341fbd..27ad35bf 100644 --- a/lib/cartodb/controllers/factory.js +++ b/lib/cartodb/controllers/factory.js @@ -59,11 +59,11 @@ const ServerInfoController = require('./server-info'); module.exports = class ControllersFactory { constructor ({ serverOptions, environmentOptions }) { - const redisOptions = Object.assign({}, environmentOptions.redis, { + const redisOptions = Object.assign({ name: 'windshaft-server', unwatchOnRelease: false, noReadyCheck: true - }); + }, environmentOptions.redis); const redisPool = new RedisPool(redisOptions); @@ -84,10 +84,11 @@ module.exports = class ControllersFactory { const rendererFactory = createRendererFactory({ redisPool, serverOptions, environmentOptions }); - const rendererCacheOpts = Object.assign({}, serverOptions.renderCache || {}, { + const rendererCacheOpts = Object.assign({ ttl: 60000, // 60 seconds TTL by default statsInterval: 60000 // reports stats every milliseconds defined here - }); + }, serverOptions.renderCache || {}); + const rendererCache = new windshaft.cache.RendererCache(rendererFactory, rendererCacheOpts); const rendererStatsReporter = new RendererStatsReporter(rendererCache, rendererCacheOpts.statsInterval); rendererStatsReporter.start(); From 9feea665505eaeda50feea9246a1458286e06ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 9 May 2018 14:59:21 +0200 Subject: [PATCH 51/54] Use routes configuration to create and mount routes and controllers --- config/environments/development.js.example | 28 +++++++++--- config/environments/production.js.example | 28 +++++++++--- config/environments/staging.js.example | 28 +++++++++--- config/environments/test.js.example | 48 +++++++++++++++++++++ lib/cartodb/api/api-router.js | 44 ++++++++++--------- lib/cartodb/api/map/map-router.js | 10 ++--- lib/cartodb/api/template/template-router.js | 10 ++--- lib/cartodb/server_options.js | 33 ++++++++++++-- 8 files changed, 171 insertions(+), 58 deletions(-) diff --git a/config/environments/development.js.example b/config/environments/development.js.example index e11b2a28..f9c58abb 100644 --- a/config/environments/development.js.example +++ b/config/environments/development.js.example @@ -32,28 +32,42 @@ var config = { // // See https://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API ,routes: { - api: { - // "/tiles" is for compatibility with versions up to 1.6.x + v1: { paths: [ '/api/v1', '/user/:user/api/v1', - '/tiles' // for compatibility with versions up to 1.6.x ], // Base url for the Detached Maps API - // "maps" is the the new API, - // "tiles/layergroup" is for compatibility with versions up to 1.6.x + // "/api/v1/map" is the new API, map: { paths: [ '/map', - '/layergroup' ] }, // Base url for the Templated Maps API // "/api/v1/map/named" is the new API, + template: { + paths: [ + '/map/named' + ] + } + }, + // For compatibility with versions up to 1.6.x + v0: { + paths: [ + '/tiles' + ], + // Base url for the Detached Maps API + // "/tiles/layergroup" is for compatibility with versions up to 1.6.x + map: { + paths: [ + '/layergroup' + ] + }, + // Base url for the Templated Maps API // "/tiles/template" is for compatibility with versions up to 1.6.x template: { paths: [ - '/map/named', '/template' ] } diff --git a/config/environments/production.js.example b/config/environments/production.js.example index 24eb18fd..89c5e5bd 100644 --- a/config/environments/production.js.example +++ b/config/environments/production.js.example @@ -32,28 +32,42 @@ var config = { // // See https://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API ,routes: { - api: { - // "/tiles" is for compatibility with versions up to 1.6.x + v1: { paths: [ '/api/v1', '/user/:user/api/v1', - '/tiles' // for compatibility with versions up to 1.6.x ], // Base url for the Detached Maps API - // "maps" is the the new API, - // "tiles/layergroup" is for compatibility with versions up to 1.6.x + // "/api/v1/map" is the new API, map: { paths: [ '/map', - '/layergroup' ] }, // Base url for the Templated Maps API // "/api/v1/map/named" is the new API, + template: { + paths: [ + '/map/named' + ] + } + }, + // For compatibility with versions up to 1.6.x + v0: { + paths: [ + '/tiles' + ], + // Base url for the Detached Maps API + // "/tiles/layergroup" is for compatibility with versions up to 1.6.x + map: { + paths: [ + '/layergroup' + ] + }, + // Base url for the Templated Maps API // "/tiles/template" is for compatibility with versions up to 1.6.x template: { paths: [ - '/map/named', '/template' ] } diff --git a/config/environments/staging.js.example b/config/environments/staging.js.example index 28c66185..76353f9b 100644 --- a/config/environments/staging.js.example +++ b/config/environments/staging.js.example @@ -32,28 +32,42 @@ var config = { // // See https://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API ,routes: { - api: { - // "/tiles" is for compatibility with versions up to 1.6.x + v1: { paths: [ '/api/v1', '/user/:user/api/v1', - '/tiles' // for compatibility with versions up to 1.6.x ], // Base url for the Detached Maps API - // "maps" is the the new API, - // "tiles/layergroup" is for compatibility with versions up to 1.6.x + // "/api/v1/map" is the new API, map: { paths: [ '/map', - '/layergroup' ] }, // Base url for the Templated Maps API // "/api/v1/map/named" is the new API, + template: { + paths: [ + '/map/named' + ] + } + }, + // For compatibility with versions up to 1.6.x + v0: { + paths: [ + '/tiles' + ], + // Base url for the Detached Maps API + // "/tiles/layergroup" is for compatibility with versions up to 1.6.x + map: { + paths: [ + '/layergroup' + ] + }, + // Base url for the Templated Maps API // "/tiles/template" is for compatibility with versions up to 1.6.x template: { paths: [ - '/map/named', '/template' ] } diff --git a/config/environments/test.js.example b/config/environments/test.js.example index 4d2c2d27..1f4e34a6 100644 --- a/config/environments/test.js.example +++ b/config/environments/test.js.example @@ -13,6 +13,8 @@ var config = { // from hostname. Must have a single grabbing block. ,user_from_host: '(.*)' + // DEPRECATED: use routes property instead + // --------------------------------------- // Base URLs for the APIs // // See https://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API @@ -26,6 +28,52 @@ var config = { // "tiles/layergroup" is for compatibility with versions up to 1.6.x ,base_url_detached: '(?:/api/v1/map|/user/:user/api/v1/map|/tiles/layergroup)' + // Base URLs for the APIs + // + // See https://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API + ,routes: { + v1: { + paths: [ + '/api/v1', + '/user/:user/api/v1', + ], + // Base url for the Detached Maps API + // "/api/v1/map" is the new API, + map: { + paths: [ + '/map', + ] + }, + // Base url for the Templated Maps API + // "/api/v1/map/named" is the new API, + template: { + paths: [ + '/map/named' + ] + } + }, + // For compatibility with versions up to 1.6.x + v0: { + paths: [ + '/tiles' + ], + // Base url for the Detached Maps API + // "/tiles/layergroup" is for compatibility with versions up to 1.6.x + map: { + paths: [ + '/layergroup' + ] + }, + // Base url for the Templated Maps API + // "/tiles/template" is for compatibility with versions up to 1.6.x + template: { + paths: [ + '/template' + ] + } + } + } + // Resource URLs expose endpoints to request/retrieve metadata associated to Maps: dataviews, analysis node status. // // This URLs depend on how `base_url_detached` and `user_from_host` are configured: the application can be diff --git a/lib/cartodb/api/api-router.js b/lib/cartodb/api/api-router.js index ecffe562..5165007d 100644 --- a/lib/cartodb/api/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -177,8 +177,8 @@ module.exports = class ApiRouter { tablesExtentBackend }; - this.mapRouter = new MapRouter({ collaborators, serverOptions }); - this.templateRouter = new TemplateRouter({ collaborators, serverOptions }); + this.mapRouter = new MapRouter({ collaborators }); + this.templateRouter = new TemplateRouter({ collaborators }); } register (app) { @@ -187,29 +187,33 @@ module.exports = class ApiRouter { app.layergroupAffectedTablesCache = this.layergroupAffectedTablesCache; } - const apiRouter = router(); + Object.keys(this.serverOptions.routes).forEach(apiVersion => { + const routes = this.serverOptions.routes[apiVersion]; - apiRouter.use(logger(this.serverOptions)); - apiRouter.use(bodyParser.json()); - apiRouter.use(servedByHostHeader()); - apiRouter.use(stats({ - enabled: this.serverOptions.useProfiler, - statsClient: global.statsClient - })); - apiRouter.use(lzmaMiddleware()); - apiRouter.use(cors()); - apiRouter.use(user()); + const apiRouter = router(); - this.templateRouter.register(apiRouter); - this.mapRouter.register(apiRouter); + apiRouter.use(logger(this.serverOptions)); + apiRouter.use(bodyParser.json()); + apiRouter.use(servedByHostHeader()); + apiRouter.use(stats({ + enabled: this.serverOptions.useProfiler, + statsClient: global.statsClient + })); + apiRouter.use(lzmaMiddleware()); + apiRouter.use(cors()); + apiRouter.use(user()); - apiRouter.use(sendResponse()); - apiRouter.use(syntaxError()); - apiRouter.use(errorMiddleware()); + this.templateRouter.register(apiRouter, routes.template.paths); + this.mapRouter.register(apiRouter, routes.map.paths); - const paths = this.serverOptions.routes.api.paths; + apiRouter.use(sendResponse()); + apiRouter.use(syntaxError()); + apiRouter.use(errorMiddleware()); - app.use(`(?:${paths.join('|')})`, apiRouter); + const apiPaths = routes.paths; + + apiPaths.forEach(path => app.use(path, apiRouter)); + }); } }; diff --git a/lib/cartodb/api/map/map-router.js b/lib/cartodb/api/map/map-router.js index a3c2bbaa..03f19937 100644 --- a/lib/cartodb/api/map/map-router.js +++ b/lib/cartodb/api/map/map-router.js @@ -10,9 +10,7 @@ const PreviewTemplateController = require('./preview-template-controller'); const AnalysesCatalogController = require('./analyses-catalog-controller'); module.exports = class MapRouter { - constructor ({ collaborators, serverOptions }) { - this.serverOptions = serverOptions; - + constructor ({ collaborators }) { const { analysisStatusBackend, attributesBackend, @@ -114,7 +112,7 @@ module.exports = class MapRouter { ); } - register (apiRouter) { + register (apiRouter, mapPaths) { const mapRouter = router(); this.analysisLayergroupController.register(mapRouter); @@ -126,8 +124,6 @@ module.exports = class MapRouter { this.previewTemplateController.register(mapRouter); this.analysesController.register(mapRouter); - const paths = this.serverOptions.routes.api.map.paths; - - apiRouter.use(`(?:${paths.join('|')})`, mapRouter); + mapPaths.forEach(path => apiRouter.use(path, mapRouter)); } }; diff --git a/lib/cartodb/api/template/template-router.js b/lib/cartodb/api/template/template-router.js index cfb883e7..9ddcf9fc 100644 --- a/lib/cartodb/api/template/template-router.js +++ b/lib/cartodb/api/template/template-router.js @@ -5,9 +5,7 @@ const AdminTemplateController = require('./admin-template-controller'); const TileTemplateController = require('./tile-template-controller'); module.exports = class TemplateRouter { - constructor ({ collaborators, serverOptions }) { - this.serverOptions = serverOptions; - + constructor ({ collaborators }) { const { pgConnection, templateMaps, @@ -54,15 +52,13 @@ module.exports = class TemplateRouter { ); } - register (apiRouter) { + register (apiRouter, templatePaths) { const templateRouter = router(); this.namedMapController.register(templateRouter); this.tileTemplateController.register(templateRouter); this.adminTemplateController.register(templateRouter); - const paths = this.serverOptions.routes.api.template.paths; - - apiRouter.use(`(?:${paths.join('|')})`, templateRouter); + templatePaths.forEach(path => apiRouter.use(path, templateRouter)); } }; diff --git a/lib/cartodb/server_options.js b/lib/cartodb/server_options.js index d05e5e1d..c3d0fdb8 100644 --- a/lib/cartodb/server_options.js +++ b/lib/cartodb/server_options.js @@ -67,22 +67,49 @@ module.exports = { // FIXME: Remove it. This is no longer needed, paths are defined in routers base_url_templated: global.environment.base_url_templated || '(?:/maps/named|/tiles/template)', + // Base URLs for the APIs + // + // See http://github.com/CartoDB/Windshaft-cartodb/wiki/Unified-Map-API routes: global.environment.routes || { - api: { + v1: { paths: [ '/api/v1', - '/user/:user/api/v1' + '/user/:user/api/v1', ], + // Base url for the Detached Maps API + // "/api/v1/map" is the new API, map: { paths: [ - '/map' + '/map', ] }, + // Base url for the Templated Maps API + // "/api/v1/map/named" is the new API, template: { paths: [ '/map/named' ] } + }, + // For compatibility with versions up to 1.6.x + v0: { + paths: [ + '/tiles' + ], + // Base url for the Detached Maps API + // "/tiles/layergroup" is for compatibility with versions up to 1.6.x + map: { + paths: [ + '/layergroup' + ] + }, + // Base url for the Templated Maps API + // "/tiles/template" is for compatibility with versions up to 1.6.x + template: { + paths: [ + '/template' + ] + } } }, From c51e2542870055965016ea7cfe2e60fb055dd83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 9 May 2018 15:00:18 +0200 Subject: [PATCH 52/54] Set 404 as defautl status code and set the proper status code fir the response at very same time that the response body --- lib/cartodb/api/api-router.js | 2 ++ lib/cartodb/api/map/analyses-catalog-controller.js | 1 + lib/cartodb/api/map/analysis-layergroup-controller.js | 1 + lib/cartodb/api/map/anonymous-map-controller.js | 1 + lib/cartodb/api/map/attributes-layergroup-controller.js | 1 + lib/cartodb/api/map/dataview-layergroup-controller.js | 2 ++ lib/cartodb/api/map/preview-layergroup-controller.js | 2 ++ lib/cartodb/api/map/preview-template-controller.js | 2 ++ lib/cartodb/api/middlewares/initialize-status-code.js | 6 ++++++ lib/cartodb/api/middlewares/send-response.js | 2 +- lib/cartodb/api/template/admin-template-controller.js | 4 ++++ lib/cartodb/api/template/named-template-controller.js | 1 + lib/cartodb/api/template/tile-template-controller.js | 1 + 13 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 lib/cartodb/api/middlewares/initialize-status-code.js diff --git a/lib/cartodb/api/api-router.js b/lib/cartodb/api/api-router.js index 5165007d..9d53285b 100644 --- a/lib/cartodb/api/api-router.js +++ b/lib/cartodb/api/api-router.js @@ -40,6 +40,7 @@ const ResourceLocator = require('../models/resource-locator'); const LayergroupMetadata = require('../utils/layergroup-metadata'); const RendererStatsReporter = require('../stats/reporter/renderer'); +const initializeStatusCode = require('./middlewares/initialize-status-code'); const logger = require('./middlewares/logger'); const bodyParser = require('body-parser'); const servedByHostHeader = require('./middlewares/served-by-host-header'); @@ -193,6 +194,7 @@ module.exports = class ApiRouter { const apiRouter = router(); apiRouter.use(logger(this.serverOptions)); + apiRouter.use(initializeStatusCode()); apiRouter.use(bodyParser.json()); apiRouter.use(servedByHostHeader()); apiRouter.use(stats({ diff --git a/lib/cartodb/api/map/analyses-catalog-controller.js b/lib/cartodb/api/map/analyses-catalog-controller.js index 91defc21..760c0e80 100644 --- a/lib/cartodb/api/map/analyses-catalog-controller.js +++ b/lib/cartodb/api/map/analyses-catalog-controller.js @@ -99,6 +99,7 @@ function prepareResponse () { return -1; }); + res.statusCode = 200; res.body = { catalog: analysisCatalog }; next(); diff --git a/lib/cartodb/api/map/analysis-layergroup-controller.js b/lib/cartodb/api/map/analysis-layergroup-controller.js index 0e46dc81..96f46d70 100644 --- a/lib/cartodb/api/map/analysis-layergroup-controller.js +++ b/lib/cartodb/api/map/analysis-layergroup-controller.js @@ -48,6 +48,7 @@ function analysisNodeStatus (analysisStatusBackend) { 'Last-Modified': new Date().toUTCString() }); + res.statusCode = 200; res.body = nodeStatus; next(); diff --git a/lib/cartodb/api/map/anonymous-map-controller.js b/lib/cartodb/api/map/anonymous-map-controller.js index 964ffacd..21049437 100644 --- a/lib/cartodb/api/map/anonymous-map-controller.js +++ b/lib/cartodb/api/map/anonymous-map-controller.js @@ -202,6 +202,7 @@ function createLayergroup (mapBackend, userLimitsBackend, pgConnection, affected return next(err); } + res.statusCode = 200; res.body = layergroup; res.locals.mapConfigProvider = mapConfigProvider; diff --git a/lib/cartodb/api/map/attributes-layergroup-controller.js b/lib/cartodb/api/map/attributes-layergroup-controller.js index ef9614fc..632cca9f 100644 --- a/lib/cartodb/api/map/attributes-layergroup-controller.js +++ b/lib/cartodb/api/map/attributes-layergroup-controller.js @@ -77,6 +77,7 @@ function getFeatureAttributes (attributesBackend) { return next(err); } + res.statusCode = 200; res.body = tile; next(); diff --git a/lib/cartodb/api/map/dataview-layergroup-controller.js b/lib/cartodb/api/map/dataview-layergroup-controller.js index 0b6f8cc9..710c5cd4 100644 --- a/lib/cartodb/api/map/dataview-layergroup-controller.js +++ b/lib/cartodb/api/map/dataview-layergroup-controller.js @@ -151,6 +151,7 @@ function getDataview (dataviewBackend) { return next(err); } + res.statusCode = 200; res.body = dataview; next(); @@ -174,6 +175,7 @@ function dataviewSearch (dataviewBackend) { return next(err); } + res.statusCode = 200; res.body = searchResult; next(); diff --git a/lib/cartodb/api/map/preview-layergroup-controller.js b/lib/cartodb/api/map/preview-layergroup-controller.js index 71dfdffd..29db8729 100644 --- a/lib/cartodb/api/map/preview-layergroup-controller.js +++ b/lib/cartodb/api/map/preview-layergroup-controller.js @@ -109,6 +109,7 @@ function getPreviewImageByCenter (previewBackend) { res.set('Content-Type', headers['Content-Type'] || `image/${format}`); + res.statusCode = 200; res.body = image; next(); @@ -144,6 +145,7 @@ function getPreviewImageByBoundingBox (previewBackend) { res.set('Content-Type', headers['Content-Type'] || `image/${format}`); + res.statusCode = 200; res.body = image; next(); diff --git a/lib/cartodb/api/map/preview-template-controller.js b/lib/cartodb/api/map/preview-template-controller.js index e19942d2..9f5257a3 100644 --- a/lib/cartodb/api/map/preview-template-controller.js +++ b/lib/cartodb/api/map/preview-template-controller.js @@ -268,6 +268,7 @@ function getImage({ previewBackend, label }) { res.set(headers); } + res.statusCode = 200; res.body = image; next(); @@ -287,6 +288,7 @@ function getImage({ previewBackend, label }) { res.set(headers); } + res.statusCode = 200; res.body = image; next(); diff --git a/lib/cartodb/api/middlewares/initialize-status-code.js b/lib/cartodb/api/middlewares/initialize-status-code.js new file mode 100644 index 00000000..9e6da2c7 --- /dev/null +++ b/lib/cartodb/api/middlewares/initialize-status-code.js @@ -0,0 +1,6 @@ +module.exports = function initializeStatusCode () { + return function initializeStatusCodeMiddleware (req, res, next) { + res.statusCode = 404; + next(); + }; +}; diff --git a/lib/cartodb/api/middlewares/send-response.js b/lib/cartodb/api/middlewares/send-response.js index 469cf0a7..ec13c5bf 100644 --- a/lib/cartodb/api/middlewares/send-response.js +++ b/lib/cartodb/api/middlewares/send-response.js @@ -2,7 +2,7 @@ module.exports = function sendResponse () { return function sendResponseMiddleware (req, res) { req.profiler.done('res'); - res.status(res.statusCode || 200); + res.status(res.statusCode); if (Buffer.isBuffer(res.body)) { return res.send(res.body); diff --git a/lib/cartodb/api/template/admin-template-controller.js b/lib/cartodb/api/template/admin-template-controller.js index 4cceda69..b45ebca7 100644 --- a/lib/cartodb/api/template/admin-template-controller.js +++ b/lib/cartodb/api/template/admin-template-controller.js @@ -115,6 +115,7 @@ function createTemplate ({ templateMaps }) { return next(err); } + res.statusCode = 200; res.body = { template_id: templateId }; next(); @@ -133,6 +134,7 @@ function updateTemplate ({ templateMaps }) { return next(err); } + res.statusCode = 200; res.body = { template_id: templateId }; next(); @@ -161,6 +163,7 @@ function retrieveTemplate ({ templateMaps }) { // so we remove it before returning to the user delete template.auth_id; + res.statusCode = 200; res.body = { template }; next(); @@ -199,6 +202,7 @@ function listTemplates ({ templateMaps }) { return next(err); } + res.statusCode = 200; res.body = { template_ids: templateIds }; next(); diff --git a/lib/cartodb/api/template/named-template-controller.js b/lib/cartodb/api/template/named-template-controller.js index eed39b34..86613c5e 100644 --- a/lib/cartodb/api/template/named-template-controller.js +++ b/lib/cartodb/api/template/named-template-controller.js @@ -204,6 +204,7 @@ function instantiateLayergroup (mapBackend, userLimitsBackend, pgConnection, aff return next(err); } + res.statusCode = 200; res.body = layergroup; const { mapConfigProvider } = res.locals; diff --git a/lib/cartodb/api/template/tile-template-controller.js b/lib/cartodb/api/template/tile-template-controller.js index 5cb2f4e4..de256ccb 100644 --- a/lib/cartodb/api/template/tile-template-controller.js +++ b/lib/cartodb/api/template/tile-template-controller.js @@ -75,6 +75,7 @@ function getTile ({ tileBackend, label }) { res.set(headers); } + res.statusCode = 200; res.body = tile; next(); From 976ee35a35592bec278cf922c17d671e45161f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 9 May 2018 15:24:33 +0200 Subject: [PATCH 53/54] Use new routes configuration schema in ported test --- test/acceptance/ported/support/ported_server_options.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/acceptance/ported/support/ported_server_options.js b/test/acceptance/ported/support/ported_server_options.js index d850b1c9..243875a0 100644 --- a/test/acceptance/ported/support/ported_server_options.js +++ b/test/acceptance/ported/support/ported_server_options.js @@ -13,16 +13,20 @@ module.exports = _.extend({}, serverOptions, { base_url_mapconfig: '/database/:dbname/layergroup', routes: { - api: { + v0: { paths: [ '/tiles', '/database/:dbname' ], + // Base url for the Detached Maps API + // "/tiles/layergroup" is for compatibility with versions up to 1.6.x map: { paths: [ '/layergroup' ] }, + // Base url for the Templated Maps API + // "/tiles/template" is for compatibility with versions up to 1.6.x template: { paths: [ '/template' @@ -31,6 +35,7 @@ module.exports = _.extend({}, serverOptions, { } }, + grainstore: { datasource: { geometry_field: 'the_geom', From 0741881959a5835bb9a7f89a7035d91fbf542f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 9 May 2018 16:24:38 +0200 Subject: [PATCH 54/54] Do not initialize status code to 404 when method is OPTIONS --- lib/cartodb/api/middlewares/initialize-status-code.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/api/middlewares/initialize-status-code.js b/lib/cartodb/api/middlewares/initialize-status-code.js index 9e6da2c7..ed6b1805 100644 --- a/lib/cartodb/api/middlewares/initialize-status-code.js +++ b/lib/cartodb/api/middlewares/initialize-status-code.js @@ -1,6 +1,9 @@ module.exports = function initializeStatusCode () { return function initializeStatusCodeMiddleware (req, res, next) { - res.statusCode = 404; + if (req.method !== 'OPTIONS') { + res.statusCode = 404; + } + next(); }; };