diff --git a/lib/cartodb/controllers/named_maps.js b/lib/cartodb/controllers/named_maps.js index 9eb40ee4..b878890d 100644 --- a/lib/cartodb/controllers/named_maps.js +++ b/lib/cartodb/controllers/named_maps.js @@ -186,53 +186,15 @@ NamedMapsController.prototype.getTile = function () { NamedMapsController.prototype.getStaticImageOptions = function () { return function getStaticImageOptionsMiddleware(req, res, next) { - const { user, namedMapProvider, template, zoom, lon, lat, bbox } = res.locals; + const { user, namedMapProvider, template } = res.locals; - if ([zoom, lon, lat].map(numMapper).every(Number.isFinite)) { - res.locals.imageOpts = { - zoom: zoom, - center: { - lng: lon, - lat: lat - } - }; + const imageOpts = getImageOptions(res.locals, template); + if (imageOpts) { + res.locals.imageOpts = imageOpts; return next(); } - if (bbox) { - var _bbox = bbox.split(',').map(numMapper); - if (_bbox.length === 4 && _bbox.every(Number.isFinite)) { - res.locals.imageOpts = { - bounds: { - west: _bbox[0], - south: _bbox[1], - east: _bbox[2], - north: _bbox[3] - } - }; - - return next(); - } - } - - if (template.view) { - var zoomCenter = templateZoomCenter(template.view); - if (zoomCenter) { - if (Number.isFinite(+zoom)) { - zoomCenter.zoom = +zoom; - } - res.locals.imageOpts = zoomCenter; - return next(); - } - - var bounds = templateBounds(template.view); - if (bounds) { - res.locals.imageOpts = bounds; - return next(); - } - } - res.locals.imageOpts = DEFAULT_ZOOM_CENTER; namedMapProvider.getAffectedTablesAndLastUpdatedTime((err, affectedTablesAndLastUpdate) => { @@ -252,12 +214,79 @@ NamedMapsController.prototype.getStaticImageOptions = function () { } res.locals.imageOpts = bounds; + return next(); }); }); }.bind(this); }; +function getImageOptions (params, template) { + const { zoom, lon, lat, bbox } = params; + + let imageOpts = getImageOptionsFromCoordinates(zoom, lon, lat); + if (imageOpts) { + return imageOpts; + } + + imageOpts = getImageOptionsFromBoundingBox(bbox); + if (imageOpts) { + return imageOpts; + } + + imageOpts = getImageOptionsFromTemplate(template, zoom); + if (imageOpts) { + return imageOpts; + } +} + +function getImageOptionsFromCoordinates (zoom, lon, lat) { + if ([zoom, lon, lat].map(numMapper).every(Number.isFinite)) { + return { + zoom: zoom, + center: { + lng: lon, + lat: lat + } + }; + } +} + + +function getImageOptionsFromTemplate (template, zoom) { + if (template.view) { + var zoomCenter = templateZoomCenter(template.view); + if (zoomCenter) { + if (Number.isFinite(+zoom)) { + zoomCenter.zoom = +zoom; + } + + return zoomCenter; + } + + var bounds = templateBounds(template.view); + if (bounds) { + return bounds; + } + } +} + +function getImageOptionsFromBoundingBox (bbox) { + if (bbox) { + var _bbox = bbox.split(',').map(numMapper); + if (_bbox.length === 4 && _bbox.every(Number.isFinite)) { + return { + bounds: { + west: _bbox[0], + south: _bbox[1], + east: _bbox[2], + north: _bbox[3] + } + }; + } + } +} + NamedMapsController.prototype.getImage = function (label) { return function getImageMiddleware (req, res, next) { const { imageOpts, namedMapProvider } = res.locals;