Manual Reference Source

app/modules/entities/crud/mapping.js

// @flow
const utils = require('../../utils/utils');

class Mapping {
    _mapping: Object;
    constructor(object: Object = {}) {
        this._mapping = object;
    }

    get mapping(): Object {
        return this._mapping;
    }

    get_all_type(key: string): Array<Array<string>> {
        function _rec(path: Array<string>,
                mapping: ?Object = {},
                results: Array<Array<string>> = [],
                parents: Array<string> = []): Array<Array<string>> {
            if (path.length === 0 || mapping == null) {
                return results;
            }
            const part = path[0];
            if (utils.hasProperty(mapping, part)
                    && typeof mapping[part] === 'object') {
                mapping = mapping[part];
                if (utils.hasProperty(mapping, 'type')
                        && typeof mapping.type === 'string') {
                    results.push([part, parents.join('.'), mapping.type]);
                } else if (utils.hasProperty(mapping, 'properties')) {
                    results.push([part, parents.join('.'), 'field']);
                }

                if (path[0] !== 'properties' && path[0] !== 'fields') {
                    parents.push(path[0]);
                }

                return _rec(path.slice(1), mapping, results, parents);
            } else if (utils.hasProperty(mapping, 'properties')) {
                path.unshift('properties');
                return _rec(path, mapping, results, parents);
            } else if (utils.hasProperty(mapping, 'fields')) {
                path.unshift('fields');
                return _rec(path, mapping, results, parents);
            }
            return results;
        }

        const path = key.split('.');
        return _rec(path, this._mapping);
    }

    get_type(key: string): ?string {
        const results = this.get_all_type(key);
        if (results.length > 0) {
            const infos = results[results.length - 1];
            return infos[infos.length - 1];
        }
        return null;
    }
}

module.exports = Mapping;