UNPKG

@kwiz/common

Version:

KWIZ common utilities and helpers for M365 platform

219 lines 9.48 kB
"use strict"; 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