UNPKG

@paroicms/server

Version:
54 lines 1.94 kB
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