Convert presets preconditions to use expressions
This commit is contained in:
1 parent
152d8f5283
commit
edadfe54c8
7 files changed
+123
-174
No files matched your search
-129
@@ -216,135 +216,6 @@ export function test(params, query): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
function matchType(src, dst): string | number | boolean {
|
||||
const type = typeof src;
|
||||
if (type === "string") {
|
||||
return String(dst);
|
||||
} else if (type === "number") {
|
||||
if (+dst === parseFloat(dst)) return +dst;
|
||||
else if (!isNaN(Date.parse(dst))) return Date.parse(dst);
|
||||
} else if (type === "boolean") {
|
||||
const v = String(dst)
|
||||
.trim()
|
||||
.toLowerCase();
|
||||
if (v === "true" || v === "1") return true;
|
||||
else if (v === "false" || v === "0") return false;
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
export function testFilter(obj, filter): boolean {
|
||||
for (const [k, v] of Object.entries(filter)) {
|
||||
const [param, op] = k.split(/([^a-zA-Z0-9\-_.].*)/, 2);
|
||||
const val = matchType(obj[param], v);
|
||||
switch (op) {
|
||||
case "=":
|
||||
case undefined:
|
||||
if (obj[param] !== val) return false;
|
||||
break;
|
||||
case ">":
|
||||
if (!(obj[param] > val)) return false;
|
||||
break;
|
||||
case ">=":
|
||||
if (!(obj[param] >= val)) return false;
|
||||
break;
|
||||
case "<":
|
||||
if (!(obj[param] < val)) return false;
|
||||
break;
|
||||
case "<=":
|
||||
if (!(obj[param] <= val)) return false;
|
||||
break;
|
||||
case "!":
|
||||
if (obj[param] === val) return false;
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Unrecognized operator ${op}`);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
export function convertMongoQueryToFilters(query, filters = {}): {} {
|
||||
for (let [k, v] of Object.entries(query)) {
|
||||
if (k[0] === "$") {
|
||||
if (k === "$and")
|
||||
for (const vv of v as any[]) convertMongoQueryToFilters(vv, filters);
|
||||
else throw new Error(`Operator ${k} not supported`);
|
||||
} else if (k === "_tags") {
|
||||
if (common.typeOf(v) === common.OBJECT_TYPE) {
|
||||
for (let [kk, vv] of Object.entries(v)) {
|
||||
vv = vv.replace(/[^a-zA-Z0-9-]+/g, "_");
|
||||
if (kk === "$ne") filters[`Tags.${vv}!`] = true;
|
||||
else throw new Error(`Operator ${kk} not supported`);
|
||||
}
|
||||
} else {
|
||||
v = (v as string).replace(/[^a-zA-Z0-9-]+/g, "_");
|
||||
filters[`Tags.${v}`] = true;
|
||||
}
|
||||
} else {
|
||||
switch (k) {
|
||||
case "_id":
|
||||
k = "DeviceID.ID";
|
||||
break;
|
||||
case "_deviceId._Manufacturer":
|
||||
k = "DeviceID.Manufacturer";
|
||||
break;
|
||||
case "_deviceId._OUI":
|
||||
k = "DeviceID.OUI";
|
||||
break;
|
||||
case "_deviceId._ProductClass":
|
||||
k = "DeviceID.ProductClass";
|
||||
break;
|
||||
case "_deviceId._SerialNumber":
|
||||
k = "DeviceID.SerialNumber";
|
||||
break;
|
||||
case "_lastInform":
|
||||
k = "Events.Inform";
|
||||
break;
|
||||
case "_lastBootstrap":
|
||||
k = "Events.0_BOOTSTRAP";
|
||||
break;
|
||||
case "_lastBoot":
|
||||
k = "Events.1_BOOT";
|
||||
break;
|
||||
case "_registered":
|
||||
k = "Events.Registered";
|
||||
}
|
||||
|
||||
if (common.typeOf(v) === common.OBJECT_TYPE) {
|
||||
for (const [kk, vv] of Object.entries(v)) {
|
||||
switch (kk) {
|
||||
case "$eq":
|
||||
filters[k] = vv;
|
||||
break;
|
||||
case "$ne":
|
||||
filters[`${k}!`] = vv;
|
||||
break;
|
||||
case "$lt":
|
||||
filters[`${k}<`] = vv;
|
||||
break;
|
||||
case "$lte":
|
||||
filters[`${k}<=`] = vv;
|
||||
break;
|
||||
case "$gt":
|
||||
filters[`${k}>`] = vv;
|
||||
break;
|
||||
case "$gte":
|
||||
filters[`${k}>=`] = vv;
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Oprator ${kk} not supported`);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
filters[k] = v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return filters;
|
||||
}
|
||||
|
||||
export function sanitizeQueryTypes(query, types): {} {
|
||||
for (const [k, v] of Object.entries(query)) {
|
||||
if (k[0] === "$") {
|
||||
|
||||
Reference in new issue
Block a user