ice.fo.utils
Version:
82 lines (66 loc) • 2.1 kB
JavaScript
/* eslint-disable no-await-in-loop */
import _set from 'lodash/set';
import mapData from './mapData';
import makeSvcAPI from './makeSvcAPI';
import getValue from '../Getter/getValue';
import formatStringValue from '../String/formatStringValue';
import convertToQueryObject from '../String/convertToQueryObject';
/**
* Fetch items by API Binnding Connfig
*
* @param {object} dataMapConfig
* @param {object} params
* @param {{ $axios }} context
* @returns
*/
export default async function fetchDataMap(dataMapConfig, params = {}, context = {}) {
const { $axios } = context;
dataMapConfig = dataMapConfig && (dataMapConfig.item || dataMapConfig);
if (!dataMapConfig || !(dataMapConfig.api || dataMapConfig.baseApi)) {
return null;
}
const parseValues = context;
// call replated apis
if (dataMapConfig.relatedApis && dataMapConfig.relatedApis.length) {
for (const item of dataMapConfig.relatedApis) {
try {
const relatedResult = await fetchDataMap(item.relatedApi.item, params, parseValues);
_set(parseValues, item.name, relatedResult);
} catch (error) {
console.error(error);
}
}
}
const apiUrl = getValue(dataMapConfig.api) || makeSvcAPI(dataMapConfig.baseApi);
const { data } = await $axios.request({
url: formatStringValue(parseValues, apiUrl),
method: 'get', // fetch data to display only support GET
params: {
...params,
...convertToQueryObject({ text: dataMapConfig.apiParams, data: parseValues }),
},
});
if (!data.currentPage) {
data.currentPage = params.page;
data.pageSize = params.pageSize;
}
if (!data.pageCount && data.totalCount != null) {
data.pageCount = Math.ceil(data.totalCount / data.pageSize);
}
const item = data.item;
const items = data.items;
const result = mapData(dataMapConfig, items || [item]);
if (items) {
return {
...data,
values: result,
canFetchMore: data.currentPage < data.pageCount,
};
} if (item) {
return {
...data,
value: result[0],
};
}
return null;
}