Files
tibi-svelte-starter/api/hooks/lib/ssr-server.js
2025-03-27 12:34:04 +00:00

75 lines
2.5 KiB
JavaScript

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<any>}
*/
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,
}