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< 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;
} }