65 lines
2.2 KiB
JavaScript
65 lines
2.2 KiB
JavaScript
'use strict';
|
|
|
|
const queryUtils = require('../../../utils/query-utils');
|
|
const dateWrapper = require('../../../utils/date-wrapper');
|
|
|
|
/**
|
|
* This middleware wraps the layer query transforming the date fields into numbers because mvt tiles
|
|
* doesnt support dates as primitive type.
|
|
*
|
|
* - This middleware is ONLY activated when the `dates_as_numbers` option is enabled for some layer in the mapConfig.
|
|
*/
|
|
class VectorMapConfigAdapter {
|
|
constructor (pgConnection) {
|
|
this.pgConnection = pgConnection;
|
|
}
|
|
|
|
getMapConfig (user, requestMapConfig, params, context, callback) {
|
|
if (!this._isDatesAsNumbersFlagEnabled(requestMapConfig)) {
|
|
return callback(null, requestMapConfig);
|
|
}
|
|
|
|
this._wrapDates(requestMapConfig, user)
|
|
.then(updatedRequestMapConfig => callback(null, updatedRequestMapConfig))
|
|
.catch(callback);
|
|
}
|
|
|
|
_wrapDates (requestMapConfig, user) {
|
|
return Promise.all(requestMapConfig.layers.map(layer => this._wrapLayer(layer, user)))
|
|
.then(() => requestMapConfig);
|
|
}
|
|
|
|
_wrapLayer (layer, user) {
|
|
if (!layer.options.dates_as_numbers || !layer.options.sql) {
|
|
return Promise.resolve(layer);
|
|
}
|
|
const originalQuery = layer.options.sql;
|
|
return this._getColumns(user, originalQuery)
|
|
.then(result => {
|
|
const newSqlQuery = dateWrapper.wrapDates(originalQuery, result.fields);
|
|
layer.options.sql = newSqlQuery;
|
|
return layer;
|
|
});
|
|
}
|
|
|
|
_getColumns (user, originalQuery) {
|
|
return new Promise((resolve, reject) => {
|
|
this.pgConnection.getConnection(user, (err, connection) => {
|
|
if (err) {
|
|
return reject(err);
|
|
}
|
|
const query = queryUtils.getQueryLimited(queryUtils.substituteDummyTokens(originalQuery), 0);
|
|
queryUtils.queryPromise(connection, query)
|
|
.then(resolve)
|
|
.catch(reject);
|
|
});
|
|
});
|
|
}
|
|
|
|
_isDatesAsNumbersFlagEnabled (requestMapConfig) {
|
|
return requestMapConfig.layers && requestMapConfig.layers.some(layer => layer.options.dates_as_numbers);
|
|
}
|
|
}
|
|
|
|
module.exports = VectorMapConfigAdapter;
|