const { apiSsrBaseURL, ssrPublishCheckCollections } = require("../config") /** * api request via server, cache result in context.ssrCache * should be elimated in client code via tree shaking * * @param {string} cacheKey * @param {string} endpoint * @param {string} query * @param {ApiOptions} options * @returns {ApiResult} */ function ssrRequest(cacheKey, endpoint, query, options) { let url = endpoint + (query ? "?" + query : "") if (ssrPublishCheckCollections?.includes(endpoint)) { // @ts-ignore let validUntil = context.ssrCacheValidUntil // check in db for publish date to invalidate cache const _optionsPublishSearch = Object.assign( {}, { filter: options?.filter }, { selector: { publication: 1 }, projection: null, } ) const publishSearch = context.db.find(endpoint, _optionsPublishSearch) publishSearch?.forEach((item) => { const publicationFrom = item.publication?.from ? new Date(item.publication.from.unixMilli()) : null const publicationTo = item.publication?.to ? new Date(item.publication.to.unixMilli()) : null if (publicationFrom && publicationFrom > new Date()) { // entry has a publish date that is further in in the future than current, set global validUntil if (validUntil == null || validUntil > publicationFrom) { validUntil = publicationFrom } } if (publicationTo && publicationTo > new Date()) { // entry has a unpublish date that is further in in the future than current, set global validUntil if (validUntil == null || validUntil > publicationTo) { validUntil = publicationTo } } }) // @ts-ignore context.ssrCacheValidUntil = validUntil } // console.log("############ FETCHING ", apiSsrBaseURL + url) const response = context.http.fetch(apiSsrBaseURL + url, { method: options.method, headers: options.headers, }) // console.log(JSON.stringify(response.headers, null, 2)) const json = response.body.json() const count = parseInt(response.headers["X-Results-Count"] || "0") // json is go data structure and incompatible with js, so we need to convert it const r = { data: JSON.parse(JSON.stringify(json)), count: count } // @ts-ignore context.ssrCache[cacheKey] = r return r } module.exports = { ssrRequest, }