90 lines
2.9 KiB
JavaScript
90 lines
2.9 KiB
JavaScript
const cleanUpQueryParams = require('../../middleware/clean-up-query-params');
|
|
const credentials = require('../../middleware/credentials');
|
|
const dbConnSetup = require('../../middleware/db-conn-setup');
|
|
const authorize = require('../../middleware/authorize');
|
|
const namedMapProvider = require('./middlewares/named-map-provider');
|
|
const cacheControlHeader = require('../../middleware/cache-control-header');
|
|
const cacheChannelHeader = require('../../middleware/cache-channel-header');
|
|
const surrogateKeyHeader = require('../../middleware/surrogate-key-header');
|
|
const lastModifiedHeader = require('../../middleware/last-modified-header');
|
|
const vectorError = require('../../middleware/vector-error');
|
|
const rateLimit = require('../../middleware/rate-limit');
|
|
const { RATE_LIMIT_ENDPOINTS_GROUPS } = rateLimit;
|
|
|
|
function TileTemplateController (
|
|
namedMapProviderCache,
|
|
tileBackend,
|
|
surrogateKeysCache,
|
|
pgConnection,
|
|
authApi,
|
|
userLimitsApi
|
|
) {
|
|
this.namedMapProviderCache = namedMapProviderCache;
|
|
this.tileBackend = tileBackend;
|
|
this.surrogateKeysCache = surrogateKeysCache;
|
|
this.pgConnection = pgConnection;
|
|
this.authApi = authApi;
|
|
this.userLimitsApi = userLimitsApi;
|
|
}
|
|
|
|
module.exports = TileTemplateController;
|
|
|
|
TileTemplateController.prototype.register = function (templateRouter) {
|
|
templateRouter.get(
|
|
`/:template_id/:layer/:z/:x/:y.(:format)`,
|
|
credentials(),
|
|
authorize(this.authApi),
|
|
dbConnSetup(this.pgConnection),
|
|
rateLimit(this.userLimitsApi, RATE_LIMIT_ENDPOINTS_GROUPS.NAMED_TILES),
|
|
cleanUpQueryParams(),
|
|
namedMapProvider({
|
|
namedMapProviderCache: this.namedMapProviderCache,
|
|
label: 'NAMED_MAP_TILE'
|
|
}),
|
|
getTile({
|
|
tileBackend: this.tileBackend,
|
|
label: 'NAMED_MAP_TILE'
|
|
}),
|
|
setContentTypeHeader(),
|
|
cacheControlHeader(),
|
|
cacheChannelHeader(),
|
|
surrogateKeyHeader({ surrogateKeysCache: this.surrogateKeysCache }),
|
|
lastModifiedHeader(),
|
|
vectorError()
|
|
);
|
|
};
|
|
|
|
function getTile ({ tileBackend, label }) {
|
|
return function getTileMiddleware (req, res, next) {
|
|
const { mapConfigProvider } = res.locals;
|
|
const { layer, z, x, y, format } = req.params;
|
|
const params = { layer, z, x, y, format };
|
|
|
|
tileBackend.getTile(mapConfigProvider, params, (err, tile, headers, stats) => {
|
|
req.profiler.add(stats);
|
|
req.profiler.done('render-' + format);
|
|
|
|
if (err) {
|
|
err.label = label;
|
|
return next(err);
|
|
}
|
|
|
|
if (headers) {
|
|
res.set(headers);
|
|
}
|
|
|
|
res.body = tile;
|
|
|
|
next();
|
|
});
|
|
};
|
|
}
|
|
|
|
function setContentTypeHeader () {
|
|
return function setContentTypeHeaderMiddleware(req, res, next) {
|
|
res.set('Content-Type', res.get('content-type') || res.get('Content-Type') || 'image/png');
|
|
|
|
next();
|
|
};
|
|
}
|