@paroicms/server
Version:
The ParoiCMS server
54 lines • 1.94 kB
JavaScript
import { type } from "arktype";
import { invalidateMultipleDocumentsInCache } from "../../common/text-cache.js";
const ReorderNodesRowAT = type({
nodeId: "number",
orderNum: "number",
"+": "reject",
}).pipe((r) => ({
nodeId: String(r.nodeId),
orderNum: r.orderNum,
}));
export async function reorderNodes(siteContext, { nodeIds, parentNodeId, listName, }) {
const { cn } = siteContext;
let query = cn("PaNode as n")
.select(["n.id as nodeId", "o.orderNum as orderNum"])
.innerJoin("PaOrderedNode as o", "n.id", "o.nodeId")
.where("n.parentId", parentNodeId)
.orderBy("o.orderNum", "ASC")
.orderBy("n.id", "ASC");
if (listName) {
query = query.innerJoin("PaPartNode as p", "p.nodeId", "n.id").where("p.listName", listName);
}
const rows = await query;
const oldItems = rows.map((row) => ReorderNodesRowAT.assert(row));
let orderNum = 1;
const newItems = [];
for (const nodeId of nodeIds) {
newItems.push({ nodeId, orderNum });
++orderNum;
}
for (const item of oldItems) {
if (!nodeIds.includes(item.nodeId)) {
newItems.push({ nodeId: item.nodeId, orderNum });
++orderNum;
}
}
await cn.transaction(async (tx) => {
for (const newItem of newItems) {
if (oldItems.find((old) => old.nodeId === newItem.nodeId)) {
await tx("PaOrderedNode")
.update({ orderNum: newItem.orderNum })
.where("nodeId", newItem.nodeId);
}
else {
await tx("PaOrderedNode").insert({
nodeId: newItem.nodeId,
orderNum: newItem.orderNum,
});
}
}
});
await invalidateMultipleDocumentsInCache(siteContext, { nodeId: parentNodeId });
return nodeIds;
}
//# sourceMappingURL=ordered-node.queries.js.map