You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					250 lines
				
				6.1 KiB
			
		
		
			
		
	
	
					250 lines
				
				6.1 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = exports.ApiClient = void 0; | ||
|  | 
 | ||
|  | var _axios = _interopRequireDefault(require("axios")); | ||
|  | 
 | ||
|  | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
|  | 
 | ||
|  | let globalAny = {}; | ||
|  | 
 | ||
|  | try { | ||
|  |   globalAny = window; | ||
|  | } catch (error) { | ||
|  |   if (error.message !== 'window is not defined') { | ||
|  |     throw error; | ||
|  |   } else { | ||
|  |     globalAny = { | ||
|  |       isOnServer: true | ||
|  |     }; | ||
|  |   } | ||
|  | } | ||
|  | /** | ||
|  |  * Type of an [axios request]{@link https://github.com/axios/axios/blob/master/index.d.ts#L43}
 | ||
|  |  * | ||
|  |  * @typedef {object} AxiosRequestConfig | ||
|  |  * @alias AxiosRequestConfig | ||
|  |  * @memberof ApiClient | ||
|  |  * @see https://github.com/axios/axios/blob/master/index.d.ts#L43
 | ||
|  |  */ | ||
|  | 
 | ||
|  | 
 | ||
|  | const checkResponse = response => { | ||
|  |   if (globalAny.isOnServer) { | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   const loginUrl = [globalAny.location.origin, globalAny.REDUX_STATE.paths.loginPath].join(''); // if response has redirect to loginUrl
 | ||
|  | 
 | ||
|  |   if (response.request.responseURL && response.request.responseURL.match(loginUrl)) { | ||
|  |     // eslint-disable-next-line no-undef
 | ||
|  |     alert('Your session expired. You will be redirected to login screen'); | ||
|  |     globalAny.location.assign(loginUrl); | ||
|  |   } | ||
|  | }; | ||
|  | /** | ||
|  |  * Extends {@link AxiosRequestConfig} | ||
|  |  * | ||
|  |  * @alias ActionAPIParams | ||
|  |  * @memberof ApiClient | ||
|  |  * @property {any}   ...    any property supported by {@link AxiosRequestConfig} | ||
|  |  */ | ||
|  | 
 | ||
|  | 
 | ||
|  | /** | ||
|  |  * Client which access the admin API. | ||
|  |  * Use it to fetch data from auto generated AdminJS API. | ||
|  |  * | ||
|  |  * In the backend it uses [axios](https://github.com/axios/axios) client
 | ||
|  |  * library. | ||
|  |  * | ||
|  |  * Usage: | ||
|  |  * ```javascript
 | ||
|  |  * import { ApiClient } from 'adminjs' | ||
|  |  * | ||
|  |  * const api = new ApiClient() | ||
|  |  * // fetching all records
 | ||
|  |  * api.resourceAction({ resourceId: 'Comments', actionName: 'list' }).then(results => {...}) | ||
|  |  * ```
 | ||
|  |  * @see https://github.com/axios/axios
 | ||
|  |  * @hideconstructor | ||
|  |  */ | ||
|  | class ApiClient { | ||
|  |   constructor() { | ||
|  |     this.baseURL = ApiClient.getBaseUrl(); | ||
|  |     this.client = _axios.default.create({ | ||
|  |       baseURL: this.baseURL | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   static getBaseUrl() { | ||
|  |     var _globalAny$REDUX_STAT; | ||
|  | 
 | ||
|  |     if (globalAny.isOnServer) { | ||
|  |       return ''; | ||
|  |     } | ||
|  | 
 | ||
|  |     return [globalAny.location.origin, (_globalAny$REDUX_STAT = globalAny.REDUX_STATE) === null || _globalAny$REDUX_STAT === void 0 ? void 0 : _globalAny$REDUX_STAT.paths.rootPath].join(''); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Search by query string for records in a given resource. | ||
|  |    * | ||
|  |    * @param   {Object}  options | ||
|  |    * @param   {String}  options.resourceId     id of a {@link ResourceJSON} | ||
|  |    * @param   {String}  options.query          query string | ||
|  |    * @param   {String}  options.searchProperty optional property name | ||
|  |    * | ||
|  |    * @return  {Promise<SearchResponse>} | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async searchRecords({ | ||
|  |     resourceId, | ||
|  |     query, | ||
|  |     searchProperty | ||
|  |   }) { | ||
|  |     if (globalAny.isOnServer) { | ||
|  |       return []; | ||
|  |     } | ||
|  | 
 | ||
|  |     const actionName = 'search'; | ||
|  |     const response = await this.resourceAction({ | ||
|  |       resourceId, | ||
|  |       actionName, | ||
|  |       query, | ||
|  |       ...(searchProperty ? { | ||
|  |         params: { | ||
|  |           searchProperty | ||
|  |         } | ||
|  |       } : undefined) | ||
|  |     }); | ||
|  |     checkResponse(response); | ||
|  |     return response.data.records; | ||
|  |   } | ||
|  |   /** | ||
|  |    * Invokes given resource {@link Action} on the backend. | ||
|  |    * | ||
|  |    * @param   {ResourceActionAPIParams}     options | ||
|  |    * @return  {Promise<ActionResponse>}     response from an {@link Action} | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async resourceAction(options) { | ||
|  |     const { | ||
|  |       resourceId, | ||
|  |       actionName, | ||
|  |       data, | ||
|  |       query, | ||
|  |       ...axiosParams | ||
|  |     } = options; | ||
|  |     let url = `/api/resources/${resourceId}/actions/${actionName}`; | ||
|  | 
 | ||
|  |     if (query) { | ||
|  |       const q = encodeURIComponent(query); | ||
|  |       url = [url, q].join('/'); | ||
|  |     } | ||
|  | 
 | ||
|  |     const response = await this.client.request({ | ||
|  |       url, | ||
|  |       method: data ? 'POST' : 'GET', | ||
|  |       ...axiosParams, | ||
|  |       data | ||
|  |     }); | ||
|  |     checkResponse(response); | ||
|  |     return response; | ||
|  |   } | ||
|  |   /** | ||
|  |    * Invokes given record {@link Action} on the backend. | ||
|  |    * | ||
|  |    * @param   {RecordActionAPIParams} options | ||
|  |    * @return  {Promise<RecordActionResponse>}            response from an {@link Action} | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async recordAction(options) { | ||
|  |     const { | ||
|  |       resourceId, | ||
|  |       recordId, | ||
|  |       actionName, | ||
|  |       data, | ||
|  |       ...axiosParams | ||
|  |     } = options; | ||
|  |     const response = await this.client.request({ | ||
|  |       url: `/api/resources/${resourceId}/records/${recordId}/${actionName}`, | ||
|  |       method: data ? 'POST' : 'GET', | ||
|  |       ...axiosParams, | ||
|  |       data | ||
|  |     }); | ||
|  |     checkResponse(response); | ||
|  |     return response; | ||
|  |   } | ||
|  |   /** | ||
|  |    * Invokes given bulk {@link Action} on the backend. | ||
|  |    * | ||
|  |    * @param   {BulkActionAPIParams} options | ||
|  |    * @return  {Promise<BulkActionResponse>}            response from an {@link Action} | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async bulkAction(options) { | ||
|  |     const { | ||
|  |       resourceId, | ||
|  |       recordIds, | ||
|  |       actionName, | ||
|  |       data, | ||
|  |       ...axiosParams | ||
|  |     } = options; | ||
|  |     const params = new URLSearchParams(); | ||
|  |     params.set('recordIds', (recordIds || []).join(',')); | ||
|  |     const response = await this.client.request({ | ||
|  |       url: `/api/resources/${resourceId}/bulk/${actionName}`, | ||
|  |       method: data ? 'POST' : 'GET', | ||
|  |       ...axiosParams, | ||
|  |       data, | ||
|  |       params | ||
|  |     }); | ||
|  |     checkResponse(response); | ||
|  |     return response; | ||
|  |   } | ||
|  |   /** | ||
|  |    * Invokes dashboard handler. | ||
|  |    * | ||
|  |    * @param   {AxiosRequestConfig}       options | ||
|  |    * @return  {Promise<AxiosResponse<any>>} response from the handler function defined in | ||
|  |    *                                     {@link AdminJSOptions#dashboard} | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async getDashboard(options = {}) { | ||
|  |     const response = await this.client.get('/api/dashboard', options); | ||
|  |     checkResponse(response); | ||
|  |     return response; | ||
|  |   } | ||
|  |   /** | ||
|  |    * Invokes handler function of given page and returns its response. | ||
|  |    * | ||
|  |    * @param   {GetPageAPIParams}                options | ||
|  |    * @return  {Promise<AxiosResponse<any>>}     response from the handler of given page | ||
|  |    *                                            defined in {@link AdminJSOptions#pages} | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async getPage(options) { | ||
|  |     const { | ||
|  |       pageName, | ||
|  |       ...axiosParams | ||
|  |     } = options; | ||
|  |     const response = await this.client.request({ | ||
|  |       url: `/api/pages/${pageName}`, | ||
|  |       ...axiosParams | ||
|  |     }); | ||
|  |     checkResponse(response); | ||
|  |     return response; | ||
|  |   } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | exports.ApiClient = exports.default = ApiClient; |