Skip to content
Snippets Groups Projects
map.routes.js 2.65 KiB
Newer Older
  • Learn to ignore specific revisions
  • const router = require('express').Router();
    const getRedisValue = require('../helpers/redis.helpers.js').getRedisValue;
    const setRedisValue = require('../helpers/redis.helpers.js').setRedisValue;
    const getDatasetInfoFromES = require('../helpers/elasticsearch.helpers.js').getDatasetInfoFromES;
    
    const printError = require('../helpers/logs.helpers.js').printError;
    
    
    router.get('/ign', (req, res, next) => {
      req.headers['referer'] = 'grandlyon.com';
      req.app.locals.proxies.ign.web(req, res, {});
      return;
    });
    
    router.get('/wms*', (req, res, next) => {
      req.app.locals.proxies.authenticated.web(req, res, {});
      return;
    });
    
    router.get('/mvt*', async (req, res, next) => {
      
      // If no cookies then then we can't identify a user and directly proxy the request without credentials
      if (req.headers["x-anonymous-consumer"]) {
        req.app.locals.proxies.unauthenticated.web(req, res, {});
        return;
      }
    
      // Read the requested layer from the url
      const layer = req.query.LAYERS;
    
      if (!layer) {
        res.status(400).send({err: "Bad request, missing LAYERS parameter."})
        return;
      }
    
      const userRightsOnTheLayer = await getRedisValue(req.app.locals.config.redisSentinelHost, req.app.locals.config.redisSentinelPort, req.app.locals.config.redisGroupName, `map-mvt-${layer}-${req.headers['x-consumer-username']}`);
    
      if (userRightsOnTheLayer === 'true') {
        req.app.locals.proxies.authenticated.web(req, res, {});
        return;
      }
    
      if (userRightsOnTheLayer === 'false') {
        res.status(401).send({err: 'Unauthenticated, you don\'t have access to this layer'});
        return;
      }
    
      let source;
    
      try {
        source = await getDatasetInfoFromES(
          req.app.locals.config.elasticsearchUrl,
          layer,
          [
            "editorial-metadata.isSample",
            "editorial-metadata.isOpenAccess"
          ],
          req.headers.cookie,
        );
      } catch(err) {
        printError('/mvt', err);
        res.status(err.status).send(err);
        return;
      }
    
      const editorialMetadata = source['editorial-metadata'];
    
      if (!editorialMetadata.isOpenAccess && editorialMetadata.isSample) {
        await setRedisValue(req.app.locals.config.redisSentinelHost, req.app.locals.config.redisSentinelPort, req.app.locals.config.redisGroupName, `map-mvt-${layer}-${req.headers['x-consumer-username']}`, false, req.app.locals.config.redisUnauthorizedTTL);
        res.status(401).send();
        return;
      }
    
      await setRedisValue(req.app.locals.config.redisSentinelHost, req.app.locals.config.redisSentinelPort, req.app.locals.config.redisGroupName, `map-mvt-${layer}-${req.headers['x-consumer-username']}`, true, req.app.locals.config.redisAuthorizedTTL);
    
      req.app.locals.proxies.authenticated.web(req, res, {});
    });
    
    module.exports = router;