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

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;