309 lines
7.8 KiB
TypeScript
309 lines
7.8 KiB
TypeScript
import { IListResponse_DTO, INITIAL_PAGE_INDEX, INITIAL_PAGE_SIZE } from "@shared/contexts";
|
|
import {
|
|
ICreateOneDataProviderParams,
|
|
IDataSource,
|
|
IFilterItemDataProviderParam,
|
|
IGetListDataProviderParams,
|
|
IGetOneDataProviderParams,
|
|
IPaginationDataProviderParam,
|
|
IRemoveOneDataProviderParams,
|
|
ISortItemDataProviderParam,
|
|
IUpdateOneDataProviderParams,
|
|
} from "../hooks/useDataSource/DataSource";
|
|
import { createAxiosInstance } from "./axiosInstance";
|
|
|
|
export const createAxiosDataProvider = (
|
|
apiUrl: string,
|
|
httpClient = createAxiosInstance()
|
|
): IDataSource => ({
|
|
name: () => "AxiosDataProvider",
|
|
|
|
getList: async <R>(params: IGetListDataProviderParams): Promise<IListResponse_DTO<R>> => {
|
|
const { resource, quickSearchTerm, pagination, filters, sort } = params;
|
|
|
|
const url = `${apiUrl}/${resource}`;
|
|
const urlParams = new URLSearchParams();
|
|
|
|
const queryPagination = extractPaginationParams(pagination);
|
|
urlParams.append("page", String(queryPagination.page));
|
|
urlParams.append("limit", String(queryPagination.limit));
|
|
|
|
const generatedSort = extractSortParams(sort);
|
|
if (generatedSort && generatedSort.length > 0) {
|
|
urlParams.append("$sort_by", generatedSort.join(","));
|
|
}
|
|
|
|
const queryQuickSearch = quickSearchTerm || generateQuickSearch(filters);
|
|
if (queryQuickSearch) {
|
|
urlParams.append("q", queryQuickSearch);
|
|
}
|
|
|
|
const queryFilters = extractFilterParams(filters);
|
|
if (queryFilters && queryFilters.length > 0) {
|
|
urlParams.append("$filters", queryFilters.join(","));
|
|
}
|
|
|
|
const response = await httpClient.request<IListResponse_DTO<R>>({
|
|
url: `${url}?${urlParams.toString()}`,
|
|
method: "GET",
|
|
});
|
|
|
|
return response.data;
|
|
},
|
|
|
|
getOne: async <R>(params: IGetOneDataProviderParams): Promise<R> => {
|
|
const { resource, id } = params;
|
|
|
|
const response = await httpClient.request<R>({
|
|
url: `${apiUrl}/${resource}/${id}`,
|
|
method: "GET",
|
|
});
|
|
|
|
return response.data;
|
|
},
|
|
|
|
/*saveOne: async <P, R>(params: ISaveOneDataProviderParams<P>): Promise<R> => {
|
|
const { resource, data, id } = params;
|
|
|
|
console.log(params);
|
|
|
|
const result = await httpClient.request<R>({
|
|
url: `${apiUrl}/${resource}/${id}`,
|
|
method: "PUT",
|
|
data,
|
|
});
|
|
|
|
return result.data;
|
|
},*/
|
|
|
|
createOne: async <P, R>(params: ICreateOneDataProviderParams<P>): Promise<R> => {
|
|
const { resource, data } = params;
|
|
|
|
const response = await httpClient.request<R>({
|
|
url: `${apiUrl}/${resource}`,
|
|
method: "POST",
|
|
data,
|
|
});
|
|
|
|
return response.data;
|
|
},
|
|
|
|
updateOne: async <P, R>(params: IUpdateOneDataProviderParams<P>): Promise<R> => {
|
|
const { resource, data, id } = params;
|
|
|
|
const response = await httpClient.request<R>({
|
|
url: `${apiUrl}/${resource}/${id}`,
|
|
method: "PUT",
|
|
data,
|
|
});
|
|
|
|
return response.data;
|
|
},
|
|
|
|
removeOne: async <R>(params: IRemoveOneDataProviderParams) => {
|
|
const { resource, id } = params;
|
|
|
|
await httpClient.request<R>({
|
|
url: `${apiUrl}/${resource}/${id}`,
|
|
method: "DELETE",
|
|
});
|
|
|
|
return;
|
|
},
|
|
|
|
/*getMany: async ({ resource }) => {
|
|
const { body } = await httpClient.request({
|
|
url: `${apiUrl}/${resource}`,
|
|
method: "GET",
|
|
//...defaultRequestConfig,
|
|
});
|
|
|
|
return body;
|
|
},*/
|
|
|
|
/*create: async ({ resource, values }) => {
|
|
const url = `${apiUrl}/${resource}`;
|
|
|
|
const { body } = await httpClient.post(url, values, defaultRequestConfig);
|
|
|
|
return body;
|
|
},*/
|
|
|
|
/*createMany: async ({ resource, values }) => {
|
|
const response = await Promise.all(
|
|
values.map(async (param) => {
|
|
const { body } = await httpClient.post(
|
|
`${apiUrl}/${resource}`,
|
|
param
|
|
//defaultRequestConfig,
|
|
);
|
|
return body;
|
|
})
|
|
);
|
|
|
|
return response;
|
|
},*/
|
|
|
|
/*update: async ({ resource, id, values }) => {
|
|
const url = `${apiUrl}/${resource}/${id}`;
|
|
const { body } = await httpClient.patch(url, values, defaultRequestConfig);
|
|
return body;
|
|
},*/
|
|
|
|
/*updateMany: async ({ resource, ids, values }) => {
|
|
const response = await Promise.all(
|
|
ids.map(async (id) => {
|
|
const { body } = await httpClient.patch(
|
|
`${apiUrl}/${resource}/${id}`,
|
|
values
|
|
//defaultRequestConfig,
|
|
);
|
|
return body;
|
|
})
|
|
);
|
|
|
|
return response;
|
|
},*/
|
|
|
|
// removeMany: async ({ resource, ids }) => {
|
|
// const url = `${apiUrl}/${resource}/bulk-delete`;
|
|
|
|
// const { body } = await httpClient.request({
|
|
// url,
|
|
// method: "PATCH",
|
|
// data: {
|
|
// ids,
|
|
// },
|
|
// //defaultRequestConfig,
|
|
// });
|
|
|
|
// return body;
|
|
// },
|
|
|
|
// upload: async ({ resource, file, onUploadProgress }) => {
|
|
// const url = `${apiUrl}/${resource}`;
|
|
// const options = {
|
|
// //...defaultRequestConfig,
|
|
// onUploadProgress,
|
|
// headers: {
|
|
// //...defaultRequestConfig.headers,
|
|
// "Content-Type": "multipart/form-data",
|
|
// },
|
|
// };
|
|
|
|
// const formData = new FormData();
|
|
// formData.append("file", file);
|
|
|
|
// const { body } = await httpClient.post(url, formData, options);
|
|
// return body;
|
|
// },
|
|
|
|
/*uploadMany: async ({ resource, values }) => {
|
|
const url = `${apiUrl}/${resource}`;
|
|
const options = {
|
|
//...defaultRequestConfig,
|
|
headers: {
|
|
...defaultRequestConfig.headers,
|
|
'Content-Type': 'multipart/form-data'
|
|
}
|
|
};
|
|
|
|
const response = await Promise.all(
|
|
values.map(async (value) => {
|
|
const { body } = await httpClient.post(
|
|
url,
|
|
value,
|
|
options
|
|
);
|
|
return body;
|
|
}),
|
|
);
|
|
|
|
return response;
|
|
},*/
|
|
|
|
/*custom: async ({ url, method, filters, sort, payload, query, headers }) => {
|
|
let requestUrl = `${url}?`;
|
|
|
|
if (sort) {
|
|
const generatedSort = extractSortParams(sort);
|
|
if (generatedSort) {
|
|
const { _sort, _order } = generatedSort;
|
|
const sortQuery = {
|
|
_sort: _sort.join(","),
|
|
_order: _order.join(","),
|
|
};
|
|
requestUrl = `${requestUrl}&${queryString.stringify(sortQuery)}`;
|
|
}
|
|
}
|
|
|
|
if (filters) {
|
|
const filterQuery = extractFilterParams(filters);
|
|
requestUrl = `${requestUrl}&${queryString.stringify(filterQuery)}`;
|
|
}
|
|
|
|
if (query) {
|
|
requestUrl = `${requestUrl}&${queryString.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 "remove":
|
|
axiosResponse = await httpClient.delete(url);
|
|
break;
|
|
default:
|
|
axiosResponse = await httpClient.get(requestUrl);
|
|
break;
|
|
}
|
|
|
|
const { data } = axiosResponse;
|
|
|
|
return Promise.resolve({ data });
|
|
},*/
|
|
});
|
|
|
|
const extractSortParams = (sort: ISortItemDataProviderParam[] = []) =>
|
|
sort.map((item) => `${item.order === "DESC" ? "-" : "+"}${item.field}`);
|
|
|
|
const extractFilterParams = (filters?: IFilterItemDataProviderParam[]): string[] => {
|
|
let queryFilters: string[] = [];
|
|
if (filters) {
|
|
queryFilters = filters
|
|
.filter((item) => item.field !== "q")
|
|
.map(({ field, operator, value }) => `${field}[${operator}]${value}`);
|
|
}
|
|
return queryFilters;
|
|
};
|
|
|
|
const generateQuickSearch = (filters?: IFilterItemDataProviderParam[]): string | undefined => {
|
|
let quickSearch: string | undefined = undefined;
|
|
if (filters) {
|
|
const qsArray = filters.filter((item) => item.field === "q");
|
|
if (qsArray.length > 0) {
|
|
quickSearch = qsArray[0].value;
|
|
}
|
|
}
|
|
return quickSearch;
|
|
};
|
|
|
|
const extractPaginationParams = (pagination?: IPaginationDataProviderParam) => {
|
|
const { pageIndex = INITIAL_PAGE_INDEX, pageSize = INITIAL_PAGE_SIZE } = pagination || {};
|
|
|
|
return {
|
|
page: pageIndex,
|
|
limit: pageSize,
|
|
};
|
|
};
|