import { AxiosInstance } from "axios"; import { stringify } from "query-string"; import { DataProvider } from "@refinedev/core"; import { axiosInstance } from "@refinedev/simple-rest"; type MethodTypes = "get" | "delete" | "head" | "options"; type MethodTypesWithBody = "post" | "put" | "patch"; const dataProvider = ( apiUrl: string, httpClient: AxiosInstance = axiosInstance, ): Omit< Required, "createMany" | "updateMany" | "deleteMany" > => ({ getList: async ({ resource, meta }) => { const url = `${apiUrl}/${resource}`; const { headers: headersFromMeta, method, queryParams } = meta ?? {}; const requestMethod = (method as MethodTypes) ?? "get"; const { data } = await httpClient[requestMethod]( `${url}`, { headers: headersFromMeta, params: queryParams, }, ); return { data, total: data.length, }; }, getMany: async () => { throw new Error("getMany not implemented"); }, create: async ({ resource, variables, meta }) => { const url = `${apiUrl}/${resource}`; const { headers, method } = meta ?? {}; const requestMethod = (method as MethodTypesWithBody) ?? "post"; const { data } = await httpClient[requestMethod](url, variables, { headers, }); return { data, }; }, update: async ({ resource, id, variables, meta }) => { const url = `${apiUrl}/${resource}/${id}`; const { headers, method } = meta ?? {}; const requestMethod = (method as MethodTypesWithBody) ?? "patch"; const { data } = await httpClient[requestMethod](url, variables, { headers, }); return { data, }; }, getOne: async ({ resource, id, meta }) => { const url = `${apiUrl}/${resource}/${id}`; const { headers, method } = meta ?? {}; const requestMethod = (method as MethodTypes) ?? "get"; const { data } = await httpClient[requestMethod](url, { headers }); return { data, }; }, deleteOne: async ({ resource, id, variables, meta }) => { const url = `${apiUrl}/${resource}/${id}`; const { headers, method } = meta ?? {}; const requestMethod = (method as MethodTypesWithBody) ?? "delete"; const { data } = await httpClient[requestMethod](url, { data: variables, headers, }); return { data, }; }, getApiUrl: () => { return apiUrl; }, custom: async ({ url, method, payload, query, headers, }) => { let requestUrl = `${url}?`; if (query) { requestUrl = `${requestUrl}&${stringify(query)}`; } if (headers) { httpClient.defaults.headers = { ...httpClient.defaults.headers, ...headers, }; } let axiosResponse; switch (method) { case "put": case "post": case "patch": axiosResponse = await httpClient[method](url, payload); break; case "delete": axiosResponse = await httpClient.delete(url, { data: payload, }); break; default: axiosResponse = await httpClient.get(requestUrl); break; } const { data } = axiosResponse; return Promise.resolve({ data }); }, }); export default dataProvider;