Files
NSG_PORTAL_V2/utils/parseSQL.ts
T
2024-07-01 14:51:57 +07:00

245 lines
7.9 KiB
TypeScript

import { isEmpty } from "@/utils/lodash";
const keyMapping = {
// 3 query key để phân loại
Sql: 'Sql',
Uri: 'Uri',
Get: 'Get',
Key: 'Key',
Method: 'Method',
Params: 'Params',
Headers: 'Headers',
Content: 'Content',
Top: 'Top',
Page: 'Page',
With: 'With',
Sort: 'Sort',
TTL: 'TTL',
Ids: 'Ids'
};
const SQL_MODEL = {
Get: "",
Top: 1,
Page: 0,
With: [],
Sort: [],
TTL: "",
Key: "",
Ids: [],
}
const REQUEST_MODEL = {
TTL: "",
Key: "",
Uri: "",
Method: "Get",
Params: [],
Headers: [],
Content: [],
};
const CUSTOM_MODEL = {
TTL: "",
Key: "",
Sql: "",
};
const regexParseString = (key: String) => {
const pattern = `${key}\\[(.*?)\\]`;
return new RegExp(pattern);
}
const regexParseStringColon = (key: String, suffix: string = ']') => {
const pattern = `${key}:\\s*([^;\\]]+)`;
return new RegExp(pattern);
}
const getObjectWithModel = (model: any, queryString: string) => {
let resultObject: any = {};
for (let [key] of Object.entries(model)) {
let resultValue: any = null;
const matchValue = queryString.match(regexParseString(key)) || '';
let currentMatchValue: any = matchValue && matchValue[1];
if (key === keyMapping.With) {
const splitArrWithSemi = currentMatchValue.split(';').length > 0 ? currentMatchValue.split(';') : [currentMatchValue];
resultValue = splitArrWithSemi.map((_: any) => {
const parseColon = _.split(':');
return {
key: parseColon[0],
value: parseColon[1],
}
}).filter((item: any) => item.value);
} else if (key === keyMapping.Sort) {
const splitArrWithComma = currentMatchValue.split(',').length > 0 ? currentMatchValue.split(',') : [currentMatchValue];
resultValue = splitArrWithComma.map((_: any) => {
const isPlus = _.includes('+')
const isMinus = _.includes('-')
const key = _.replaceAll('-', '').replaceAll('+', '');
return {
key,
value: isPlus ? '+' : isMinus ? '-' : ''
}
}).filter((item: any) => item.value);
}
else if ([keyMapping.Content, keyMapping.Headers, keyMapping.Params].includes(key)) {
if(currentMatchValue) {
const parsedObject = JSON.parse(currentMatchValue);
resultValue = Object.entries(parsedObject).map(([key, value]) => ({ key, value }));
}
}
else {
resultValue = currentMatchValue;
}
resultObject = {
...resultObject,
[key]: resultValue
}
}
return resultObject;
}
const ArrayToString = (array: any, key: string, prefix: string, suffix: string) => {
if (!Array.isArray(array) || array.length === 0) {
return '';
}
const toString = array.filter((item: any) => item.value).reduce((accumulator: any, currentObject: any, index: number) => {
const parseString = currentObject.key + prefix + currentObject.value;
return index === 0 ? accumulator + parseString : accumulator + suffix + parseString;
}, "")
return key + "[" + toString + "]";
}
const parseDataQueryFormString = (command: string) => {
if (isEmpty(command)) return null;
let resultObject: any = null;
let typeQuery: any = null;
if (command.includes(keyMapping.Sql)) {
typeQuery = keyMapping.Sql
} else if (command.includes(keyMapping.Uri)) {
typeQuery = keyMapping.Uri
} else if (command.includes(keyMapping.Get)) {
typeQuery = keyMapping.Get
}
if (!typeQuery) return null;
switch (typeQuery) {
case keyMapping.Sql:
resultObject = Object.assign(CUSTOM_MODEL, getObjectWithModel(CUSTOM_MODEL, command));
break;
case keyMapping.Uri:
resultObject = Object.assign(REQUEST_MODEL, getObjectWithModel(REQUEST_MODEL, command));
break;
case keyMapping.Get:
resultObject = Object.assign(SQL_MODEL, getObjectWithModel(SQL_MODEL, command));
break;
default:
resultObject = {};
}
return {
typeQuery,
value: resultObject
}
}
const parseDataQueryFormObject = (command: any) => {
const resultString = Object.entries(command).reduce((accumulator, [key, value]) => {
if (!value) return accumulator;
let parseString: string = '';
if (key === keyMapping.With) {
parseString = ArrayToString(value, key, ':', ';');
} else if (key === keyMapping.Sort) {
parseString = ArrayToString(value, key, '', ',');
} else if ([keyMapping.Content, keyMapping.Headers, keyMapping.Params].includes(key)) {
const reduceArrayToObject = value.reduce((acc: any, { key, value }: any) => {
acc[key.trim()] = value.trim();
return acc;
}, {});
const formattedValue = Object.keys(reduceArrayToObject).length ? JSON.stringify(reduceArrayToObject) : "";
parseString = formattedValue ? `${key}[${formattedValue}]` : ""
}
else {
if (typeof value === "string") {
value = value.trim();
} else {
value = value < 0 ? 0 : value;
}
if(value) parseString = key + "[" + value + "]"
}
return parseString ? accumulator + " " + parseString : accumulator;
}, "");
return resultString;
}
const DEFAULT_QUERY_DROP = (key: string, id: any, TTL?: String) => {
return `Get[${key}] With[Id:${id}]${TTL ? ` TTL[${TTL}]` : ''}`;
}
const COLLECTION_QUERY_DROP = (key: string, ids: any, TTL?: String) => {
let arraySplit : any = null;
try {
arraySplit = ids.split(',');
} catch {
arraySplit = 1;
}
return `Get[${key}]${`${arraySplit && arraySplit.length > 0 ? ` Top[${arraySplit?.length}]` : ` Top[1]`}`} With[Ids:${ids.toString()}]${TTL ? ` TTL[${TTL}]` : ''}`;
}
const COLLECTION_PAGING_QUERY_DROP = (key: string, params: { key: string; value: any; }, TTL?: string) => {
return `Get[${key}] Top[20] With[${params.key}:${params.value}]${TTL ? ` TTL[${TTL}]` : ''}`;
};
const getValueStringWithKey = (queryString: string, key: string = keyMapping.Ids) => {
const matchValue = queryString.match(regexParseString(key)) || '';
let currentMatchValue : any = matchValue && matchValue[1];
return currentMatchValue;
}
const getValueStringWithKeyAndColon = (queryString: string, key: string = keyMapping.Ids) => {
const matchValue = queryString.match(regexParseStringColon(key)) || '';
let currentMatchValue : any = matchValue && matchValue[1];
return currentMatchValue;
}
const getInputValue = (inputValue: any, typeGet: 'OBJECT' | 'ARRAY') => {
if (!inputValue) return null;
let _inputValue : any = null;
try {
_inputValue = JSON.parse(inputValue)
} catch {
_inputValue = inputValue
}
let typeOfInputValue : any = null;
if (Array.isArray(_inputValue)) {
typeOfInputValue = 'ARRAY';
} else if (typeof _inputValue === 'object' && _inputValue !== null) {
typeOfInputValue = 'OBJECT';
} else {
typeOfInputValue = null;
}
if (typeGet === 'OBJECT') {
if (typeOfInputValue === 'OBJECT') return _inputValue;
if (typeOfInputValue === 'ARRAY') return _inputValue && _inputValue[0];
} else if (typeGet === 'ARRAY') {
if (typeOfInputValue === 'OBJECT') return [{..._inputValue}];
if (typeOfInputValue === 'ARRAY') return _inputValue;
}
}
export {
parseDataQueryFormString,
parseDataQueryFormObject,
getValueStringWithKey,
getValueStringWithKeyAndColon,
getInputValue,
DEFAULT_QUERY_DROP,
COLLECTION_QUERY_DROP,
COLLECTION_PAGING_QUERY_DROP
}