import { isObject, reduce, isArray } from 'lodash' import { RequestData } from './types' import { keysToSnakeCase } from './utils' export const transformRequestData = ({ fields, where, include, perPage = 100, ...restData }: Partial) => { return { ...flattenAttribute(fields, 'fields'), ...flattenAttribute(where, 'where'), ...keysToSnakeCase({ perPage, ...restData }), include: Array.isArray(include) ? include.join(',') : include, } } export function flattenAttribute< T extends Record, >(obj: T | undefined, key: keyof T) { if (!isObject(obj)) return { [key]: obj } return reduce( obj, (acc, value, attr) => { return { ...acc, ...buildQuery({ key: `${String(key)}[${attr}]`, value }), } }, {} ) } type QueryArgs = { key: string value: string | number | boolean | object | any[] } type QueryReturn = Record export function buildQuery({ key, value }: QueryArgs): QueryReturn { if (isArray(value)) return { [key]: value.join(',') } if (isObject(value)) { const keys = Object.keys(value) as Array return keys.reduce( (acc, subKey) => ({ ...acc, ...buildQuery({ key: `${key}[${subKey}]`, value: value[subKey] }), }), {} ) } return { [key]: value } }