UNPKG

@wbg-mde/r-factory

Version:

Metadata editor R integration module

159 lines (158 loc) 6.78 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const repository_1 = require("@wbg-mde/repository"); const api_helper_1 = require("../shared/api-helper"); const _ = require('lodash'); let BaseKey = class BaseKey { validate(datasets, variables, callback) { try { this.validateRelations(datasets, variables, (resp) => { if (resp.valid) { this.validateFiles(resp.files, 0, callback); } else { callback(resp); } }); } catch (e) { console.log(e); callback({ result: "error", messages: e }); } } validateFiles(files, index, callback) { let file = files[index]; this.validateKeys(file.filepath, file.keys, (resp) => { if (resp.result === 'ok') { if (resp.data) { callback({ result: 'ok', valid: false, msg: 'valid_unique_key', props: [file.name, ...resp.data] }); } else { index += 1; if (index < files.length) { this.validateFiles(files, index, callback); } else { callback({ result: 'ok', valid: true, msg: 'valid_succ_rel', props: [] }); } } } else { callback({ result: 'error', msg: resp.message }); } }); } validateKeys(csvPath, variableNames, callback) { return api_helper_1.APIHelper.call('validateKeys', 'post', { "keyVariables": variableNames, "datafile": csvPath }).then((response) => { callback(response.data); }); } validateRelations(datasets, variables, callback) { let relationMap = new Map(); let noRelations = true; let formattedDatasets = datasets.map((x) => { let keys = [], baseKeys = [], extKeys = [], allKeys = [], relations = []; if (x.fileTxt && x.fileTxt.fileStrc && x.fileTxt.fileStrc.recGrp) { const { keyvar, recGrp, extkeyvar } = x.fileTxt.fileStrc.recGrp; if (recGrp) { relations = recGrp.split(' '); } if (relations.length > 0) { noRelations = false; } let datasetVariables = variables[x.ID]; if (datasetVariables && datasetVariables.length > 0) { if (keyvar && keyvar.length > 0) { baseKeys = datasetVariables.filter((x) => { return (keyvar.split(' ').indexOf(x.ID) > -1); }).map((x) => { return x.name; }); keys = datasetVariables.filter((x) => { return (keyvar.split(' ').indexOf(x.ID) > -1); }).map((x) => { return x.internalName || x.name; }); } if (extkeyvar && extkeyvar.length > 0) { extKeys = datasetVariables.filter((x) => { return (extkeyvar.split(' ').indexOf(x.ID) > -1); }).map((x) => { return x.name; }); } } } allKeys = [...baseKeys, ...extKeys]; relationMap.set(x.ID, { name: x.Name, relations, baseKeys, allKeys, keys }); return x; }); if (noRelations) { callback({ result: 'ok', valid: false, msg: 'valid_no_rel', props: [] }); } else { let msg = ''; let props = []; let valid = true; let validFiles = new Array(); formattedDatasets.forEach((x) => { if (!valid) { return false; } const { name, relations, baseKeys, allKeys, keys } = relationMap.get(x.ID); if (relations.length > 0 && baseKeys.length === 0) { msg = `valid_no_base`; props = [name]; valid = false; } else { relations.forEach((file) => { let relProps = relationMap.get(file); if (relProps.baseKeys.length === 0) { msg = `valid_no_base`; props = [relProps.name]; valid = false; } else { let diff = []; if (relProps.baseKeys.length <= baseKeys.length) { diff = _.difference(relProps.baseKeys, allKeys); } else { diff = _.difference(baseKeys, relProps.allKeys); } relProps.relations = _.remove(relProps.relations, (rel) => { return (rel === file); }); if (diff && diff.length > 0) { msg = 'valid_no_merge'; props = [name, relProps.name]; valid = false; } } }); } if (valid) { validFiles.push({ name, keys, filepath: x.filePath }); } }); callback({ result: 'ok', valid, msg, props, files: validFiles }); } } }; BaseKey = __decorate([ repository_1.Trace({ params: { validate: [0], validateKeys: [0] } }) ], BaseKey); exports.BaseKey = BaseKey;