@fusionworks/ra-data-nest-crud
Version:
a data provider for react admin that handles request from nestjsx-crud server
163 lines (142 loc) • 4.45 kB
JavaScript
;
var crudRequest = require('@nestjsx/crud-request');
var reactAdmin = require('react-admin');
var index = (apiUrl, httpClient = reactAdmin.fetchUtils.fetchJson) => {
const composeFilter = (paramsFilter) => {
if (paramsFilter === '' || (typeof paramsFilter.q !== 'undefined' && paramsFilter.q === '')) {
paramsFilter = {};
}
const flatFilter = reactAdmin.fetchUtils.flattenObject(paramsFilter);
const filter = Object.keys(flatFilter).map(key => {
const splitKey = key.split('||');
const ops = splitKey[1] ? splitKey[1] : 'cont';
let field = splitKey[0];
if (field.indexOf('_') === 0 && field.indexOf('.') > -1) {
field = field.split(/\.(.+)/)[1];
}
return { field, operator: ops, value: flatFilter[key] };
});
return filter;
};
const convertDataRequestToHTTP = (type, resource, params) => {
let url = '';
const options = {};
switch (type) {
case reactAdmin.GET_LIST: {
const { page, perPage } = params.pagination;
const query = crudRequest.RequestQueryBuilder
.create({
filter: composeFilter(params.filter),
})
.setLimit(perPage)
.setPage(page)
.sortBy(params.sort)
.setOffset((page - 1) * perPage)
.query();
url = `${apiUrl}/${resource}?${query}`;
break;
}
case reactAdmin.GET_ONE: {
url = `${apiUrl}/${resource}/${params.id}`;
break;
}
case reactAdmin.GET_MANY: {
const query = crudRequest.RequestQueryBuilder
.create()
.setFilter({
field: 'id',
operator: crudRequest.CondOperator.IN,
value: `${params.ids}`,
})
.query();
url = `${apiUrl}/${resource}?${query}`;
break;
}
case reactAdmin.GET_MANY_REFERENCE: {
const { page, perPage } = params.pagination;
const filter = composeFilter(params.filter);
filter.push({
field: params.target,
operator: crudRequest.CondOperator.EQUALS,
value: params.id,
});
const query = crudRequest.RequestQueryBuilder
.create({
filter,
})
.sortBy(params.sort)
.setLimit(perPage)
.setOffset((page - 1) * perPage)
.query();
url = `${apiUrl}/${resource}?${query}`;
break;
}
case reactAdmin.UPDATE: {
url = `${apiUrl}/${resource}/${params.id}`;
options.method = 'PATCH';
options.body = JSON.stringify(params.data);
break;
}
case reactAdmin.CREATE: {
url = `${apiUrl}/${resource}`;
options.method = 'POST';
options.body = JSON.stringify(params.data);
break;
}
case reactAdmin.DELETE: {
url = `${apiUrl}/${resource}/${params.id}`;
options.method = 'DELETE';
break;
}
default:
throw new Error(`Unsupported fetch action type ${type}`);
}
return { url, options };
};
const convertHTTPResponse = (response, type, resource, params) => {
const { headers, json } = response;
switch (type) {
case reactAdmin.GET_LIST:
case reactAdmin.GET_MANY_REFERENCE:
return {
data: json.data,
total: json.total,
};
case reactAdmin.CREATE:
return { data: { ...params.data, id: json.id } };
default:
return { data: json };
}
};
return (type, resource, params) => {
if (type === reactAdmin.UPDATE_MANY) {
return Promise.all(
params.ids.map(id => httpClient(`${apiUrl}/${resource}/${id}`, {
method: 'PUT',
body: JSON.stringify(params.data),
})),
)
.then(responses => ({
data: responses.map(response => response.json),
}));
}
if (type === reactAdmin.DELETE_MANY) {
return Promise.all(
params.ids.map(id => httpClient(`${apiUrl}/${resource}/${id}`, {
method: 'DELETE',
})),
).then(responses => ({
data: responses.map(response => response.json),
}));
}
const { url, options } = convertDataRequestToHTTP(
type,
resource,
params,
);
return httpClient(url, options).then(
response => convertHTTPResponse(response, type, resource, params),
);
};
};
module.exports = index;