Merge pull request #909 from CartoDB/spread-prepare-context-middleware
Spread `prepareContext` middleware
This commit is contained in:
commit
771eaf97c8
@ -1,23 +1,37 @@
|
||||
var PSQL = require('cartodb-psql');
|
||||
var cors = require('../middleware/cors');
|
||||
var userMiddleware = require('../middleware/user');
|
||||
const PSQL = require('cartodb-psql');
|
||||
const cors = require('../middleware/cors');
|
||||
const user = require('../middleware/user');
|
||||
const locals = require('../middleware/locals');
|
||||
const cleanUpQueryParams = require('../middleware/clean-up-query-params');
|
||||
const layergroupToken = require('../middleware/layergroup-token');
|
||||
const credentials = require('../middleware/credentials');
|
||||
const authorize = require('../middleware/authorize');
|
||||
const dbConnSetup = require('../middleware/db-conn-setup');
|
||||
const rateLimit = require('../middleware/rate-limit');
|
||||
const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit;
|
||||
|
||||
function AnalysesController(prepareContext, userLimitsApi) {
|
||||
this.prepareContext = prepareContext;
|
||||
function AnalysesController(pgConnection, authApi, userLimitsApi) {
|
||||
this.pgConnection = pgConnection;
|
||||
this.authApi = authApi;
|
||||
this.userLimitsApi = userLimitsApi;
|
||||
}
|
||||
|
||||
module.exports = AnalysesController;
|
||||
|
||||
AnalysesController.prototype.register = function (app) {
|
||||
const { base_url_mapconfig: mapconfigBasePath } = app;
|
||||
|
||||
app.get(
|
||||
`${app.base_url_mapconfig}/analyses/catalog`,
|
||||
`${mapconfigBasePath}/analyses/catalog`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS_CATALOG),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createPGClient(),
|
||||
getDataFromQuery({ queryTemplate: catalogQueryTpl, key: 'catalog' }),
|
||||
getDataFromQuery({ queryTemplate: tablesQueryTpl, key: 'tables' }),
|
||||
|
@ -1,7 +1,12 @@
|
||||
const cors = require('../middleware/cors');
|
||||
const userMiddleware = require('../middleware/user');
|
||||
const allowQueryParams = require('../middleware/allow-query-params');
|
||||
const user = require('../middleware/user');
|
||||
const vectorError = require('../middleware/vector-error');
|
||||
const locals = require('../middleware/locals');
|
||||
const cleanUpQueryParams = require('../middleware/clean-up-query-params');
|
||||
const layergroupToken = require('../middleware/layergroup-token');
|
||||
const credentials = require('../middleware/credentials');
|
||||
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 DataviewBackend = require('../backends/dataview');
|
||||
@ -31,7 +36,6 @@ const SUPPORTED_FORMATS = {
|
||||
* @constructor
|
||||
*/
|
||||
function LayergroupController(
|
||||
prepareContext,
|
||||
pgConnection,
|
||||
mapStore,
|
||||
tileBackend,
|
||||
@ -40,7 +44,8 @@ function LayergroupController(
|
||||
surrogateKeysCache,
|
||||
userLimitsApi,
|
||||
layergroupAffectedTables,
|
||||
analysisBackend
|
||||
analysisBackend,
|
||||
authApi
|
||||
) {
|
||||
this.pgConnection = pgConnection;
|
||||
this.mapStore = mapStore;
|
||||
@ -53,21 +58,25 @@ function LayergroupController(
|
||||
|
||||
this.dataviewBackend = new DataviewBackend(analysisBackend);
|
||||
this.analysisStatusBackend = new AnalysisStatusBackend();
|
||||
|
||||
this.prepareContext = prepareContext;
|
||||
this.authApi = authApi;
|
||||
}
|
||||
|
||||
module.exports = LayergroupController;
|
||||
|
||||
LayergroupController.prototype.register = function(app) {
|
||||
const { base_url_mapconfig: basePath } = app;
|
||||
const { base_url_mapconfig: mapconfigBasePath } = app;
|
||||
|
||||
app.get(
|
||||
`${basePath}/:token/:z/:x/:y@:scale_factor?x.:format`,
|
||||
`${mapconfigBasePath}/:token/:z/:x/:y@:scale_factor?x.:format`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.TILE),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi),
|
||||
getTile(this.tileBackend, 'map_tile'),
|
||||
setCacheControlHeader(),
|
||||
@ -83,11 +92,16 @@ LayergroupController.prototype.register = function(app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${basePath}/:token/:z/:x/:y.:format`,
|
||||
`${mapconfigBasePath}/:token/:z/:x/:y.:format`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.TILE),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi),
|
||||
getTile(this.tileBackend, 'map_tile'),
|
||||
setCacheControlHeader(),
|
||||
@ -103,12 +117,17 @@ LayergroupController.prototype.register = function(app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${basePath}/:token/:layer/:z/:x/:y.(:format)`,
|
||||
`${mapconfigBasePath}/:token/:layer/:z/:x/:y.(:format)`,
|
||||
distinguishLayergroupFromStaticRoute(),
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.TILE),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi),
|
||||
getTile(this.tileBackend, 'maplayer_tile'),
|
||||
setCacheControlHeader(),
|
||||
@ -124,11 +143,16 @@ LayergroupController.prototype.register = function(app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${basePath}/:token/:layer/attributes/:fid`,
|
||||
`${mapconfigBasePath}/:token/:layer/attributes/:fid`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ATTRIBUTES),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi),
|
||||
getFeatureAttributes(this.attributesBackend),
|
||||
setCacheControlHeader(),
|
||||
@ -142,12 +166,16 @@ LayergroupController.prototype.register = function(app) {
|
||||
const forcedFormat = 'png';
|
||||
|
||||
app.get(
|
||||
`${basePath}/static/center/:token/:z/:lat/:lng/:width/:height.:format`,
|
||||
`${mapconfigBasePath}/static/center/:token/:z/:lat/:lng/:width/:height.:format`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(['layer']),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC),
|
||||
allowQueryParams(['layer']),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi, forcedFormat),
|
||||
getPreviewImageByCenter(this.previewBackend),
|
||||
setCacheControlHeader(),
|
||||
@ -159,12 +187,16 @@ LayergroupController.prototype.register = function(app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${basePath}/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format`,
|
||||
`${mapconfigBasePath}/static/bbox/:token/:west,:south,:east,:north/:width/:height.:format`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(['layer']),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC),
|
||||
allowQueryParams(['layer']),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi, forcedFormat),
|
||||
getPreviewImageByBoundingBox(this.previewBackend),
|
||||
setCacheControlHeader(),
|
||||
@ -194,12 +226,16 @@ LayergroupController.prototype.register = function(app) {
|
||||
];
|
||||
|
||||
app.get(
|
||||
`${basePath}/:token/dataview/:dataviewName`,
|
||||
`${mapconfigBasePath}/:token/dataview/:dataviewName`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(allowedDataviewQueryParams),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW),
|
||||
allowQueryParams(allowedDataviewQueryParams),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi),
|
||||
getDataview(this.dataviewBackend),
|
||||
setCacheControlHeader(),
|
||||
@ -211,12 +247,16 @@ LayergroupController.prototype.register = function(app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${basePath}/:token/:layer/widget/:dataviewName`,
|
||||
`${mapconfigBasePath}/:token/:layer/widget/:dataviewName`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(allowedDataviewQueryParams),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW),
|
||||
allowQueryParams(allowedDataviewQueryParams),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi),
|
||||
getDataview(this.dataviewBackend),
|
||||
setCacheControlHeader(),
|
||||
@ -228,12 +268,16 @@ LayergroupController.prototype.register = function(app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${basePath}/:token/dataview/:dataviewName/search`,
|
||||
`${mapconfigBasePath}/:token/dataview/:dataviewName/search`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(allowedDataviewQueryParams),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW_SEARCH),
|
||||
allowQueryParams(allowedDataviewQueryParams),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi),
|
||||
dataviewSearch(this.dataviewBackend),
|
||||
setCacheControlHeader(),
|
||||
@ -245,12 +289,16 @@ LayergroupController.prototype.register = function(app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${basePath}/:token/:layer/widget/:dataviewName/search`,
|
||||
`${mapconfigBasePath}/:token/:layer/widget/:dataviewName/search`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(allowedDataviewQueryParams),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.DATAVIEW_SEARCH),
|
||||
allowQueryParams(allowedDataviewQueryParams),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
createMapStoreMapConfigProvider(this.mapStore, this.userLimitsApi),
|
||||
dataviewSearch(this.dataviewBackend),
|
||||
setCacheControlHeader(),
|
||||
@ -262,11 +310,16 @@ LayergroupController.prototype.register = function(app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${basePath}/:token/analysis/node/:nodeId`,
|
||||
`${mapconfigBasePath}/:token/analysis/node/:nodeId`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.ANALYSIS),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
analysisNodeStatus(this.analysisStatusBackend),
|
||||
sendResponse()
|
||||
);
|
||||
|
@ -5,8 +5,13 @@ const Datasource = windshaft.model.Datasource;
|
||||
const QueryTables = require('cartodb-query-tables');
|
||||
const ResourceLocator = require('../models/resource-locator');
|
||||
const cors = require('../middleware/cors');
|
||||
const userMiddleware = require('../middleware/user');
|
||||
const allowQueryParams = require('../middleware/allow-query-params');
|
||||
const user = require('../middleware/user');
|
||||
const locals = require('../middleware/locals');
|
||||
const cleanUpQueryParams = require('../middleware/clean-up-query-params');
|
||||
const layergroupToken = require('../middleware/layergroup-token');
|
||||
const credentials = require('../middleware/credentials');
|
||||
const dbConnSetup = require('../middleware/db-conn-setup');
|
||||
const authorize = require('../middleware/authorize');
|
||||
const NamedMapsCacheEntry = require('../cache/model/named_maps_entry');
|
||||
const NamedMapMapConfigProvider = require('../models/mapconfig/provider/named-map-provider');
|
||||
const CreateLayergroupMapConfigProvider = require('../models/mapconfig/provider/create-layergroup-provider');
|
||||
@ -27,9 +32,18 @@ const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit;
|
||||
* @param {StatsBackend} statsBackend
|
||||
* @constructor
|
||||
*/
|
||||
function MapController(prepareContext, pgConnection, templateMaps, mapBackend, metadataBackend,
|
||||
surrogateKeysCache, userLimitsApi, layergroupAffectedTables, mapConfigAdapter,
|
||||
statsBackend) {
|
||||
function MapController (
|
||||
pgConnection,
|
||||
templateMaps,
|
||||
mapBackend,
|
||||
metadataBackend,
|
||||
surrogateKeysCache,
|
||||
userLimitsApi,
|
||||
layergroupAffectedTables,
|
||||
mapConfigAdapter,
|
||||
statsBackend,
|
||||
authApi
|
||||
) {
|
||||
this.pgConnection = pgConnection;
|
||||
this.templateMaps = templateMaps;
|
||||
this.mapBackend = mapBackend;
|
||||
@ -43,35 +57,37 @@ function MapController(prepareContext, pgConnection, templateMaps, mapBackend, m
|
||||
this.layergroupMetadata = new LayergroupMetadata(resourceLocator);
|
||||
|
||||
this.statsBackend = statsBackend;
|
||||
this.prepareContext = prepareContext;
|
||||
this.authApi = authApi;
|
||||
}
|
||||
|
||||
module.exports = MapController;
|
||||
|
||||
MapController.prototype.register = function(app) {
|
||||
const { base_url_mapconfig, base_url_templated } = 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(
|
||||
base_url_mapconfig,
|
||||
this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS)
|
||||
);
|
||||
app.post(
|
||||
base_url_mapconfig,
|
||||
this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.ANONYMOUS)
|
||||
);
|
||||
app.get(
|
||||
`${base_url_templated}/:template_id/jsonp`,
|
||||
`${templateBasePath}/:template_id/jsonp`,
|
||||
this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.NAMED, useTemplate)
|
||||
);
|
||||
|
||||
app.post(
|
||||
`${base_url_templated}/:template_id`,
|
||||
`${templateBasePath}/:template_id`,
|
||||
this.composeCreateMapMiddleware(RATE_LIMIT_ENDPOINTS_GROUPS.NAMED, useTemplate)
|
||||
);
|
||||
app.options(
|
||||
app.base_url_mapconfig,
|
||||
cors('Content-Type')
|
||||
);
|
||||
|
||||
app.options(app.base_url_mapconfig, cors('Content-Type'));
|
||||
};
|
||||
|
||||
MapController.prototype.composeCreateMapMiddleware = function (endpointGroup, useTemplate = false) {
|
||||
@ -83,10 +99,14 @@ MapController.prototype.composeCreateMapMiddleware = function (endpointGroup, us
|
||||
|
||||
return [
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(['aggregation']),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, endpointGroup),
|
||||
allowQueryParams(['aggregation']),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
initProfiler(isTemplateInstantiation),
|
||||
checkJsonContentType(),
|
||||
this.getCreateMapMiddlewares(useTemplate),
|
||||
|
@ -1,7 +1,12 @@
|
||||
const NamedMapsCacheEntry = require('../cache/model/named_maps_entry');
|
||||
const cors = require('../middleware/cors');
|
||||
const userMiddleware = require('../middleware/user');
|
||||
const allowQueryParams = require('../middleware/allow-query-params');
|
||||
const user = require('../middleware/user');
|
||||
const locals = require('../middleware/locals');
|
||||
const cleanUpQueryParams = require('../middleware/clean-up-query-params');
|
||||
const layergroupToken = require('../middleware/layergroup-token');
|
||||
const credentials = require('../middleware/credentials');
|
||||
const dbConnSetup = require('../middleware/db-conn-setup');
|
||||
const authorize = require('../middleware/authorize');
|
||||
const vectorError = require('../middleware/vector-error');
|
||||
const rateLimit = require('../middleware/rate-limit');
|
||||
const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit;
|
||||
@ -29,14 +34,15 @@ function getRequestParams(locals) {
|
||||
return params;
|
||||
}
|
||||
|
||||
function NamedMapsController(
|
||||
prepareContext,
|
||||
function NamedMapsController (
|
||||
namedMapProviderCache,
|
||||
tileBackend,
|
||||
previewBackend,
|
||||
surrogateKeysCache,
|
||||
tablesExtentApi,
|
||||
metadataBackend,
|
||||
pgConnection,
|
||||
authApi,
|
||||
userLimitsApi
|
||||
) {
|
||||
this.namedMapProviderCache = namedMapProviderCache;
|
||||
@ -45,21 +51,27 @@ function NamedMapsController(
|
||||
this.surrogateKeysCache = surrogateKeysCache;
|
||||
this.tablesExtentApi = tablesExtentApi;
|
||||
this.metadataBackend = metadataBackend;
|
||||
this.pgConnection = pgConnection;
|
||||
this.authApi = authApi;
|
||||
this.userLimitsApi = userLimitsApi;
|
||||
this.prepareContext = prepareContext;
|
||||
}
|
||||
|
||||
module.exports = NamedMapsController;
|
||||
|
||||
NamedMapsController.prototype.register = function(app) {
|
||||
const { base_url_mapconfig, base_url_templated } = app;
|
||||
const { base_url_mapconfig: mapconfigBasePath, base_url_templated: templateBasePath } = app;
|
||||
|
||||
app.get(
|
||||
`${base_url_templated}/:template_id/:layer/:z/:x/:y.(:format)`,
|
||||
`${templateBasePath}/:template_id/:layer/:z/:x/:y.(:format)`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_TILES),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
getNamedMapProvider({
|
||||
namedMapProviderCache: this.namedMapProviderCache,
|
||||
label: 'NAMED_MAP_TILE'
|
||||
@ -79,12 +91,16 @@ NamedMapsController.prototype.register = function(app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${base_url_mapconfig}/static/named/:template_id/:width/:height.:format`,
|
||||
`${mapconfigBasePath}/static/named/:template_id/:width/:height.:format`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
cleanUpQueryParams(['layer', 'zoom', 'lon', 'lat', 'bbox']),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.STATIC_NAMED),
|
||||
allowQueryParams(['layer', 'zoom', 'lon', 'lat', 'bbox']),
|
||||
this.prepareContext,
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(this.authApi),
|
||||
dbConnSetup(this.pgConnection),
|
||||
getNamedMapProvider({
|
||||
namedMapProviderCache: this.namedMapProviderCache,
|
||||
label: 'STATIC_VIZ_MAP', forcedFormat: 'png'
|
||||
@ -222,9 +238,11 @@ function getTile ({ tileBackend, label }) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
res.locals.body = tile;
|
||||
res.locals.headers = headers;
|
||||
res.locals.stats = stats;
|
||||
if (headers) {
|
||||
res.set(headers);
|
||||
}
|
||||
|
||||
res.body = tile;
|
||||
|
||||
next();
|
||||
});
|
||||
@ -348,28 +366,36 @@ function getImage({ previewBackend, label }) {
|
||||
if (zoom !== undefined && center) {
|
||||
return previewBackend.getImage(namedMapProvider, format, width, height, zoom, center,
|
||||
(err, image, headers, stats) => {
|
||||
req.profiler.add(stats);
|
||||
|
||||
if (err) {
|
||||
err.label = label;
|
||||
return next(err);
|
||||
}
|
||||
|
||||
res.locals.body = image;
|
||||
res.locals.headers = headers;
|
||||
res.locals.stats = stats;
|
||||
if (headers) {
|
||||
res.set(headers);
|
||||
}
|
||||
|
||||
res.body = image;
|
||||
|
||||
next();
|
||||
});
|
||||
}
|
||||
|
||||
previewBackend.getImage(namedMapProvider, format, width, height, bounds, (err, image, headers, stats) => {
|
||||
req.profiler.add(stats);
|
||||
|
||||
if (err) {
|
||||
err.label = label;
|
||||
return next(err);
|
||||
}
|
||||
|
||||
res.locals.body = image;
|
||||
res.locals.headers = headers;
|
||||
res.locals.stats = stats;
|
||||
if (headers) {
|
||||
res.set(headers);
|
||||
}
|
||||
|
||||
res.body = image;
|
||||
|
||||
next();
|
||||
});
|
||||
@ -496,9 +522,8 @@ function setCacheControlHeader () {
|
||||
|
||||
function setContentTypeHeader () {
|
||||
return function setContentTypeHeaderMiddleware(req, res, next) {
|
||||
const { headers = {} } = res.locals;
|
||||
|
||||
res.set('Content-Type', headers['content-type'] || headers['Content-Type'] || 'image/png');
|
||||
res.set('Content-Type', res.get('content-type') || res.get('Content-Type') || 'image/png');
|
||||
|
||||
next();
|
||||
};
|
||||
@ -506,12 +531,11 @@ function setContentTypeHeader () {
|
||||
|
||||
function sendResponse () {
|
||||
return function sendResponseMiddleware (req, res) {
|
||||
const { body, stats = {}, format } = res.locals;
|
||||
const { format } = res.locals;
|
||||
|
||||
req.profiler.done('render-' + format);
|
||||
req.profiler.add(stats);
|
||||
|
||||
res.status(200);
|
||||
res.send(body);
|
||||
res.send(res.body);
|
||||
};
|
||||
}
|
||||
|
@ -1,10 +1,10 @@
|
||||
const { templateName } = require('../backends/template_maps');
|
||||
const cors = require('../middleware/cors');
|
||||
const userMiddleware = require('../middleware/user');
|
||||
const user = require('../middleware/user');
|
||||
const locals = require('../middleware/locals');
|
||||
const credentials = require('../middleware/credentials');
|
||||
const rateLimit = require('../middleware/rate-limit');
|
||||
const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit;
|
||||
const localsMiddleware = require('../middleware/context/locals');
|
||||
const credentialsMiddleware = require('../middleware/context/credentials');
|
||||
|
||||
/**
|
||||
* @param {AuthApi} authApi
|
||||
@ -21,15 +21,15 @@ function NamedMapsAdminController(authApi, templateMaps, userLimitsApi) {
|
||||
module.exports = NamedMapsAdminController;
|
||||
|
||||
NamedMapsAdminController.prototype.register = function (app) {
|
||||
const { base_url_templated } = app;
|
||||
const { base_url_templated: templateBasePath } = app;
|
||||
|
||||
app.post(
|
||||
`${base_url_templated}/`,
|
||||
`${templateBasePath}/`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_CREATE),
|
||||
localsMiddleware(),
|
||||
credentialsMiddleware(),
|
||||
credentials(),
|
||||
checkContentType({ action: 'POST', label: 'POST TEMPLATE' }),
|
||||
authorizedByAPIKey({ authApi: this.authApi, action: 'create', label: 'POST TEMPLATE' }),
|
||||
createTemplate({ templateMaps: this.templateMaps }),
|
||||
@ -37,12 +37,12 @@ NamedMapsAdminController.prototype.register = function (app) {
|
||||
);
|
||||
|
||||
app.put(
|
||||
`${base_url_templated}/:template_id`,
|
||||
`${templateBasePath}/:template_id`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_UPDATE),
|
||||
localsMiddleware(),
|
||||
credentialsMiddleware(),
|
||||
credentials(),
|
||||
checkContentType({ action: 'PUT', label: 'PUT TEMPLATE' }),
|
||||
authorizedByAPIKey({ authApi: this.authApi, action: 'update', label: 'PUT TEMPLATE' }),
|
||||
updateTemplate({ templateMaps: this.templateMaps }),
|
||||
@ -50,43 +50,43 @@ NamedMapsAdminController.prototype.register = function (app) {
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${base_url_templated}/:template_id`,
|
||||
`${templateBasePath}/:template_id`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_GET),
|
||||
localsMiddleware(),
|
||||
credentialsMiddleware(),
|
||||
credentials(),
|
||||
authorizedByAPIKey({ authApi: this.authApi, action: 'get', label: 'GET TEMPLATE' }),
|
||||
retrieveTemplate({ templateMaps: this.templateMaps }),
|
||||
sendResponse()
|
||||
);
|
||||
|
||||
app.delete(
|
||||
`${base_url_templated}/:template_id`,
|
||||
`${templateBasePath}/:template_id`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_DELETE),
|
||||
localsMiddleware(),
|
||||
credentialsMiddleware(),
|
||||
credentials(),
|
||||
authorizedByAPIKey({ authApi: this.authApi, action: 'delete', label: 'DELETE TEMPLATE' }),
|
||||
destroyTemplate({ templateMaps: this.templateMaps }),
|
||||
sendResponse()
|
||||
);
|
||||
|
||||
app.get(
|
||||
`${base_url_templated}/`,
|
||||
`${templateBasePath}/`,
|
||||
cors(),
|
||||
userMiddleware(),
|
||||
locals(),
|
||||
user(),
|
||||
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_LIST),
|
||||
localsMiddleware(),
|
||||
credentialsMiddleware(),
|
||||
credentials(),
|
||||
authorizedByAPIKey({ authApi: this.authApi, action: 'list', label: 'GET TEMPLATE LIST' }),
|
||||
listTemplates({ templateMaps: this.templateMaps }),
|
||||
sendResponse()
|
||||
);
|
||||
|
||||
app.options(
|
||||
`${base_url_templated}/:template_id`,
|
||||
`${templateBasePath}/:template_id`,
|
||||
cors('Content-Type')
|
||||
);
|
||||
};
|
||||
|
@ -1,10 +0,0 @@
|
||||
module.exports = function allowQueryParams (params) {
|
||||
if (!Array.isArray(params)) {
|
||||
throw new Error('allowQueryParams must receive an Array of params');
|
||||
}
|
||||
|
||||
return function allowQueryParamsMiddleware (req, res, next) {
|
||||
res.locals.allowedQueryParams = params;
|
||||
next();
|
||||
};
|
||||
};
|
@ -14,18 +14,15 @@ const REQUEST_QUERY_PARAMS_WHITELIST = [
|
||||
'filters' // json
|
||||
];
|
||||
|
||||
module.exports = function cleanUpQueryParamsMiddleware () {
|
||||
return function cleanUpQueryParams (req, res, next) {
|
||||
var allowedQueryParams = REQUEST_QUERY_PARAMS_WHITELIST;
|
||||
|
||||
if (Array.isArray(res.locals.allowedQueryParams)) {
|
||||
allowedQueryParams = allowedQueryParams.concat(res.locals.allowedQueryParams);
|
||||
module.exports = function cleanUpQueryParamsMiddleware (customQueryParams = []) {
|
||||
if (!Array.isArray(customQueryParams)) {
|
||||
throw new Error('customQueryParams must receive an Array of params');
|
||||
}
|
||||
|
||||
req.query = _.pick(req.query, allowedQueryParams);
|
||||
return function cleanUpQueryParams (req, res, next) {
|
||||
const allowedQueryParams = [...REQUEST_QUERY_PARAMS_WHITELIST, ...customQueryParams];
|
||||
|
||||
// bring all query values onto res.locals object
|
||||
_.extend(res.locals, req.query);
|
||||
req.query = _.pick(req.query, allowedQueryParams);
|
||||
|
||||
next();
|
||||
};
|
@ -1,17 +0,0 @@
|
||||
const locals = require('./locals');
|
||||
const cleanUpQueryParams = require('./clean-up-query-params');
|
||||
const layergroupToken = require('./layergroup-token');
|
||||
const credentials = require('./credentials');
|
||||
const authorize = require('./authorize');
|
||||
const dbConnSetup = require('./db-conn-setup');
|
||||
|
||||
module.exports = function prepareContextMiddleware(authApi, pgConnection) {
|
||||
return [
|
||||
locals(),
|
||||
cleanUpQueryParams(),
|
||||
layergroupToken(),
|
||||
credentials(),
|
||||
authorize(authApi),
|
||||
dbConnSetup(pgConnection)
|
||||
];
|
||||
};
|
@ -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}"`;
|
||||
};
|
@ -1,6 +1,6 @@
|
||||
module.exports = function locals () {
|
||||
return function localsMiddleware (req, res, next) {
|
||||
res.locals = Object.assign(req.params || {}, res.locals);
|
||||
res.locals = Object.assign({}, req.query, req.params);
|
||||
|
||||
next();
|
||||
};
|
@ -49,8 +49,6 @@ var StatsBackend = require('./backends/stats');
|
||||
const lzmaMiddleware = require('./middleware/lzma');
|
||||
const errorMiddleware = require('./middleware/error-middleware');
|
||||
|
||||
const prepareContextMiddleware = require('./middleware/context');
|
||||
|
||||
module.exports = function(serverOptions) {
|
||||
// Make stats client globally accessible
|
||||
global.statsClient = StatsClient.getInstance(serverOptions.statsd);
|
||||
@ -216,16 +214,11 @@ module.exports = function(serverOptions) {
|
||||
|
||||
var versions = getAndValidateVersions(serverOptions);
|
||||
|
||||
const prepareContext = typeof serverOptions.req2params === 'function' ?
|
||||
serverOptions.req2params :
|
||||
prepareContextMiddleware(authApi, pgConnection);
|
||||
|
||||
/*******************************************************************************************************************
|
||||
* Routing
|
||||
******************************************************************************************************************/
|
||||
|
||||
new controller.Layergroup(
|
||||
prepareContext,
|
||||
pgConnection,
|
||||
mapStore,
|
||||
tileBackend,
|
||||
@ -234,11 +227,11 @@ module.exports = function(serverOptions) {
|
||||
surrogateKeysCache,
|
||||
userLimitsApi,
|
||||
layergroupAffectedTablesCache,
|
||||
analysisBackend
|
||||
analysisBackend,
|
||||
authApi
|
||||
).register(app);
|
||||
|
||||
new controller.Map(
|
||||
prepareContext,
|
||||
pgConnection,
|
||||
templateMaps,
|
||||
mapBackend,
|
||||
@ -247,23 +240,25 @@ module.exports = function(serverOptions) {
|
||||
userLimitsApi,
|
||||
layergroupAffectedTablesCache,
|
||||
mapConfigAdapter,
|
||||
statsBackend
|
||||
statsBackend,
|
||||
authApi
|
||||
).register(app);
|
||||
|
||||
new controller.NamedMaps(
|
||||
prepareContext,
|
||||
namedMapProviderCache,
|
||||
tileBackend,
|
||||
previewBackend,
|
||||
surrogateKeysCache,
|
||||
tablesExtentApi,
|
||||
metadataBackend,
|
||||
pgConnection,
|
||||
authApi,
|
||||
userLimitsApi
|
||||
).register(app);
|
||||
|
||||
new controller.NamedMapsAdmin(authApi, templateMaps, userLimitsApi).register(app);
|
||||
|
||||
new controller.Analyses(prepareContext, userLimitsApi).register(app);
|
||||
new controller.Analyses(pgConnection, authApi, userLimitsApi).register(app);
|
||||
|
||||
new controller.ServerInfo(versions).register(app);
|
||||
|
||||
|
@ -4,7 +4,6 @@ var assert = require('../../support/assert');
|
||||
var step = require('step');
|
||||
var cartodbServer = require('../../../lib/cartodb/server');
|
||||
var PortedServerOptions = require('./support/ported_server_options');
|
||||
|
||||
var LayergroupToken = require('../../../lib/cartodb/models/layergroup-token');
|
||||
|
||||
describe('attributes', function() {
|
||||
@ -47,7 +46,6 @@ describe('attributes', function() {
|
||||
});
|
||||
|
||||
it("can only be fetched from layer having an attributes spec", function(done) {
|
||||
|
||||
var expected_token;
|
||||
step(
|
||||
function do_post()
|
||||
@ -56,7 +54,10 @@ describe('attributes', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(test_mapconfig_1)
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
@ -80,7 +81,10 @@ describe('attributes', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/attributes/1',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
},
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_error_0(err, res) {
|
||||
@ -100,7 +104,10 @@ describe('attributes', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/1/attributes/1',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_attr_1(err, res) {
|
||||
@ -116,7 +123,10 @@ describe('attributes', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/1/attributes/-666',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_attr_1_404(err, res) {
|
||||
@ -132,6 +142,7 @@ describe('attributes', function() {
|
||||
keysToDelete['map_cfg|' + LayergroupToken.parse(expected_token).token] = 0;
|
||||
keysToDelete['user:localhost:mapviews:global'] = 5;
|
||||
|
||||
|
||||
done(err);
|
||||
}
|
||||
);
|
||||
@ -154,7 +165,10 @@ describe('attributes', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(mapconfig)
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
@ -184,7 +198,10 @@ describe('attributes', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(test_mapconfig_1)
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
@ -209,7 +226,10 @@ describe('attributes', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token +
|
||||
'/0/attributes/1?callback=test',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_error_0(err, res) {
|
||||
@ -232,7 +252,10 @@ describe('attributes', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/1/attributes/1',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_attr_1(err, res) {
|
||||
@ -270,7 +293,10 @@ describe('attributes', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(mapconfig)
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
|
@ -44,7 +44,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json; charset=utf-8' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json; charset=utf-8' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
@ -85,7 +85,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
@ -101,7 +101,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "image/png");
|
||||
@ -154,7 +155,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body);
|
||||
@ -177,7 +178,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "image/png");
|
||||
@ -194,7 +196,8 @@ describe('multilayer', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.grid.json',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -212,7 +215,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token +
|
||||
'/1/0/0/0.grid.json?interactivity=cartodb_id',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -266,7 +270,7 @@ describe('multilayer', function() {
|
||||
config: JSON.stringify(layergroup)
|
||||
}),
|
||||
method: 'GET',
|
||||
headers: {'Content-Type': 'application/json' }
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
// CORS headers should be sent with response
|
||||
@ -289,7 +293,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "image/png");
|
||||
@ -307,7 +312,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token +
|
||||
'/0/0/0/0.grid.json?interactivity=cartodb_id',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -325,7 +331,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token +
|
||||
'/1/0/0/0.grid.json?interactivity=cartodb_id',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -380,7 +387,7 @@ describe('multilayer', function() {
|
||||
callback: 'jsonp_test'
|
||||
}),
|
||||
method: 'GET',
|
||||
headers: {'Content-Type': 'application/json' }
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' }
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function do_check_token(err, res) {
|
||||
@ -413,7 +420,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "image/png");
|
||||
@ -431,7 +439,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token +
|
||||
'/0/0/0/0.grid.json?interactivity=cartodb_id',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -449,7 +458,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token +
|
||||
'/1/0/0/0.grid.json?interactivity=cartodb_id',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -510,7 +520,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res, err) {
|
||||
next(err, res);
|
||||
@ -530,7 +540,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "image/png");
|
||||
@ -548,7 +559,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token +
|
||||
'/0/0/0/0.grid.json?interactivity=cartodb_id',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -566,7 +578,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token +
|
||||
'/1/0/0/0.grid.json?interactivity=cartodb_id',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -583,7 +596,8 @@ describe('multilayer', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/1/attributes/4',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res, err) {
|
||||
next(err, res);
|
||||
});
|
||||
@ -602,7 +616,8 @@ describe('multilayer', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/2/0/0/0.json.torque',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function do_check_torque2(err, res) {
|
||||
@ -624,7 +639,8 @@ describe('multilayer', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/1/0/0/0.json.torque',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function do_check_torque1(err, res) {
|
||||
@ -684,7 +700,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup1)
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
@ -700,7 +716,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup2)
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
@ -717,7 +733,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + token1 + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "image/png");
|
||||
@ -734,7 +751,8 @@ describe('multilayer', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + token1 + '/0/0/0/0.grid.json?interactivity=cartodb_id',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -752,7 +770,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + token2 + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "image/png");
|
||||
@ -769,7 +788,8 @@ describe('multilayer', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + token2 + '/0/0/0/0.grid.json?interactivity=cartodb_id',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "application/json; charset=utf-8");
|
||||
@ -826,7 +846,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
try {
|
||||
@ -848,7 +868,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "image/png");
|
||||
@ -893,7 +914,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {host: 'localhost', 'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body);
|
||||
@ -922,7 +943,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {host: 'localhost', 'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body);
|
||||
@ -957,7 +978,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {host: 'localhost', 'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: _.template(tpl, {font:'bogus'})
|
||||
}, function(res) { next(null, res); });
|
||||
},
|
||||
@ -977,7 +998,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {host: 'localhost', 'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: _.template(tpl, {font:available_system_fonts[0]})
|
||||
}, function(res) { next(null, res); });
|
||||
},
|
||||
@ -1040,7 +1061,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
try {
|
||||
@ -1061,7 +1082,8 @@ describe('multilayer', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.grid.json',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
next(null, res);
|
||||
});
|
||||
@ -1093,63 +1115,8 @@ describe('multilayer', function() {
|
||||
);
|
||||
});
|
||||
|
||||
// See http://github.com/CartoDB/Windshaft/issues/157
|
||||
it("req2params is called only once for a multilayer post", function(done) {
|
||||
|
||||
var layergroup = {
|
||||
version: '1.0.1',
|
||||
layers: [
|
||||
{ options: {
|
||||
sql: 'select cartodb_id, ST_Translate(the_geom, 50, 0) as the_geom from test_table limit 2',
|
||||
cartocss: '#layer { marker-fill:red; marker-width:32; marker-allow-overlap:true; }',
|
||||
cartocss_version: '2.0.1',
|
||||
interactivity: [ 'cartodb_id' ],
|
||||
geom_column: 'the_geom'
|
||||
} },
|
||||
{ options: {
|
||||
sql: 'select cartodb_id, ST_Translate(the_geom, -50, 0) as the_geom from test_table limit 2 offset 2',
|
||||
cartocss: '#layer { marker-fill:blue; marker-allow-overlap:true; }',
|
||||
cartocss_version: '2.0.2',
|
||||
interactivity: [ 'cartodb_id' ],
|
||||
geom_column: 'the_geom'
|
||||
} }
|
||||
]
|
||||
};
|
||||
|
||||
var expected_token;
|
||||
step(
|
||||
function do_post()
|
||||
{
|
||||
global.req2params_calls = 0;
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res, err) { next(err,res); });
|
||||
},
|
||||
function check_post(err, res) {
|
||||
assert.ifError(err);
|
||||
assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body);
|
||||
var parsedBody = JSON.parse(res.body);
|
||||
expected_token = LayergroupToken.parse(parsedBody.layergroupid).token;
|
||||
assert.equal(global.req2params_calls, 1);
|
||||
return null;
|
||||
},
|
||||
function finish(err) {
|
||||
if (err) {
|
||||
return done(err);
|
||||
}
|
||||
var keysToDelete = {'user:localhost:mapviews:global': 5};
|
||||
keysToDelete['map_cfg|' + expected_token] = 0;
|
||||
testHelper.deleteRedisKeys(keysToDelete, done);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// See https://github.com/CartoDB/Windshaft/issues/163
|
||||
it("has different token for different database", function(done) {
|
||||
it.skip("has different token for different database", function(done) {
|
||||
var layergroup = {
|
||||
version: '1.0.1',
|
||||
layers: [
|
||||
@ -1170,7 +1137,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res, err) { next(err,res); });
|
||||
},
|
||||
@ -1187,7 +1154,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test2/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'cartodb250user', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res, err) { next(err,res); });
|
||||
},
|
||||
@ -1233,7 +1200,7 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res, err) { next(err,res); });
|
||||
},
|
||||
@ -1251,7 +1218,8 @@ describe('multilayer', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + token1 + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200, res.body);
|
||||
assert.equal(res.headers['content-type'], "image/png");
|
||||
|
@ -24,7 +24,10 @@ describe('multilayer error cases', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/x-www-form-urlencoded' }
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 400, res.body);
|
||||
var parsedBody = JSON.parse(res.body);
|
||||
@ -37,7 +40,10 @@ describe('multilayer error cases', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' }
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 400, res.body);
|
||||
var parsedBody = JSON.parse(res.body);
|
||||
@ -50,7 +56,10 @@ describe('multilayer error cases', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup?callback=test',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' }
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 200);
|
||||
assert.equal(
|
||||
@ -78,7 +87,10 @@ describe('multilayer error cases', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 400, res.body);
|
||||
@ -98,17 +110,18 @@ describe('multilayer error cases', function() {
|
||||
geom_column: 'the_geom'
|
||||
}}]
|
||||
};
|
||||
ServerOptions.afterLayergroupCreateCalls = 0;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
try {
|
||||
assert.equal(res.statusCode, 400, res.statusCode + ': ' + res.body);
|
||||
// See http://github.com/CartoDB/Windshaft/issues/159
|
||||
assert.equal(ServerOptions.afterLayergroupCreateCalls, 0);
|
||||
var parsed = JSON.parse(res.body);
|
||||
assert.ok(parsed);
|
||||
assert.equal(parsed.errors.length, 1);
|
||||
@ -149,12 +162,9 @@ describe('multilayer error cases', function() {
|
||||
}}
|
||||
]
|
||||
};
|
||||
ServerOptions.afterLayergroupCreateCalls = 0;
|
||||
this.client = new TestClient(layergroup);
|
||||
this.client.getLayergroup({ response: { status: 400 } }, function(err, parsed) {
|
||||
assert.ok(!err, err);
|
||||
// See http://github.com/CartoDB/Windshaft/issues/159
|
||||
assert.equal(ServerOptions.afterLayergroupCreateCalls, 0);
|
||||
assert.ok(parsed);
|
||||
assert.equal(parsed.errors.length, 1);
|
||||
var error = parsed.errors[0];
|
||||
@ -186,7 +196,10 @@ describe('multilayer error cases', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
try {
|
||||
@ -222,7 +235,10 @@ describe('multilayer error cases', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
try {
|
||||
@ -264,7 +280,10 @@ describe('multilayer error cases', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) {
|
||||
assert.equal(res.statusCode, 400, res.body);
|
||||
@ -367,7 +386,10 @@ describe('multilayer error cases', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/deadbeef/0/0/0/0.grid.json',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function checkResponse(err, res) {
|
||||
|
@ -23,13 +23,12 @@ describe('multilayer interactivity and layers order', function() {
|
||||
layers: testScenario.layers
|
||||
};
|
||||
|
||||
PortedServerOptions.afterLayergroupCreateCalls = 0;
|
||||
|
||||
assert.response(server,
|
||||
{
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(layergroup)
|
||||
@ -49,8 +48,6 @@ describe('multilayer interactivity and layers order', function() {
|
||||
'\n\tLayer types: ' + layergroup.layers.map(layerType).join(', ')
|
||||
);
|
||||
|
||||
// assert.equal(PortedServerOptions.afterLayergroupCreateCalls, 1);
|
||||
|
||||
var layergroupResponse = JSON.parse(response.body);
|
||||
assert.ok(layergroupResponse);
|
||||
|
||||
|
@ -41,7 +41,7 @@ describe('raster', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(mapconfig)
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
@ -66,7 +66,8 @@ describe('raster', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: { host: 'localhost' }
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_response(err, res) {
|
||||
@ -124,6 +125,7 @@ describe('raster', function() {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(mapconfig)
|
||||
|
@ -8,21 +8,6 @@ describe('regressions', function() {
|
||||
testHelper.rmdirRecursiveSync(global.environment.millstone.cache_basedir);
|
||||
});
|
||||
|
||||
// See https://github.com/Vizzuality/Windshaft/issues/65
|
||||
it("#65 catching non-Error exception doesn't kill the backend", function(done) {
|
||||
var mapConfig = testClient.defaultTableMapConfig('test_table');
|
||||
testClient.withLayergroup(mapConfig, function(err, requestTile, finish) {
|
||||
var options = {
|
||||
statusCode: 400,
|
||||
contentType: 'application/json; charset=utf-8'
|
||||
};
|
||||
requestTile('/0/0/0.png?testUnexpectedError=1', options, function(err, res) {
|
||||
assert.deepEqual(JSON.parse(res.body).errors, ["test unexpected error"]);
|
||||
finish(done);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Test that you cannot write to the database from a tile request
|
||||
//
|
||||
// See http://github.com/CartoDB/Windshaft/issues/130
|
||||
|
@ -38,6 +38,7 @@ describe('retina support', function() {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(retinaSampleMapConfig)
|
||||
@ -67,7 +68,10 @@ describe('retina support', function() {
|
||||
{
|
||||
url: '/database/windshaft_test/layergroup/' + layergroupId + '/0/0/0' + scaleFactor + '.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
},
|
||||
responseHead,
|
||||
assertFn
|
||||
|
@ -59,7 +59,7 @@ describe('server_gettile', function() {
|
||||
assert.ok(xwc > 0);
|
||||
assert.ok(xwc >= lastXwc);
|
||||
|
||||
requestTile(tileUrl + '?cache_buster=wadus', function (err, res) {
|
||||
requestTile(tileUrl, { cache_buster: 'wadus' }, function (err, res) {
|
||||
var xwc = res.headers['x-windshaft-cache'];
|
||||
assert.ok(!xwc);
|
||||
|
||||
@ -99,9 +99,15 @@ describe('server_gettile', function() {
|
||||
}
|
||||
|
||||
testClient.withLayergroup(mapConfig, validateLayergroup, function(err, requestTile, finish) {
|
||||
|
||||
requestTile(tileUrl, function(err, res) {
|
||||
assert.ok(res.headers.hasOwnProperty('x-windshaft-cache'), "Did not hit renderer cache on second time");
|
||||
var xwc = res.headers['x-windshaft-cache'];
|
||||
assert.ok(!xwc);
|
||||
|
||||
requestTile(tileUrl, function (err, res) {
|
||||
assert.ok(
|
||||
res.headers.hasOwnProperty('x-windshaft-cache'),
|
||||
"Did not hit renderer cache on second time"
|
||||
);
|
||||
assert.ok(res.headers['x-windshaft-cache'] >= 0);
|
||||
|
||||
assert.imageBufferIsSimilarToFile(res.body, imageFixture, IMAGE_EQUALS_TOLERANCE_PER_MIL,
|
||||
@ -114,6 +120,7 @@ describe('server_gettile', function() {
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
var test_style_black_200 = "#test_table{marker-fill:black;marker-line-color:black;marker-width:5}";
|
||||
var test_style_black_210 = "#test_table{marker-fill:black;marker-line-color:black;marker-width:10}";
|
||||
|
@ -62,6 +62,7 @@ describe('server_png8_format', function() {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(layergroup)
|
||||
@ -81,7 +82,10 @@ describe('server_png8_format', function() {
|
||||
var requestPayload = {
|
||||
url: '/database/windshaft_test/layergroup/' + layergroupId + tilePartialUrl,
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
};
|
||||
|
||||
var requestHeaders = {
|
||||
@ -179,4 +183,3 @@ describe('server_png8_format', function() {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
var _ = require('underscore');
|
||||
var serverOptions = require('../../../../lib/cartodb/server_options');
|
||||
var mapnik = require('windshaft').mapnik;
|
||||
var LayergroupToken = require('../../../../lib/cartodb/models/layergroup-token');
|
||||
var OverviewsQueryRewriter = require('../../../../lib/cartodb/utils/overviews_query_rewriter');
|
||||
var overviewsQueryRewriter = new OverviewsQueryRewriter({
|
||||
zoom_level: 'CDB_ZoomFromScale(!scale_denominator!)'
|
||||
@ -47,48 +46,5 @@ module.exports = _.extend({}, serverOptions, {
|
||||
enable_cors: global.environment.enable_cors,
|
||||
unbuffered_logging: true, // for smoother teardown from tests
|
||||
log_format: null, // do not log anything
|
||||
afterLayergroupCreateCalls: 0,
|
||||
useProfiler: true,
|
||||
req2params: function(req, res, callback){
|
||||
|
||||
if ( req.query.testUnexpectedError ) {
|
||||
return callback('test unexpected error');
|
||||
}
|
||||
|
||||
// this is in case you want to test sql parameters eg ...png?sql=select * from my_table limit 10
|
||||
req.params = _.extend({}, req.params);
|
||||
|
||||
if (req.params.token) {
|
||||
req.params.token = LayergroupToken.parse(req.params.token).token;
|
||||
}
|
||||
|
||||
_.extend(req.params, req.query);
|
||||
req.params.user = 'localhost';
|
||||
res.locals.user = 'localhost';
|
||||
|
||||
req.params.dbhost = global.environment.postgres.host;
|
||||
req.params.dbport = req.params.dbport || global.environment.postgres.port;
|
||||
|
||||
req.params.dbuser = 'test_windshaft_publicuser';
|
||||
if (req.params.dbname !== 'windshaft_test2') {
|
||||
req.params.dbuser = 'test_windshaft_cartodb_user_1';
|
||||
}
|
||||
req.params.dbname = 'test_windshaft_cartodb_user_1_db';
|
||||
|
||||
// add all params to res.locals
|
||||
res.locals = _.extend({}, req.params);
|
||||
|
||||
|
||||
// increment number of calls counter
|
||||
global.req2params_calls = global.req2params_calls ? global.req2params_calls + 1 : 1;
|
||||
|
||||
// send the finished req object on
|
||||
callback(null,req);
|
||||
},
|
||||
afterLayergroupCreate: function(req, cfg, res, callback) {
|
||||
res.layercount = cfg.layers.length;
|
||||
// config.afterLayergroupCreateCalls++;
|
||||
callback(null);
|
||||
}
|
||||
|
||||
useProfiler: true
|
||||
});
|
||||
|
@ -72,7 +72,7 @@ function createLayergroup(layergroupConfig, options, callback) {
|
||||
});
|
||||
},
|
||||
function validateLayergroup(err, res) {
|
||||
assert.ok(!err, 'Failed to request layergroup');
|
||||
assert.ifError(err);
|
||||
|
||||
var parsedBody;
|
||||
var layergroupid;
|
||||
@ -129,6 +129,7 @@ function layergroupRequest(layergroupConfig, method, callbackName, extraParams)
|
||||
var request = {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
};
|
||||
@ -337,6 +338,7 @@ function getGeneric(layergroupConfig, url, expectedResponse, callback) {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {
|
||||
host: 'localhost',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
data: JSON.stringify(layergroupConfig)
|
||||
@ -372,7 +374,10 @@ function getGeneric(layergroupConfig, url, expectedResponse, callback) {
|
||||
|
||||
var request = {
|
||||
url: finalUrl,
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
};
|
||||
|
||||
if (contentType === pngContentType) {
|
||||
@ -449,12 +454,28 @@ function withLayergroup(layergroupConfig, options, callback) {
|
||||
};
|
||||
}
|
||||
|
||||
var baseUrlTpl = '/database/windshaft_test/layergroup/<%= layergroupid %>';
|
||||
var finalUrl = _.template(baseUrlTpl, { layergroupid: layergroupid }) + layergroupUrl;
|
||||
const signerTpl = function ({ signer }) {
|
||||
return `${signer ? `:${signer}@` : ''}`;
|
||||
};
|
||||
|
||||
const cacheTpl = function ({ cache_buster, cacheBuster }) {
|
||||
return `${cache_buster ? `:${cache_buster}` : `:${cacheBuster}`}`;
|
||||
};
|
||||
|
||||
const urlTpl = function ({layergroupid, cache_buster = null, tile }) {
|
||||
const { signer, token , cacheBuster } = LayergroupToken.parse(layergroupid);
|
||||
const base = '/database/windshaft_test/layergroup/';
|
||||
return `${base}${signerTpl({signer})}${token}${cacheTpl({cache_buster, cacheBuster})}${tile}`;
|
||||
};
|
||||
|
||||
const finalUrl = urlTpl({ layergroupid, cache_buster: options.cache_buster, tile: layergroupUrl });
|
||||
|
||||
var request = {
|
||||
url: finalUrl,
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
};
|
||||
|
||||
if (options.contentType === pngContentType) {
|
||||
|
@ -48,7 +48,7 @@ describe('torque', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) { next(null, res); });
|
||||
},
|
||||
@ -71,7 +71,7 @@ describe('torque', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) { next(null, res); });
|
||||
},
|
||||
@ -94,7 +94,7 @@ describe('torque', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) { next(null, res); });
|
||||
},
|
||||
@ -136,7 +136,7 @@ describe('torque', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) { next(null, res); });
|
||||
},
|
||||
@ -179,7 +179,7 @@ describe('torque', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(mapconfig)
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
@ -218,7 +218,10 @@ describe('torque', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0.png',
|
||||
method: 'GET',
|
||||
encoding: 'binary'
|
||||
encoding: 'binary',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_mapnik_error_1(err, res) {
|
||||
@ -235,7 +238,10 @@ describe('torque', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.grid.json',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_mapnik_error_2(err, res) {
|
||||
@ -252,7 +258,10 @@ describe('torque', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.json.torque',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_torque0_response(err, res) {
|
||||
@ -270,7 +279,10 @@ describe('torque', function() {
|
||||
var next = this;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/0/0/0.torque.json',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function check_torque0_response_1(err, res) {
|
||||
@ -315,7 +327,7 @@ describe('torque', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(mapconfig)
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
@ -354,19 +366,25 @@ describe('torque', function() {
|
||||
]
|
||||
};
|
||||
|
||||
let defautlPort = global.environment.postgres.port;
|
||||
|
||||
step(
|
||||
function do_post()
|
||||
{
|
||||
var next = this;
|
||||
global.environment.postgres.port = 54777;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup?dbport=54777',
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(mapconfig)
|
||||
}, {}, function(res, err) { next(err, res); });
|
||||
},
|
||||
function checkPost(err, res) {
|
||||
assert.ifError(err);
|
||||
|
||||
global.environment.postgres.port = defautlPort;
|
||||
|
||||
assert.equal(res.statusCode, 500, res.statusCode + ': ' + res.body);
|
||||
var parsed = JSON.parse(res.body);
|
||||
assert.ok(parsed.errors, parsed);
|
||||
@ -407,9 +425,9 @@ describe('torque', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(layergroup)
|
||||
}, {}, function(res) { next(null, res); });
|
||||
}, {}, function (res) { next(null, res); });
|
||||
},
|
||||
function checkResponse(err, res) {
|
||||
assert.ifError(err);
|
||||
|
@ -237,7 +237,7 @@ describe('torque boundary points', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(boundaryPointsMapConfig)
|
||||
}, {}, function (res, err) {
|
||||
|
||||
@ -250,7 +250,10 @@ describe('torque boundary points', function() {
|
||||
var partialUrl = tileRequest.z + '/' + tileRequest.x + '/' + tileRequest.y;
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + expected_token + '/0/' + partialUrl + '.json.torque',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function (res, err) {
|
||||
assert.ok(!err, 'Failed to get json');
|
||||
|
||||
@ -351,7 +354,7 @@ describe('torque boundary points', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(londonPointMapConfig)
|
||||
}, {}, function (res, err) {
|
||||
assert.ok(!err, 'Failed to create layergroup');
|
||||
@ -363,7 +366,10 @@ describe('torque boundary points', function() {
|
||||
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + layergroupId + '/0/2/1/1.json.torque',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function (res, err) {
|
||||
assert.ok(!err, 'Failed to request torque.json');
|
||||
|
||||
@ -414,7 +420,7 @@ describe('torque boundary points', function() {
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup',
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json' },
|
||||
headers: { host: 'localhost', 'Content-Type': 'application/json' },
|
||||
data: JSON.stringify(londonPointMapConfig)
|
||||
}, {}, function (res, err) {
|
||||
assert.ok(!err, 'Failed to create layergroup');
|
||||
@ -426,7 +432,10 @@ describe('torque boundary points', function() {
|
||||
|
||||
assert.response(server, {
|
||||
url: '/database/windshaft_test/layergroup/' + layergroupId + '/0/13/4255/2765.json.torque',
|
||||
method: 'GET'
|
||||
method: 'GET',
|
||||
headers: {
|
||||
host: 'localhost'
|
||||
}
|
||||
}, {}, function (res, err) {
|
||||
assert.ok(!err, 'Failed to request torque.json');
|
||||
|
||||
|
@ -7,11 +7,11 @@ 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/context/clean-up-query-params');
|
||||
const authorizeMiddleware = require('../../../lib/cartodb/middleware/context/authorize');
|
||||
const dbConnSetupMiddleware = require('../../../lib/cartodb/middleware/context/db-conn-setup');
|
||||
const credentialsMiddleware = require('../../../lib/cartodb/middleware/context/credentials');
|
||||
const localsMiddleware = require('../../../lib/cartodb/middleware/context/locals');
|
||||
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 localsMiddleware = require('../../../lib/cartodb/middleware/locals');
|
||||
|
||||
var windshaft = require('windshaft');
|
||||
|
||||
@ -178,10 +178,9 @@ describe('prepare-context', function() {
|
||||
return done(err);
|
||||
}
|
||||
|
||||
var query = res.locals;
|
||||
assert.deepEqual(config, query.config);
|
||||
assert.equal('test', query.api_key);
|
||||
assert.equal(undefined, query.non_included);
|
||||
assert.deepEqual(config, req.query.config);
|
||||
assert.equal('test', req.query.api_key);
|
||||
assert.equal(undefined, req.query.non_included);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user