Manual Reference Source

app/modules/pipeline/completer/complfunctions/index.js

// @flow
const _ = require('lodash');
const Handlebars = require('../../../utils/templating');
const Utils = require('../../../utils/utils');
const CryptoUtils = require('../../../utils/crypto');
const EntitiesUtils = require('../../../utils/entities');
const LangUtils = require('../../../utils/lang');

function generic_complete(template: string): Function {
    return async (object: Object, path: string, info: Object = {}) => {
        const t = Handlebars.compile(template)({ object, info });
        return Utils.make_nested_object_from_path(path.split('.'), t);
    };
}

async function key_complete(object: Object, path: string, info: Object = {}) {
    const result = Utils.make_nested_object_from_path(path.split('.'), CryptoUtils.generate_key(''));
    return result;
}

async function secret_complete(object: Object, path: string, info: Object = {}) {
    const result = Utils.make_nested_object_from_path(path.split('.'), CryptoUtils.generate_secret());
    return result;
}

function initial(name_path: string, use_dash_split: boolean = true) {
    return async (object: Object, path: string) => {
        const name = Utils.find_value_with_path(object, name_path.split('.'));
        if (name == null || name.trim() === '') {
            return {};
        }

        const stopwords = ['de', 'le', 'la', 'les', 'van', 'von', 'du', 'den', 'der', 'die'];
        const parts = name.split(' ');
        const info = parts.reduce((arr, p) => {
            if (stopwords.indexOf(p.toLowerCase()) !== -1) {
                return arr;
            }
            arr.push(p);
            return arr;
        }, []);

        if (info.length === 0) {
            return {};
        }

        const first = info[0];

        if (first.startsWith('d\'')) {
            return Utils.make_nested_object_from_path(path.split('.'), first.slice(2)[0]);
        }

        if (use_dash_split) {
            const dash_parts = first.split('-');
            if (dash_parts.length > 1) {
                const f = dash_parts.map(p => p[0]);
                return Utils.make_nested_object_from_path(path.split('.'), f.join('-'));
            }
        }
        return Utils.make_nested_object_from_path(path.split('.'), first[0]);
    };
}

function denormalization(from_entity: string, from_path: string,
        entity_path: string, flatten: boolean, translatable: boolean, search_value: string = ''): Function {
    const ENV = process.env.NODE_ENV || 'local';


    return async (object: Object, path: string, info: Object = {}) => {
        const func = (nr, from, eseg, flat, svalue) => async (id) => {
            if (!id) {
                return null;
            }
            if (nr) {
                let source = null;

                if (svalue !== '') {
                    const sources = await EntitiesUtils.search_and_get_sources(from, {
                        where: { [svalue]: id },
                        size: 1,
                    });
                    if (sources.length > 0) {
                        source = sources[0];
                    }
                } else {
                    source = await EntitiesUtils.retrieve_and_get_source(from, id);
                }

                if (source == null) {
                    return null;
                }

                const eobj = Utils.find_object_with_path(source, eseg);
                if (eobj == null) {
                    return null;
                }
                const last = eseg[eseg.length - 1];
                const value = eobj[last];
                if (flat) {
                    return value;
                }
                return { [last]: value };
            }
            return id;
        };

        const need_to_retrieve = from_entity != null && from_entity.trim() !== ''
            && entity_path != null && entity_path.trim() !== '';
        const entity_segments = entity_path.split('.');

        const from_path_segments = from_path.split('.');
        const result = await Utils.traverse_recreate_and_execute(object, from_path_segments,
                func(need_to_retrieve, from_entity, entity_segments, flatten, search_value));
        return { denormalization: result };
    };
}

module.exports = {
    generic_complete,
    key_complete,
    secret_complete,
    denormalization,
    initial,
};