import { AxiosPromise, AxiosRequestConfig } from 'axios'; import { requests } from '@freepi/core'; const { post, get } = requests; // Makes all properties of any type passed to it optional // using for query parameters since should be dynamic and do not require all properties type IParam = { [Property in keyof Type]?: Type[Property]; }; export const getById = (path: string) => (baseURL: string) => ( id: number | string, ): AxiosPromise => { return get(`${baseURL}${path}/${id}`); }; export const findNested = (baseURL: string) => ( ...urlSegments: any ) => (params?: IParam): AxiosPromise => { const pathString = urlSegments.join('/'); return get(`${baseURL}/${pathString}`, params); }; export const findAll = (path: string) => ( baseURL: string, ) => (): AxiosPromise => { return get(`${baseURL}${path}/`); }; export const find = (path: string) => (baseURL: string) => ( params: IParam, ): AxiosPromise => { return get(`${baseURL}${path}`, { params }); }; export const create = (path: string) => (baseURL: string) => ( data: T, ): AxiosPromise => { return post(`${baseURL}${path}`, { data }); }; export const createNested = (path: string) => ( baseURL: string, ) => (nestedPath: string) => ( id: number | string, data: T, ): AxiosPromise => { return post(`${baseURL}${path}/${id}${nestedPath}`, { data }); }; export const getBaseFunctions = (path: string) => ({ url, }: AxiosRequestConfig) => { return { find: find(path)(url), findAll: findAll(path)(url), getById: getById(path)(url), create: create(path)(url), findNested: findNested(url), }; };