flexbiz-server
Version:
Flexible Server
15 lines (14 loc) • 7.09 kB
JavaScript
const ALLOWED_FIELDS={},BLOCKED_FIELDS="password secret_key token __v hash salt".split(" "),OPERATOR_MAP={eq:"$eq",ne:"$ne",gt:"$gt",gte:"$gte",lt:"$lt",lte:"$lte","in":"$in",nin:"$nin",contains:"$regex",regex:"$regex"},escapeRegex=$hasStartAnchor_text$$=>{if(typeof $hasStartAnchor_text$$!=="string")return $hasStartAnchor_text$$;var $escapedBody_pattern$$=$hasStartAnchor_text$$;let $hasEndAnchor$$=$hasStartAnchor_text$$=!1;$escapedBody_pattern$$.startsWith("^")&&($hasStartAnchor_text$$=!0,$escapedBody_pattern$$=
$escapedBody_pattern$$.substring(1));$escapedBody_pattern$$.endsWith("$")&&$escapedBody_pattern$$.length>0&&($hasEndAnchor$$=!0,$escapedBody_pattern$$=$escapedBody_pattern$$.substring(0,$escapedBody_pattern$$.length-1));$escapedBody_pattern$$=$escapedBody_pattern$$.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return($hasStartAnchor_text$$?"^":"")+$escapedBody_pattern$$+($hasEndAnchor$$?"$":"")},castValue=($value$$,$type$$)=>$type$$?$type$$==="number"?Number($value$$):$type$$==="date"?new Date($value$$):
$type$$==="boolean"?$value$$==="true"||$value$$===!0:$value$$:$value$$,tryMergeValues=($existingVal$$,$newVal$$)=>{if(typeof $existingVal$$==="object"&&$existingVal$$!==null&&!Array.isArray($existingVal$$)&&typeof $newVal$$==="object"&&$newVal$$!==null&&!Array.isArray($newVal$$)){const $existingKeys$$=Object.keys($existingVal$$);if(!Object.keys($newVal$$).some($k$$=>$existingKeys$$.includes($k$$)))return{...$existingVal$$,...$newVal$$}}return null},buildSearchQuery=$dbField_queryNode$$=>{if($dbField_queryNode$$.field){const {field:$field$$,
operator:$operator$$,value:$value$$}=$dbField_queryNode$$;$dbField_queryNode$$=$field$$;let $type$$=null;var $childConditions_config_isStrict_mongoOp$$=ALLOWED_FIELDS&&Object.keys(ALLOWED_FIELDS).length>0;if($field$$==="_id"||$field$$==="id")$dbField_queryNode$$="_id",$type$$="objectId";else if($childConditions_config_isStrict_mongoOp$$){$childConditions_config_isStrict_mongoOp$$=ALLOWED_FIELDS[$field$$];if(!$childConditions_config_isStrict_mongoOp$$)return null;$dbField_queryNode$$=$childConditions_config_isStrict_mongoOp$$.dbField;
$type$$=$childConditions_config_isStrict_mongoOp$$.type}else if(BLOCKED_FIELDS.includes($field$$))return null;$childConditions_config_isStrict_mongoOp$$=OPERATOR_MAP[$operator$$];if(!$childConditions_config_isStrict_mongoOp$$)return null;let $finalVal$$=$value$$;if($operator$$==="contains")return{[$dbField_queryNode$$]:{[$childConditions_config_isStrict_mongoOp$$]:new RegExp(escapeRegex(String($value$$)),"i")}};if($operator$$==="regex")return{[$dbField_queryNode$$]:{[$childConditions_config_isStrict_mongoOp$$]:new RegExp(String($value$$),
"i")}};if($operator$$==="in"||$operator$$==="nin"){const $arr$$=Array.isArray($value$$)?$value$$:[$value$$];$finalVal$$=$arr$$.map($v$$=>castValue($v$$,$type$$)).filter(($v$$,$i$$)=>$v$$!==null||$arr$$[$i$$]===null);return{[$dbField_queryNode$$]:{[$childConditions_config_isStrict_mongoOp$$]:$finalVal$$}}}$finalVal$$=castValue($value$$,$type$$);return $finalVal$$===null&&$type$$==="number"?null:$childConditions_config_isStrict_mongoOp$$==="$eq"?{[$dbField_queryNode$$]:$finalVal$$}:{[$dbField_queryNode$$]:{[$childConditions_config_isStrict_mongoOp$$]:$finalVal$$}}}if($dbField_queryNode$$.logic&&
Array.isArray($dbField_queryNode$$.filters)){$childConditions_config_isStrict_mongoOp$$=$dbField_queryNode$$.filters.map($childNode$$=>buildSearchQuery($childNode$$)).filter($cond$$=>$cond$$!==null&&Object.keys($cond$$).length>0);if($childConditions_config_isStrict_mongoOp$$.length===0)return{};if($dbField_queryNode$$.logic==="OR")return{$or:$childConditions_config_isStrict_mongoOp$$};const $finalQuery$$={},$conflictConditions$$=[];$childConditions_config_isStrict_mongoOp$$.forEach($cond$$=>{Object.keys($cond$$).forEach($key$$=>
{const $val$$=$cond$$[$key$$];if($key$$==="$and")Array.isArray($val$$)?$conflictConditions$$.push(...$val$$):$conflictConditions$$.push({[$key$$]:$val$$});else if($key$$.startsWith("$"))$conflictConditions$$.push({[$key$$]:$val$$});else if($finalQuery$$[$key$$]===void 0)$finalQuery$$[$key$$]=$val$$;else{const $mergedVal$$=tryMergeValues($finalQuery$$[$key$$],$val$$);$mergedVal$$?$finalQuery$$[$key$$]=$mergedVal$$:($conflictConditions$$.push({[$key$$]:$finalQuery$$[$key$$]}),$conflictConditions$$.push({[$key$$]:$val$$}),
delete $finalQuery$$[$key$$])}})});if($conflictConditions$$.length>0){if(Object.keys($finalQuery$$).length===0)return $conflictConditions$$.length===1?$conflictConditions$$[0]:{$and:$conflictConditions$$};$conflictConditions$$.length===1&&$conflictConditions$$[0].$or&&$finalQuery$$.$or===void 0?$finalQuery$$.$or=$conflictConditions$$[0].$or:$finalQuery$$.$and=$conflictConditions$$}return $finalQuery$$}return{}};exports.buildSearchQuery=buildSearchQuery;const MONGO_TO_OP_MAP={};
Object.entries(OPERATOR_MAP).forEach(([$k$$,$v$$])=>MONGO_TO_OP_MAP[$v$$]=$k$$);const MAX_DEPTH=5,IS_STRICT_MODE=ALLOWED_FIELDS&&Object.keys(ALLOWED_FIELDS).length>0;let GLOBAL_ALIAS_MAP=null;IS_STRICT_MODE&&(GLOBAL_ALIAS_MAP={},Object.entries(ALLOWED_FIELDS).forEach(([$alias$$,$config$$])=>{GLOBAL_ALIAS_MAP[$config$$.dbField]=$alias$$}));
const isOperatorObject=$val$$=>!$val$$||typeof $val$$!=="object"||$val$$ instanceof Date||Array.isArray($val$$)||$val$$._bsontype==="ObjectID"||$val$$.toString&&$val$$.toString().match(/^[0-9a-fA-F]{24}$/)?!1:Object.keys($val$$).some($k$$=>$k$$.startsWith("$")),convertLegacyQuery=($mongoQuery$$,$currentDepth$$=0)=>{if($currentDepth$$>MAX_DEPTH)return Logger.warn("[Convert] \u26a0\ufe0f Max depth exceeded"),null;const $group$$={logic:"AND",filters:[]};if(!$mongoQuery$$||typeof $mongoQuery$$!=="object")return $group$$;
Object.keys($mongoQuery$$).forEach($key$$=>{if(!["__proto__","constructor","prototype"].includes($key$$)){var $value$$=$mongoQuery$$[$key$$];if($key$$==="$or"||$key$$==="$and"){if(Array.isArray($value$$)){var $subGroup$$={logic:$key$$==="$or"?"OR":"AND",filters:[]};$value$$.forEach($convertedChild_subQuery$$=>{($convertedChild_subQuery$$=convertLegacyQuery($convertedChild_subQuery$$,$currentDepth$$+1))&&$convertedChild_subQuery$$.filters.length>0&&$subGroup$$.filters.push($convertedChild_subQuery$$)});
$subGroup$$.filters.length>0&&$group$$.filters.push($subGroup$$)}}else if(!$key$$.startsWith("$")){var $aliasField$$=$key$$,$isAllowed$$=!1;$key$$==="_id"||$key$$==="id"?($aliasField$$="_id",$isAllowed$$=!0):IS_STRICT_MODE?GLOBAL_ALIAS_MAP[$key$$]&&($aliasField$$=GLOBAL_ALIAS_MAP[$key$$],$isAllowed$$=!0):BLOCKED_FIELDS.includes($key$$)||($isAllowed$$=!0);$isAllowed$$&&(isOperatorObject($value$$)?Object.keys($value$$).forEach($mongoOp$$=>{if(!["__proto__","constructor"].includes($mongoOp$$)){var $newOp$$=
MONGO_TO_OP_MAP[$mongoOp$$],$val$$=$value$$[$mongoOp$$];$mongoOp$$==="$regex"&&($val$$ instanceof RegExp&&($val$$=$val$$.source),$newOp$$="contains");$mongoOp$$!=="$options"&&$newOp$$&&$group$$.filters.push({field:$aliasField$$,operator:$newOp$$,value:$val$$})}}):$group$$.filters.push({field:$aliasField$$,operator:"eq",value:$value$$}))}}});return $group$$};exports.convertLegacyQuery=convertLegacyQuery;