add boolean parsing to queryParser

This commit is contained in:
2025-05-01 14:36:03 +05:30
parent 6d7e1c9f0b
commit 57249b6c93

View File

@@ -1,7 +1,7 @@
import mongoose from "mongoose";
import mongoose from 'mongoose';
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) {
@@ -14,6 +14,10 @@ function convertValue(value: any) {
return parseInt(value);
} else if (!isNaN(Date.parse(value))) {
return new Date(value);
} else if (value === 'true') {
return true;
} else if (value === 'false') {
return false;
} else {
return value;
}
@@ -22,25 +26,25 @@ function convertValue(value: any) {
export function parse(query: string, validFields: Array<string>): ParsedQuery {
const result = [];
let currentStage = "field";
let token = "";
let field = "";
let op = "";
let value = "";
let currentStage = 'field';
let token = '';
let field = '';
let op = '';
let value = '';
let valueArr = [];
for (let i = 0; i < query.length; i++) {
let char = query[i];
if (currentStage === "field") {
if (char === "=" || char === "!") {
if (currentStage === 'field') {
if (char === '=' || char === '!') {
field = token;
token = "";
currentStage = "value";
token = '';
currentStage = 'value';
if (char === "=") {
op = "$eq";
if (char === '=') {
op = '$eq';
} else {
op = "$ne";
op = '$ne';
i++;
}
@@ -50,23 +54,23 @@ export function parse(query: string, validFields: Array<string>): ParsedQuery {
token += char;
}
if (currentStage === "value") {
if (char === "[") {
currentStage = "valueArr";
if (currentStage === 'value') {
if (char === '[') {
currentStage = 'valueArr';
continue;
}
if (char === "," || i == query.length - 1) {
if (char === ',' || i == query.length - 1) {
if (i == query.length - 1) token += char;
value = token;
result.push({ [field]: { [op]: convertValue(value) } });
token = "";
field = "";
op = "";
token = '';
field = '';
op = '';
currentStage = "field";
currentStage = 'field';
continue;
}
@@ -74,25 +78,25 @@ export function parse(query: string, validFields: Array<string>): ParsedQuery {
token += char;
}
if (currentStage === "valueArr") {
if (char === ",") {
if (currentStage === 'valueArr') {
if (char === ',') {
valueArr.push(convertValue(token));
token = "";
token = '';
continue;
}
if (char === "]") {
if (char === ']') {
valueArr.push(convertValue(token));
result.push({
[field]: { [op === "$eq" ? "$in" : "$nin"]: valueArr },
[field]: { [op === '$eq' ? '$in' : '$nin']: valueArr },
});
token = "";
field = "";
op = "";
token = '';
field = '';
op = '';
valueArr = [];
currentStage = "field";
currentStage = 'field';
i++;
continue;
@@ -102,5 +106,6 @@ export function parse(query: string, validFields: Array<string>): ParsedQuery {
}
}
console.log(result);
return result;
}