CartoDB/Windshaft

View on GitHub
lib/metadata/layer-metadata.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

module.exports = class LayerMetadata {
    constructor (layerMetadataIterator) {
        this.layerMetadataIterator = layerMetadataIterator;
    }

    getLayerMetadataFn (mapConfig, layerId) {
        const layerType = mapConfig.layerType(layerId);
        let getMetadadaFn;

        for (const layerMetadata of this.layerMetadataIterator) {
            if (layerMetadata.is(layerType)) {
                getMetadadaFn = layerMetadata.getMetadata.bind(layerMetadata);
                break;
            }
        }

        return getMetadadaFn;
    }

    getMetadata (rendererCache, params, mapConfig, callback) {
        const metadataParams = mapConfig.getLayers()
            .map((layer, layerId) => {
                const getMetadata = this.getLayerMetadataFn(mapConfig, layerId);
                return getMetadata ? { getMetadata, mapConfig, layer, layerId, params, rendererCache } : null;
            })
            .filter(metadataParam => metadataParam !== null);

        if (!metadataParams.length) {
            return callback(null, []);
        }

        return Promise.all(metadataParams.map(({ getMetadata, mapConfig, layer, layerId, params, rendererCache }) => {
            return new Promise((resolve, reject) => {
                getMetadata(mapConfig, layer, layerId, params, rendererCache, (err, metadata) => {
                    if (err) {
                        return reject(err);
                    }

                    return resolve(metadata);
                });
            });
        }))
            .then(results => {
                if (!results.length) {
                    return callback(null, null);
                }

                const metadata = [];

                mapConfig.getLayers().forEach(function (layer, layerIndex) {
                    const layerType = mapConfig.layerType(layerIndex);

                    metadata[layerIndex] = {
                        type: layerType,
                        id: mapConfig.getLayerId(layerIndex),
                        meta: results[layerIndex]
                    };

                    if (layer.options.cartocss && metadata[layerIndex].meta) {
                        metadata[layerIndex].meta.cartocss = layer.options.cartocss;
                    }
                });

                return callback(null, metadata);
            })
            .catch(err => callback(err));
    }
};