147 lines
3.6 KiB
TypeScript
147 lines
3.6 KiB
TypeScript
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<DataProvider>,
|
|
"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;
|