Windshaft-cartodb/lib/models/mapconfig/provider/map-store-provider.js
2019-10-21 19:07:24 +02:00

83 lines
2.5 KiB
JavaScript

'use strict';
const BaseMapConfigProvider = require('./base-mapconfig-adapter');
const dot = require('dot');
// Configure bases for cache keys suitable for string interpolation
const baseKey = '{{=it.dbname}}:{{=it.token}}';
const rendererKey = baseKey + ':{{=it.dbuser}}:{{=it.format}}:{{=it.layer}}:{{=it.scale_factor}}';
const baseKeyTpl = dot.template(baseKey);
const rendererKeyTpl = dot.template(rendererKey);
module.exports = class MapStoreMapConfigProvider extends BaseMapConfigProvider {
/**
* @param {MapStore} mapStore
* @param {String} user
* @param {UserLimitsBackend} userLimitsBackend
* @param {Object} params
* @constructor
* @type {MapStoreMapConfigProvider}
*/
constructor (mapStore, user, userLimitsBackend, pgConnection, affectedTablesCache, params) {
super();
this.mapStore = mapStore;
this.user = user;
this.userLimitsBackend = userLimitsBackend;
this.pgConnection = pgConnection;
this.affectedTablesCache = affectedTablesCache;
this.params = params;
this.token = params.token;
this.cacheBuster = params.cache_buster || 0;
this.mapConfig = null;
this.context = null;
}
getMapConfig (callback) {
if (this.mapConfig !== null) {
return callback(null, this.mapConfig, this.params, this.context);
}
const context = {};
this.userLimitsBackend.getRenderLimits(this.user, this.params.api_key, (err, renderLimits) => {
if (err) {
return callback(err);
}
context.limits = renderLimits;
this.mapStore.load(this.token, (err, mapConfig) => {
if (err) {
return callback(err);
}
this.mapConfig = mapConfig;
this.context = context;
return callback(null, mapConfig, this.params, context);
});
});
}
getKey () {
return this.createKey(false);
}
getCacheBuster () {
return this.cacheBuster;
}
filter (key) {
const regex = new RegExp('^' + this.createKey(true) + '.*');
return key && key.match(regex);
}
createKey (base) {
const { dbname = '', token = '', dbuser = '', format = '', layer = '', scale_factor = 1 } = this.params;
const tplValues = { dbname, token, dbuser, format, layer, scale_factor };
return (base) ? baseKeyTpl(tplValues) : rendererKeyTpl(tplValues);
}
};