Presupuestador_web/client/src/lib/axios/createAxiosDataProvider.ts
2024-06-14 14:07:20 +02:00

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,
};
};