low-code-service
Version:
to handle workflow execution, handlebars execution and condition execution for low code service
242 lines (241 loc) • 7.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.LOGICAL_OPERATORS = exports.RELATIONAL_OPERATORS = exports.validateDataUsingFilters = exports.sanitizeDataForFilters = exports.parseBoolean = void 0;
var lodash_1 = require("lodash");
var sift_1 = require("sift");
var parseBoolean = function (string) {
switch (String(string).toLowerCase()) {
case 'true':
case 'yes':
case 'y':
case '1':
return true;
case 'false':
case 'no':
case 'n':
case '0':
return false;
default:
return undefined;
}
};
exports.parseBoolean = parseBoolean;
var sanitizeDataForFilters = function (dataForFilters, rawConditionData) {
if (!(Array.isArray(rawConditionData) && rawConditionData.length)) {
return dataForFilters;
}
try {
var toRet = (0, lodash_1.cloneDeep)(dataForFilters);
for (var _i = 0, rawConditionData_1 = rawConditionData; _i < rawConditionData_1.length; _i++) {
var conditionObj = rawConditionData_1[_i];
if (!conditionObj.type) {
continue;
}
if (conditionObj.type === 'number') {
var sanitizedData = Number((0, lodash_1.get)(toRet, conditionObj.field, 0));
(0, lodash_1.set)(toRet, conditionObj.field, sanitizedData);
}
if (conditionObj.type === 'boolean') {
var sanitizedData = (0, exports.parseBoolean)((0, lodash_1.get)(toRet, conditionObj.field, false));
(0, lodash_1.set)(toRet, conditionObj.field, sanitizedData);
}
}
return toRet;
}
catch (err) {
// returning unsanitized data
return dataForFilters;
}
};
exports.sanitizeDataForFilters = sanitizeDataForFilters;
var validateDataUsingFilters = function (filters, dataForFilters) {
for (var _i = 0, filters_1 = filters; _i < filters_1.length; _i++) {
var filter = filters_1[_i];
var whenCondition = filter.whenCondition;
var isWhenSatisfied = true;
if (whenCondition) {
var sanitizedData = (0, exports.sanitizeDataForFilters)(dataForFilters, whenCondition);
var shifted = converterForSIFT(filter);
var whenSiftFunc = (0, sift_1.default)(shifted.when);
try {
isWhenSatisfied = whenSiftFunc(sanitizedData);
}
catch (err) {
console.log(err);
return false;
}
if (isWhenSatisfied) {
return filter;
}
}
}
return false;
};
exports.validateDataUsingFilters = validateDataUsingFilters;
function converterForSIFT(obj) {
var cloneObj = (0, lodash_1.cloneDeep)(obj);
//structuredClone(obj); //cloneDeep
var whenOperator = cloneObj.whenOperator, whenCondition = cloneObj.whenCondition;
var filter = {};
if (whenCondition && Array.isArray(whenCondition) && whenCondition.length) {
filter['when'] = transform(whenOperator, whenCondition);
}
var result = filter;
return result;
}
exports.RELATIONAL_OPERATORS = {
greater_than: {
pretty_name: 'Greater Than',
query: '$gt',
value_required: true,
sql_query: '>',
},
greater_than_or_equal: {
pretty_name: 'Greater than or equal',
query: '$gte',
value_required: true,
sql_query: '>=',
},
less_than: {
pretty_name: 'Less than',
query: '$lt',
value_required: true,
sql_query: '<',
},
less_than_or_equal: {
pretty_name: 'Less than or equal',
query: '$lte',
value_required: true,
sql_query: '<=',
},
equal_to: {
pretty_name: 'Equal to',
query: '$eq',
value_required: true,
sql_query: '=',
},
not_equal_to: {
pretty_name: 'Not Equal to',
query: '$ne',
value_required: true,
sql_query: '!=',
},
should_be_true: {
pretty_name: 'Should be TRUE',
query: '$eq',
value_required: false,
default_value: true,
sql_query: 'IS TRUE',
},
should_be_false: {
pretty_name: 'Should be FALSE',
query: '$eq',
value_required: false,
default_value: false,
sql_query: 'IS FALSE',
},
is_number: {
pretty_name: 'Is number',
query: '$type',
value_required: false,
default_value: 'number',
},
is_text: {
pretty_name: 'Is text',
query: '$type',
value_required: false,
default_value: 'string',
},
in: {
pretty_name: 'In Array/List',
query: '$in',
value_required: true,
render_type: 'TAG',
default_value: [],
sql_query: 'IN',
},
nin: {
pretty_name: 'Not In Array/List',
query: '$nin',
value_required: true,
render_type: 'TAG',
default_value: [],
sql_query: 'NOT IN',
},
is_required: {
pretty_name: 'Is required',
query: '$nin',
value_required: false,
default_value: [null, undefined, '', 0],
},
regex: {
pretty_name: 'Regex',
query: '$regex',
value_required: true,
default_value: null,
sql_query: 'LIKE',
},
should_exist: {
pretty_name: 'Should exist',
query: '$exists',
value_required: false,
default_value: true,
sql_query: 'IS NOT NULL',
},
should_not_exist: {
pretty_name: 'Should not exist',
query: '$exists',
value_required: false,
default_value: false,
sql_query: 'IS NULL',
},
};
exports.LOGICAL_OPERATORS = {
AND: '$and',
OR: '$or',
};
function transform(operator, condition) {
var _a;
var result = null;
var converter = function (conditionObj) {
var _a, _b, _c;
var field = conditionObj.field, relation = conditionObj.relation, value = conditionObj.value;
var relation_obj = exports.RELATIONAL_OPERATORS[relation];
var relation_str = {};
if (relation_obj.value_required) {
relation_str = (_a = {},
_a[relation_obj.query] = value,
_a);
}
else {
relation_str = (_b = {},
_b[relation_obj.query] = relation_obj.default_value,
_b);
}
return _c = {},
_c[field] = relation_str,
_c;
};
if (!operator) {
//single value
var validationObj = condition[0];
result = converter(validationObj);
}
else {
//multiple value, operator (whatOperator) is required
var requiredOperator = operator;
var logicalOperatorCondition = (_a = {},
_a[requiredOperator] = [],
_a);
for (var _i = 0, condition_1 = condition; _i < condition_1.length; _i++) {
var validationObj = condition_1[_i];
var convertedResult = validationObj.is_already_processed ? validationObj : converter(validationObj);
if (convertedResult.is_already_processed) {
delete convertedResult.is_already_processed;
}
logicalOperatorCondition[requiredOperator].push(convertedResult);
}
result = logicalOperatorCondition;
}
return result;
}