@minimaltech/ra-infra
Version:
Minimal Technology ReactJS Infrastructure
388 lines • 14.6 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
import { CoreBindings, RequestMethods, RequestTypes, } from '../../common';
import { DefaultNetworkRequestService } from '../../base/services';
import { getError } from '../../utilities';
import { inject } from '@loopback/context';
import omit from 'lodash/omit';
import { BaseProvider } from './base.provider';
let DefaultRestDataProvider = class DefaultRestDataProvider extends BaseProvider {
restDataProviderOptions;
networkService;
constructor(restDataProviderOptions) {
super();
this.restDataProviderOptions = restDataProviderOptions;
this.networkService = new DefaultNetworkRequestService({
name: 'default-application-network-service',
baseUrl: this.restDataProviderOptions.url,
noAuthPaths: this.restDataProviderOptions.noAuthPaths,
});
}
//---------------------------------------------------------------------------
getListHelper(opts) {
const { type, resource, queryKey, filter, requestProps } = opts;
const paths = [resource];
const response = this.networkService.doRequest({
type,
paths,
query: { ...queryKey, filter },
...requestProps,
});
return response;
}
// -------------------------------------------------------------
// GET_LIST
// -------------------------------------------------------------
getList(opts) {
const { resource, params } = opts;
const { pagination, sort, filter: filterGetList, meta, ...rest } = params;
let filter = {};
if (filterGetList?.where) {
filter = { ...filterGetList, where: filterGetList.where };
}
else {
filter['where'] = {
...omit(filterGetList, ['include', 'params', 'noLimit', 'fields']),
};
filter['include'] = filterGetList?.include;
filter['fields'] = filterGetList?.fields;
filter['params'] = filterGetList?.params;
filter['noLimit'] = filterGetList?.noLimit;
}
if (sort?.field) {
filter['order'] = [`${sort.field} ${sort.order}`];
}
// Remove default limit and skip in react-admin
if (filter?.noLimit) {
filter['limit'] = undefined;
filter['skip'] = undefined;
filter['offset'] = undefined;
filter['noLimit'] = undefined;
}
else {
const { page = 0, perPage = 0 } = pagination ?? {};
if (perPage >= 0) {
filter['limit'] = perPage;
}
if (perPage > 0 && page >= 0) {
filter['skip'] = (page - 1) * perPage;
filter['offset'] = (page - 1) * perPage;
}
}
for (const key in rest) {
if (!params[key]) {
continue;
}
filter[key] = params[key];
}
const queryKey = {};
if (filter?.params) {
for (const key in filter.params) {
queryKey[key] = filter.params[key];
}
filter['params'] = undefined;
}
if (meta) {
for (const key in meta) {
queryKey[key] = meta[key];
}
}
const request = this.networkService.getRequestProps({ resource });
const requestProps = {
method: RequestMethods.GET,
...request,
};
const response = this.getListHelper({
type: RequestTypes.GET_LIST,
resource,
queryKey,
filter,
requestProps,
});
return response;
}
// -------------------------------------------------------------
// GET_ONE
// -------------------------------------------------------------
getOne(opts) {
const { resource, params } = opts;
const request = this.networkService.getRequestProps({ resource });
const filter = params?.meta?.filter || {};
const queryKey = {};
if (filter?.params) {
for (const key in filter.params) {
queryKey[key] = filter.params[key];
}
}
const response = this.networkService.doRequest({
type: RequestTypes.GET_ONE,
method: RequestMethods.GET,
query: { ...queryKey, filter: { ...omit(filter, 'params') } },
paths: [resource, `${params.id}`],
...request,
});
return response;
}
// -------------------------------------------------------------
// GET_MANY
// -------------------------------------------------------------
getMany(opts) {
const { resource, params } = opts;
const request = this.networkService.getRequestProps({ resource });
const filter = params?.meta?.filter || {};
const queryKey = {};
if (filter?.params) {
for (const key in filter.params) {
queryKey[key] = filter.params[key];
}
}
const response = this.networkService.doRequest({
type: RequestTypes.GET_MANY,
method: RequestMethods.GET,
query: {
...queryKey,
filter: {
...omit(filter, 'params'),
where: { ...filter?.where, id: { inq: params.ids } },
},
},
paths: [resource],
...request,
});
return response;
}
// -------------------------------------------------------------
// GET_MANY_REFERENCE
// -------------------------------------------------------------
getManyReference(opts) {
const { resource, params } = opts;
const { pagination, sort, filter: filterGetMany, meta, target, id, ...rest } = params;
let filter = {};
if (filterGetMany?.where) {
filter = { ...filterGetMany, where: { ...filterGetMany.where } };
}
else {
filter['where'] = {
...omit(filterGetMany, ['include', 'params', 'noLimit', 'fields']),
};
filter['include'] = filterGetMany?.include;
filter['fields'] = filterGetMany?.fields;
filter['params'] = filterGetMany?.params;
filter['noLimit'] = filterGetMany?.noLimit;
}
// Add target id to filter
filter.where[target] = id;
if (sort?.field) {
filter['order'] = [`${sort.field} ${sort.order}`];
}
// Remove default limit and skip in react-admin
if (filter?.noLimit) {
filter['limit'] = undefined;
filter['skip'] = undefined;
filter['offset'] = undefined;
filter['noLimit'] = undefined;
}
else {
const { page = 0, perPage = 0 } = pagination;
if (perPage >= 0) {
filter['limit'] = perPage;
}
if (perPage > 0 && page >= 0) {
filter['skip'] = (page - 1) * perPage;
filter['offset'] = (page - 1) * perPage;
}
}
for (const key in rest) {
if (!params[key]) {
continue;
}
filter[key] = params[key];
}
const queryKey = {};
if (filter?.params) {
for (const key in filter.params) {
queryKey[key] = filter.params[key];
}
filter['params'] = undefined;
}
if (meta) {
for (const key in meta) {
queryKey[key] = meta[key];
}
}
const request = this.networkService.getRequestProps({ resource });
const requestProps = {
method: RequestMethods.GET,
...request,
};
const response = this.getListHelper({
type: RequestTypes.GET_MANY_REFERENCE,
resource,
queryKey,
filter,
requestProps,
});
return response;
}
// -------------------------------------------------------------
// UPDATE
// -------------------------------------------------------------
update(opts) {
const { resource, params } = opts;
const request = this.networkService.getRequestProps({
resource,
body: params.data,
});
const response = this.networkService.doRequest({
type: RequestTypes.UPDATE,
method: RequestMethods.PATCH,
paths: [resource, `${params.id}`],
...request,
});
return response;
}
// -------------------------------------------------------------
// UPDATE_MANY
// -------------------------------------------------------------
updateMany(opts) {
const { resource, params } = opts;
const { ids, data } = params;
if (!ids.length) {
throw getError({ message: '[updateMany] No IDs to execute update!' });
}
const request = this.networkService.getRequestProps({ resource, body: data });
const response = this.networkService.doRequest({
type: RequestTypes.UPDATE_MANY,
method: RequestMethods.PATCH,
paths: [resource],
query: { filter: { where: { id: { inq: ids } } } },
...request,
});
return response;
}
// -------------------------------------------------------------
// CREATE
// -------------------------------------------------------------
create(opts) {
const { resource, params } = opts;
const request = this.networkService.getRequestProps({ resource, body: params.data });
const response = this.networkService.doRequest({
type: RequestTypes.CREATE,
method: RequestMethods.POST,
paths: [resource],
...request,
});
return response;
}
// -------------------------------------------------------------
// DELETE
// -------------------------------------------------------------
delete(opts) {
const { resource, params } = opts;
const request = this.networkService.getRequestProps({ resource });
const response = this.networkService.doRequest({
type: RequestTypes.DELETE,
method: RequestMethods.DELETE,
paths: [resource, `${params.id}`],
...request,
});
return response;
}
// -------------------------------------------------------------
// DELETE_MANY
// -------------------------------------------------------------
deleteMany(opts) {
const { resource, params } = opts;
const { ids } = params;
if (!ids.length) {
throw getError({ message: '[deleteMany] No IDs to execute delete!' });
}
const request = this.networkService.getRequestProps({ resource });
const rs = Promise.all(ids
.map(id => [resource, `${id}`])
.map(paths => {
return this.networkService.doRequest({
type: RequestTypes.DELETE_MANY,
method: RequestMethods.DELETE,
paths,
...request,
});
})).then(responses => {
return {
data: responses.map(response => response.data),
};
});
return rs;
}
// -------------------------------------------------------------
// SEND
// -------------------------------------------------------------
send(opts) {
const { resource, params } = opts;
if (!params?.method) {
throw getError({
message: '[send] Invalid http method to send request!',
});
}
const { method, query, ...rest } = params;
const request = this.networkService.getRequestProps({ ...rest, resource });
const response = this.networkService.doRequest({
type: RequestTypes.SEND,
method,
query,
paths: [resource],
...request,
});
return response;
}
value() {
return {
getList: (resource, params) => {
return this.getList({ resource, params });
},
getOne: (resource, params) => {
return this.getOne({ resource, params });
},
getMany: (resource, params) => {
return this.getMany({ resource, params });
},
getManyReference: (resource, params) => {
return this.getManyReference({ resource, params });
},
create: (resource, params) => {
return this.create({ resource, params });
},
update: (resource, params) => {
return this.update({ resource, params });
},
updateMany: (resource, params) => {
return this.updateMany({ resource, params });
},
delete: (resource, params) => {
return this.delete({ resource, params });
},
deleteMany: (resource, params) => {
return this.deleteMany({ resource, params });
},
send: (opts) => {
return this.send(opts);
},
};
}
};
DefaultRestDataProvider = __decorate([
__param(0, inject(CoreBindings.REST_DATA_PROVIDER_OPTIONS)),
__metadata("design:paramtypes", [Object])
], DefaultRestDataProvider);
export { DefaultRestDataProvider };
//# sourceMappingURL=default-rest-data.provider.js.map