@kwiz/common
Version:
KWIZ common utilities and helpers for M365 platform
219 lines • 9.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GetItemsByIdSync = exports.GetItemsById = void 0;
const collections_base_1 = require("../../../helpers/collections.base");
const objects_1 = require("../../../helpers/objects");
const typecheckers_1 = require("../../../helpers/typecheckers");
const rest_1 = require("../../rest");
const list_1 = require("../list");
function _getGlobalCache() {
let _cache = (0, objects_1.getGlobal)("SharePoint_Rest_List_Cache", {
getItemsByIdCache: {}
});
return _cache;
}
/** return array will use the item ID as indexer, not a real array */
async function GetItemsById(siteUrl, listIdOrTitle, itemIds, options) {
try {
let baseParams = _parseItemsByIdParams(siteUrl, listIdOrTitle, itemIds, { ...options, batchRequests: itemIds.length > 1 });
const { results, allowCache, queue } = baseParams;
let cacheKey = baseParams.cacheKey;
if (options && !(0, typecheckers_1.isNullOrUndefined)(options.jsonMetadata)) {
cacheKey += "|jsonMetadata=" + options.jsonMetadata;
}
if (queue.length > 0) {
let promises = queue.map(batchRequestUrl => {
return (0, rest_1.GetJson)(batchRequestUrl, null, {
//do not allow cache. modern forms have apply option which will need this to reload the item
//it is cached in _restListItems anyways so this is not needed.
allowCache: allowCache === true,
includeDigestInGet: true,
jsonMetadata: options && options.jsonMetadata
}).then(obj => {
if (!(0, typecheckers_1.isNullOrUndefined)(obj)) {
//no-metadata will return a value, as a single result or array
//otherwise, it'll go into "d"
let items = [];
if (isNoMetaDataResult(obj)) {
items = (0, typecheckers_1.isNotEmptyArray)(obj.value)
? obj.value
: [obj.value];
}
else if (isVerboseResult(obj)) {
items = Array.isArray(obj.d.results)
? obj.d.results
: [obj.d];
}
else if (isSingleResult(obj)) {
// Issue 1471: If only single item returns it not an array and just object
items.push(obj);
}
items.forEach((restItem) => {
results[Number(restItem.Id)] = restItem;
_addCacheItem(cacheKey, restItem);
});
}
});
});
await Promise.all(promises);
}
return results;
}
catch (e) {
throw new Error("Could not retrieve rest item from list");
}
}
exports.GetItemsById = GetItemsById;
function GetItemsByIdSync(siteUrl, listIdOrTitle, itemIds, options) {
try {
let baseParams = _parseItemsByIdParams(siteUrl, listIdOrTitle, itemIds, { ...options, batchRequests: itemIds.length > 1 });
const { results, allowCache, queue } = baseParams;
let cacheKey = baseParams.cacheKey;
if (options && !(0, typecheckers_1.isNullOrUndefined)(options.jsonMetadata)) {
cacheKey += "|jsonMetadata=" + options.jsonMetadata;
}
if (queue.length > 0) {
queue.forEach((batchRequestUrl) => {
let response = (0, rest_1.GetJsonSync)(batchRequestUrl, null, {
//do not allow cache. modern forms have apply option which will need this to reload the item
//it is cached in _restListItems anyways so this is not needed.
allowCache: allowCache === true,
includeDigestInGet: true,
jsonMetadata: options && options.jsonMetadata
});
if (response && response.success && response.result) {
//no-metadata will return a value, as a single result or array
//otherwise, it'll go into "d"
let items = [];
if (isNoMetaDataResult(response.result)) {
items = (0, typecheckers_1.isNotEmptyArray)(response.result.value)
? response.result.value
: [response.result.value];
}
else if (isVerboseResult(response.result)) {
items = Array.isArray(response.result.d.results)
? response.result.d.results
: [response.result.d];
}
else if (isSingleResult(response.result)) {
// Issue 1471: If only single item returns it not an array and just object
items.push(response.result);
}
items.forEach((restItem) => {
results[Number(restItem.Id)] = restItem;
_addCacheItem(cacheKey, restItem);
});
}
});
}
return results;
}
catch (e) {
throw new Error("Could not retrieve rest item from list");
}
}
exports.GetItemsByIdSync = GetItemsByIdSync;
function _addCacheItem(cacheKey, item) {
let g_cache = _getGlobalCache();
if ((0, typecheckers_1.isNullOrUndefined)(g_cache.getItemsByIdCache[cacheKey])) {
g_cache.getItemsByIdCache[cacheKey] = [];
}
g_cache.getItemsByIdCache[cacheKey][item.Id] = (0, objects_1.jsonClone)(item);
}
function _getCacheItem(cacheKey, itemId) {
let g_cache = _getGlobalCache();
if ((0, typecheckers_1.isNullOrUndefined)(g_cache.getItemsByIdCache[cacheKey])) {
g_cache.getItemsByIdCache[cacheKey] = [];
}
if (!(0, typecheckers_1.isNullOrUndefined)(g_cache.getItemsByIdCache[cacheKey][Number(itemId)])) {
return (0, objects_1.jsonClone)(g_cache.getItemsByIdCache[cacheKey][Number(itemId)]);
}
return null;
}
function _refreshCache(cacheKey) {
let g_cache = _getGlobalCache();
g_cache.getItemsByIdCache[cacheKey] = [];
}
function _getItemsByIdBaseUrl(siteUrl, listIdOrTitle) {
return `${(0, list_1.GetListRestUrl)(siteUrl, listIdOrTitle)}/items`;
}
function _parseItemsByIdParams(siteUrl, listIdOrTitle, itemIds, options) {
let baseUrl = _getItemsByIdBaseUrl(siteUrl, listIdOrTitle);
let expand = [];
let select = [];
let allowCache = true;
let results = [];
let queue = [];
if (!(0, typecheckers_1.isNullOrUndefined)(options)) {
if (!(0, typecheckers_1.isNullOrEmptyArray)(options.select)) {
select = options.select.sort();
}
if (!(0, typecheckers_1.isNullOrEmptyArray)(options.expand)) {
expand = options.expand.sort();
}
if ((0, typecheckers_1.isBoolean)(options.refreshCache)) {
allowCache = options.refreshCache !== true;
}
}
let cacheKey = [baseUrl, select.join(",").toLowerCase(), expand.join(",").toLowerCase()].join("|");
if (allowCache === true) {
itemIds.forEach((itemId) => {
let cachedItem = _getCacheItem(cacheKey, itemId);
if (!(0, typecheckers_1.isNullOrUndefined)(cachedItem)) {
results[itemId] = cachedItem;
}
});
}
else {
_refreshCache(cacheKey);
}
//remove item ids that were retrieved from cache
itemIds = itemIds.filter((itemId) => {
return !results.some((result) => {
return Number(itemId) === Number(result.Id);
});
});
if (itemIds.length !== 0) {
let selectExpand = [];
if (select.length) {
selectExpand.push(`$select=${select.join(",")}`);
}
if (expand.length) {
selectExpand.push(`$expand=${expand.join(",")}`);
}
let selectExpandQS = selectExpand.join("&");
if (options.batchRequests === false) {
itemIds.forEach((itemId) => {
let getItemsRequestUrl = `${baseUrl}(${itemId})?${selectExpandQS}`;
queue.push(getItemsRequestUrl);
});
}
else {
let chunks = (0, collections_base_1.chunkArray)(itemIds, 60);
for (var chunkIndex = 0; chunkIndex < chunks.length; chunkIndex++) {
let chunk = chunks[chunkIndex];
let filter = chunk.map((id) => {
return `(ID eq ${id})`;
}).join("or");
let getItemsRequestUrl = `${baseUrl}?${[`$filter=${filter}`, selectExpandQS].join("&")}`;
queue.push(getItemsRequestUrl);
}
}
}
return {
results: results,
allowCache: allowCache,
queue: queue,
cacheKey: cacheKey
};
}
function isVerboseResult(result) {
return !(0, typecheckers_1.isNullOrUndefined)(result.d);
}
function isNoMetaDataResult(result) {
return !(0, typecheckers_1.isNullOrUndefined)(result.value);
}
function isSingleResult(result) {
return (0, typecheckers_1.isNumber)(result.Id);
}
//# sourceMappingURL=GetListItemsById.js.map