CartoDB/Windshaft

View on GitHub
lib/renderers/pg-mvt/factory.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict';

const layersFilter = require('../../utils/layers-filter');
const parseDbParams = require('../renderer-params');
const Renderer = require('./renderer');
const BaseAdaptor = require('../base-adaptor');

module.exports = class PgMvtFactory {
    static get NAME () {
        return 'pg-mvt';
    }

    static get MVT_FORMAT () {
        return 'mvt';
    }

    constructor (options = {}) {
        this.options = options;
    }

    getName () {
        return PgMvtFactory.NAME;
    }

    supportsFormat (format) {
        return format === PgMvtFactory.MVT_FORMAT;
    }

    getAdaptor (renderer, onTileErrorStrategy) {
        return new BaseAdaptor(renderer, onTileErrorStrategy);
    }

    getRenderer (mapConfig, format, options, callback) {
        if (mapConfig.isVectorOnlyMapConfig() && format !== PgMvtFactory.MVT_FORMAT) {
            const error = new Error(`Unsupported format: 'cartocss' option is missing for ${format}`);
            error.http_status = 400;
            error.type = 'tile';
            return callback(error);
        }

        if (!this.supportsFormat(format)) {
            return callback(new Error(`format not supported: ${format}`));
        }

        const mapLayers = mapConfig.getLayers();
        mapLayers.forEach((layer, layerIndex) => {
            layer.id = mapConfig.getLayerId(layerIndex);
        });

        const filteredLayers = layersFilter(mapConfig, options.layer);
        if (filteredLayers.length < 1) {
            return callback(new Error('no mapnik layer in mapConfig'));
        }

        const layers = filteredLayers.map(layerIndex => mapConfig.getLayer(layerIndex));
        const dbParams = parseDbParams(options.params);
        Object.assign(dbParams, mapConfig.getLayerDatasource(options.layer));

        if (Number.isFinite(mapConfig.getBufferSize(PgMvtFactory.MVT_FORMAT))) {
            this.options.bufferSize = mapConfig.getBufferSize(PgMvtFactory.MVT_FORMAT);
        }

        try {
            const mapExtents = mapConfig.getMVTExtents();
            this.options.vector_extent = mapExtents.extent;
            this.options.vector_simplify_extent = mapExtents.simplify_extent;

            const mvtRenderer = new Renderer(layers, this.options, dbParams);
            mvtRenderer.getAllLayerColumns()
                .then((renderer) => callback(null, renderer))
                .catch((err) => callback(err));
        } catch (err) {
            return callback(err);
        }
    }
};