@wbg-mde/r-factory
Version:
Metadata editor R integration module
159 lines (158 loc) • 6.78 kB
JavaScript
;
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;