add boolean parsing to queryParser
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import mongoose from "mongoose";
|
import mongoose from 'mongoose';
|
||||||
|
|
||||||
type ParsedQuery = Array<
|
type ParsedQuery = Array<
|
||||||
Record<string, Record<"$eq" | "$ne" | "$in" | "$nin", string | Date | Object>>
|
Record<string, Record<'$eq' | '$ne' | '$in' | '$nin', string | Date | Object>>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
function convertValue(value: any) {
|
function convertValue(value: any) {
|
||||||
@@ -14,6 +14,10 @@ function convertValue(value: any) {
|
|||||||
return parseInt(value);
|
return parseInt(value);
|
||||||
} else if (!isNaN(Date.parse(value))) {
|
} else if (!isNaN(Date.parse(value))) {
|
||||||
return new Date(value);
|
return new Date(value);
|
||||||
|
} else if (value === 'true') {
|
||||||
|
return true;
|
||||||
|
} else if (value === 'false') {
|
||||||
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@@ -22,25 +26,25 @@ function convertValue(value: any) {
|
|||||||
export function parse(query: string, validFields: Array<string>): ParsedQuery {
|
export function parse(query: string, validFields: Array<string>): ParsedQuery {
|
||||||
const result = [];
|
const result = [];
|
||||||
|
|
||||||
let currentStage = "field";
|
let currentStage = 'field';
|
||||||
let token = "";
|
let token = '';
|
||||||
let field = "";
|
let field = '';
|
||||||
let op = "";
|
let op = '';
|
||||||
let value = "";
|
let value = '';
|
||||||
let valueArr = [];
|
let valueArr = [];
|
||||||
for (let i = 0; i < query.length; i++) {
|
for (let i = 0; i < query.length; i++) {
|
||||||
let char = query[i];
|
let char = query[i];
|
||||||
|
|
||||||
if (currentStage === "field") {
|
if (currentStage === 'field') {
|
||||||
if (char === "=" || char === "!") {
|
if (char === '=' || char === '!') {
|
||||||
field = token;
|
field = token;
|
||||||
token = "";
|
token = '';
|
||||||
currentStage = "value";
|
currentStage = 'value';
|
||||||
|
|
||||||
if (char === "=") {
|
if (char === '=') {
|
||||||
op = "$eq";
|
op = '$eq';
|
||||||
} else {
|
} else {
|
||||||
op = "$ne";
|
op = '$ne';
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,23 +54,23 @@ export function parse(query: string, validFields: Array<string>): ParsedQuery {
|
|||||||
token += char;
|
token += char;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentStage === "value") {
|
if (currentStage === 'value') {
|
||||||
if (char === "[") {
|
if (char === '[') {
|
||||||
currentStage = "valueArr";
|
currentStage = 'valueArr';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (char === "," || i == query.length - 1) {
|
if (char === ',' || i == query.length - 1) {
|
||||||
if (i == query.length - 1) token += char;
|
if (i == query.length - 1) token += char;
|
||||||
|
|
||||||
value = token;
|
value = token;
|
||||||
result.push({ [field]: { [op]: convertValue(value) } });
|
result.push({ [field]: { [op]: convertValue(value) } });
|
||||||
|
|
||||||
token = "";
|
token = '';
|
||||||
field = "";
|
field = '';
|
||||||
op = "";
|
op = '';
|
||||||
|
|
||||||
currentStage = "field";
|
currentStage = 'field';
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -74,25 +78,25 @@ export function parse(query: string, validFields: Array<string>): ParsedQuery {
|
|||||||
token += char;
|
token += char;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentStage === "valueArr") {
|
if (currentStage === 'valueArr') {
|
||||||
if (char === ",") {
|
if (char === ',') {
|
||||||
valueArr.push(convertValue(token));
|
valueArr.push(convertValue(token));
|
||||||
token = "";
|
token = '';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (char === "]") {
|
if (char === ']') {
|
||||||
valueArr.push(convertValue(token));
|
valueArr.push(convertValue(token));
|
||||||
result.push({
|
result.push({
|
||||||
[field]: { [op === "$eq" ? "$in" : "$nin"]: valueArr },
|
[field]: { [op === '$eq' ? '$in' : '$nin']: valueArr },
|
||||||
});
|
});
|
||||||
|
|
||||||
token = "";
|
token = '';
|
||||||
field = "";
|
field = '';
|
||||||
op = "";
|
op = '';
|
||||||
valueArr = [];
|
valueArr = [];
|
||||||
|
|
||||||
currentStage = "field";
|
currentStage = 'field';
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
@@ -102,5 +106,6 @@ export function parse(query: string, validFields: Array<string>): ParsedQuery {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user