@paroicms/server
Version:
The ParoiCMS server
90 lines • 2.96 kB
JavaScript
import { encodeLNodeId } from "@paroicms/public-anywhere-lib";
import { type } from "arktype";
const LNodeDataRowAT = type({
nodeId: "number|string",
relativeId: "string",
publishDate: "string|null",
language: "string",
title: "string|null",
slug: "string|null",
ready: "number",
"+": "reject",
}).pipe((r) => ({
nodeId: String(r.nodeId),
relativeId: r.relativeId,
publishDate: r.publishDate ?? undefined,
language: r.language,
title: r.title ?? undefined,
slug: r.slug ?? undefined,
ready: Boolean(r.ready),
}));
export async function buildClusterNodeInfo(siteContext, homeRoutingCluster) {
const lNodeIds = collectLNodeIds(homeRoutingCluster);
const lNodeDataMap = await loadLNodeData(siteContext, lNodeIds);
return transformClusterNode(homeRoutingCluster, lNodeDataMap);
}
function collectLNodeIds(node) {
const ids = [];
for (const lNodeId of Object.values(node.lNodeIds)) {
ids.push(lNodeId);
}
if (node.children) {
for (const child of Object.values(node.children)) {
ids.push(...collectLNodeIds(child));
}
}
return ids;
}
async function loadLNodeData(siteContext, lNodeIds) {
const { cn } = siteContext;
const nodeIds = lNodeIds.map((id) => id.split(":")[0]);
const rows = await cn("PaLNode as l")
.innerJoin("PaNode as n", "n.id", "l.nodeId")
.leftJoin("PaDocument as d", {
"d.nodeId": "l.nodeId",
"d.language": "l.language",
})
.select("n.id as nodeId", "n.relativeId", "n.publishDate", "l.language", "l.ready", "d.title", "d.slug")
.whereIn("n.id", nodeIds);
const lNodeDataMap = new Map();
for (const row of rows) {
const data = LNodeDataRowAT.assert(row);
const lNodeId = encodeLNodeId({ nodeId: data.nodeId, language: data.language });
lNodeDataMap.set(lNodeId, data);
}
return lNodeDataMap;
}
function transformClusterNode(node, lNodeDataMap) {
const availableIn = {};
let relativeId;
let publishDate;
for (const [language, documentId] of Object.entries(node.lNodeIds)) {
const data = lNodeDataMap.get(documentId);
if (data) {
availableIn[language] = {
documentId,
language,
ready: data.ready,
title: data.title,
slug: data.slug,
};
relativeId ??= data.relativeId;
publishDate ??= data.publishDate;
}
}
const result = {
nodeId: node.nodeId,
typeName: node.typeName,
relativeId,
publishDate,
availableIn,
};
if (node.children) {
result.children = {};
for (const [typeName, child] of Object.entries(node.children)) {
result.children[typeName] = transformClusterNode(child, lNodeDataMap);
}
}
return result;
}
//# sourceMappingURL=site-info-api.js.map