@paroicms/connector
Version:
An API to help build management tools for ParoiCMS instances
85 lines • 3.16 kB
JavaScript
import { getRoutingDocumentTypeByName } from "@paroicms/internal-anywhere-lib";
import { encodeLNodeId } from "@paroicms/public-anywhere-lib";
import { type } from "arktype";
export async function loadRoutingDocuments(cn, siteSchema) {
const siteNodeId = await loadSiteNodeId(cn);
if (siteNodeId === undefined)
throw new Error("Missing siteNodeId");
const { home: routingIds } = await loadChildRoutingIds(cn, siteSchema, siteNodeId, [
siteSchema.nodeTypes.home,
]);
return {
siteNodeId,
homeIds: routingIds,
};
}
const LoadSiteNodeIdAT = type({
id: "number",
"+": "reject",
}).pipe((r) => ({
id: String(r.id),
}));
async function loadSiteNodeId(cn) {
const rows = await cn("PaNode")
.select("id")
.where("depth", -1)
.andWhere("typeName", "_site");
if (rows.length === 0)
return;
if (rows.length !== 1)
throw new Error(`it should not exist '${rows.length}' site nodes`);
const [row] = rows;
return LoadSiteNodeIdAT.assert(row).id;
}
const LoadChildRoutingIdsAT = type({
nodeId: "number",
language: "string",
typeName: "string",
"+": "reject",
}).pipe((r) => ({
nodeId: String(r.nodeId),
language: r.language,
typeName: r.typeName,
}));
async function loadChildRoutingIds(cn, siteSchema, parentNodeId, childTypes) {
const rows = await cn("PaLNode as s")
.select("s.nodeId", "s.language", "l.typeName")
.innerJoin("PaNode as l", "l.id", "s.nodeId")
.where("l.parentId", parentNodeId)
.whereIn("l.typeName", childTypes.map((t) => t.typeName))
.whereIn("s.language", siteSchema.languages);
const formattedRows = rows.map((row) => LoadChildRoutingIdsAT.assert(row));
const map = new Map();
for (const row of formattedRows) {
let ids = map.get(row.typeName);
if (!ids) {
ids = {
nodeId: row.nodeId,
typeName: row.typeName,
lNodeIds: {},
};
map.set(row.typeName, ids);
}
ids.lNodeIds[row.language] = encodeLNodeId(row);
}
for (const childType of childTypes) {
const ids = map.get(childType.typeName);
if (!ids) {
throw new Error(`missing document-type '${childType.typeName}' in the database, for parent '${parentNodeId}'`);
}
const languages = Object.keys(ids.lNodeIds);
if (languages.length !== siteSchema.languages.length) {
throw new Error(`missing lNode(s) for '${childType.typeName}' in the database, found languages '${languages.join(",")}'`);
}
const subTypes = routingChildrenOf(siteSchema, childType);
if (subTypes.length > 0) {
ids.children = await loadChildRoutingIds(cn, siteSchema, ids.nodeId, subTypes);
}
}
return Object.fromEntries(map);
}
function routingChildrenOf(siteSchema, documentType) {
const typeNames = documentType.routingChildren ?? [];
return typeNames.map((typeName) => getRoutingDocumentTypeByName(siteSchema, typeName));
}
//# sourceMappingURL=load-routing-documents.js.map