Validate aggregation query param
This commit is contained in:
parent
f390a10830
commit
6d46a21005
@ -7,6 +7,9 @@ const MISSING_AGGREGATION_COLUMNS = 'Missing columns in the aggregation. The map
|
|||||||
const unsupportedGeometryTypeErrorMessage = ctx =>
|
const unsupportedGeometryTypeErrorMessage = ctx =>
|
||||||
`Unsupported geometry type: ${ctx.geometryType}. Aggregation is available only for geometry type: ST_Point`;
|
`Unsupported geometry type: ${ctx.geometryType}. Aggregation is available only for geometry type: ST_Point`;
|
||||||
|
|
||||||
|
const invalidAggregationParamValueErrorMessage = ctx =>
|
||||||
|
`Invalid value for 'aggregation' query param: ${ctx.value}. Valid ones are 'true' or 'false'`;
|
||||||
|
|
||||||
module.exports = class AggregationMapConfigAdapter {
|
module.exports = class AggregationMapConfigAdapter {
|
||||||
constructor (pgConnection) {
|
constructor (pgConnection) {
|
||||||
this.pgConnection = pgConnection;
|
this.pgConnection = pgConnection;
|
||||||
@ -15,6 +18,10 @@ module.exports = class AggregationMapConfigAdapter {
|
|||||||
getMapConfig (user, requestMapConfig, params, context, callback) {
|
getMapConfig (user, requestMapConfig, params, context, callback) {
|
||||||
const mapConfig = new MapConfig(requestMapConfig);
|
const mapConfig = new MapConfig(requestMapConfig);
|
||||||
|
|
||||||
|
if (!this._isValidAggregationParam(params)) {
|
||||||
|
return callback(new Error(invalidAggregationParamValueErrorMessage({ value: params.aggregation })));
|
||||||
|
}
|
||||||
|
|
||||||
if (!this._shouldAdapt(mapConfig, params)) {
|
if (!this._shouldAdapt(mapConfig, params)) {
|
||||||
return callback(null, requestMapConfig);
|
return callback(null, requestMapConfig);
|
||||||
}
|
}
|
||||||
@ -36,6 +43,11 @@ module.exports = class AggregationMapConfigAdapter {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_isValidAggregationParam (params) {
|
||||||
|
const { aggregation } = params;
|
||||||
|
return aggregation === undefined || aggregation === 'true' || aggregation === 'false';
|
||||||
|
}
|
||||||
|
|
||||||
_hasMissingColumns (mapConfig) {
|
_hasMissingColumns (mapConfig) {
|
||||||
const layers = mapConfig.getLayers();
|
const layers = mapConfig.getLayers();
|
||||||
|
|
||||||
@ -77,11 +89,7 @@ module.exports = class AggregationMapConfigAdapter {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aggregation === 'true') {
|
if (aggregation === 'true' || mapConfig.isAggregationMapConfig()) {
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mapConfig.isAggregationMapConfig()) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,7 +291,8 @@ describe('aggregation', function () {
|
|||||||
aggregate_function: 'sum',
|
aggregate_function: 'sum',
|
||||||
aggregated_column: 'value'
|
aggregated_column: 'value'
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
threshold: 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -308,7 +309,49 @@ describe('aggregation', function () {
|
|||||||
assert.equal(typeof body.metadata, 'object');
|
assert.equal(typeof body.metadata, 'object');
|
||||||
assert.ok(Array.isArray(body.metadata.layers));
|
assert.ok(Array.isArray(body.metadata.layers));
|
||||||
|
|
||||||
body.metadata.layers.forEach(layer => assert.ok(layer.meta.aggregation === undefined));
|
body.metadata.layers.forEach(layer => assert.equal(layer.meta.aggregation, undefined));
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('when the aggregation param is not valid should respond with error', function (done) {
|
||||||
|
const mapConfig = createVectorMapConfig([
|
||||||
|
{
|
||||||
|
type: 'cartodb',
|
||||||
|
options: {
|
||||||
|
sql: POINTS_SQL_1,
|
||||||
|
aggregation: {
|
||||||
|
threshold: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
this.testClient = new TestClient(mapConfig);
|
||||||
|
const options = {
|
||||||
|
response: {
|
||||||
|
status: 400
|
||||||
|
},
|
||||||
|
aggregation: 'wadus'
|
||||||
|
};
|
||||||
|
|
||||||
|
this.testClient.getLayergroup(options, (err, body) => {
|
||||||
|
if (err) {
|
||||||
|
return done(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.deepEqual(body, {
|
||||||
|
errors: [
|
||||||
|
"Invalid value for 'aggregation' query param: wadus." +
|
||||||
|
" Valid ones are 'true' or 'false'"
|
||||||
|
],
|
||||||
|
errors_with_context:[{
|
||||||
|
type: 'unknown',
|
||||||
|
message: "Invalid value for 'aggregation' query param: wadus." +
|
||||||
|
" Valid ones are 'true' or 'false'"
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@ -352,7 +395,7 @@ describe('aggregation', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('when the layer\'s geometry type is not point should responds with error', function (done) {
|
it('when the layer\'s geometry type is not point should respond with error', function (done) {
|
||||||
const mapConfig = createVectorMapConfig([
|
const mapConfig = createVectorMapConfig([
|
||||||
{
|
{
|
||||||
type: 'cartodb',
|
type: 'cartodb',
|
||||||
|
@ -625,7 +625,7 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) {
|
|||||||
queryParams.api_key = self.apiKey;
|
queryParams.api_key = self.apiKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof params.aggregation === 'boolean') {
|
if (params.aggregation !== undefined) {
|
||||||
queryParams.aggregation = params.aggregation;
|
queryParams.aggregation = params.aggregation;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -801,7 +801,7 @@ TestClient.prototype.getLayergroup = function (params, callback) {
|
|||||||
queryParams.api_key = self.apiKey;
|
queryParams.api_key = self.apiKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof params.aggregation === 'boolean') {
|
if (params.aggregation !== undefined) {
|
||||||
queryParams.aggregation = params.aggregation;
|
queryParams.aggregation = params.aggregation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user