UNPKG

@minimaltech/ra-infra

Version:

Minimal Technology ReactJS Infrastructure

388 lines 14.6 kB
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