UNPKG

@cloud-ru/ft-request-payload-transform

Version:
92 lines (91 loc) 3.11 kB
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; }