@cloud-ru/ft-request-payload-transform
Version:
92 lines (91 loc) • 3.11 kB
JavaScript
import { EXTRACT_VALUES_REG, PARAM_KEYS } from './constants';
export * from './types';
import { isPaginationKey, isValueNotEmpty, parseStringToValue, removeEmptyValuesFromObject, stringifyRequestParams, } from './helpers';
export function createRequestPayload(params) {
const result = params || {};
function toObject() {
return removeEmptyValuesFromObject(result);
}
function toString({ encode } = { encode: true }) {
return stringifyRequestParams(toObject(), { encode });
}
if (params !== undefined) {
return {
toObject,
toString,
};
}
return {
filter(params) {
if (!result.filter) {
result.filter = [];
}
result.filter.push(params);
return this;
},
ordering(params) {
if (!result.ordering) {
result.ordering = [];
}
result.ordering.push(params);
return this;
},
pagination(params) {
result.pagination = params;
return this;
},
search(value) {
result.search = value;
return this;
},
toObject,
toString,
};
}
export function parseQueryParamsString(params) {
if (!params.length)
return undefined;
const paramsArray = decodeURIComponent(params).split('&');
const result = paramsArray.reduce((acc, cur) => {
const [param, value] = cur.split('=');
if (isValueNotEmpty(value)) {
if (param === PARAM_KEYS.ordering) {
const arrayValue = value.replace(/[[\]]/g, '').split(',');
if (arrayValue.length) {
acc[param] = arrayValue.map(ordering => {
const direction = ordering.startsWith('-') ? '-' : '+';
const field = ordering.replace(direction, '');
return {
field,
direction: direction,
};
});
}
return acc;
}
if (param === PARAM_KEYS.filter) {
const matches = Array.from(value.matchAll(EXTRACT_VALUES_REG), ([, f, c, v]) => [f, c, v]);
if (matches.length) {
acc[param] = matches
.map(([field, condition, value]) => ({
field,
condition: condition,
value: parseStringToValue(value),
}))
.filter(({ value }) => value !== undefined);
}
return acc;
}
if (isPaginationKey(param)) {
if (!acc.pagination) {
acc.pagination = {};
}
acc.pagination[param] = parseStringToValue(value);
return acc;
}
acc[param] = parseStringToValue(value);
}
return acc;
}, {});
return result;
}