2024-05-31 17:05:23 +07:00
|
|
|
import isEmpty from "lodash/isEmpty";
|
2024-05-30 18:06:50 +07:00
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-13 17:24:46 +07:00
|
|
|
|
|
|
|
|
|
2024-05-30 18:06:50 +07:00
|
|
|
export {
|
|
|
|
|
parseDataQueryFormString,
|
|
|
|
|
parseDataQueryFormObject,
|
|
|
|
|
getValueStringWithKey,
|
|
|
|
|
getValueStringWithKeyAndColon,
|
|
|
|
|
getInputValue,
|
|
|
|
|
DEFAULT_QUERY_DROP,
|
|
|
|
|
COLLECTION_QUERY_DROP,
|
|
|
|
|
COLLECTION_PAGING_QUERY_DROP
|
|
|
|
|
}
|