UNPKG

@paroicms/server

Version:
176 lines 8.6 kB
import { createNoTracker, toAbsoluteUrl } from "@paroicms/internal-server-lib"; import { encodeLNodeId, parseLNodeId } from "@paroicms/public-anywhere-lib"; import { toDocumentSeed } from "../../common/data-format.js"; import { siteReadyGuard } from "../../graphql/graphql.types.js"; import { getUrlOfDocument } from "../../rendered-site/page-route/make-url.js"; import { permissionGuard } from "../auth/authorization.helper.js"; import { recordEvent } from "../event-log/event-log.service.js"; import { findOneDocumentSeed } from "../lnode/lnode.queries.js"; import { findOneNode, getTypeNameOf } from "../node/node.queries.js"; import { moveDocument as moveDocumentQuery } from "./document-moving.queries.js"; import { findOneDocument, getOneDocument } from "./load-documents.queries.js"; import { createDocumentOnNode, createNodeWithDocument, deleteDocument, deleteNodeAndDocuments, parseDocumentMetadataValues, updateDocument, updateNodeRelativeId, } from "./save-documents.queries.js"; export const documentResolvers = { Query: { document: async (_parent, { documentId }, { siteContext, httpContext }) => { siteReadyGuard(siteContext); await permissionGuard(siteContext, httpContext, "document.edit"); return await findOneDocumentSeed(siteContext, parseLNodeId(documentId)); }, }, Mutation: { updateDocumentMetadata: async (_parent, { valuesJson, id }, { siteContext, httpContext }) => { siteReadyGuard(siteContext); const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit"); const lNodeId = parseLNodeId(id); const values = parseDocumentMetadataValues(valuesJson); const { relativeId, ...documentValues } = values; if (typeof relativeId === "string") { await updateNodeRelativeId(siteContext, lNodeId, relativeId); } const changedFields = Object.keys(values); const documentChangedFields = Object.keys(documentValues); if (documentChangedFields.length > 0) { await updateDocument(siteContext, lNodeId, documentValues); } const doc = await getOneDocument(siteContext, lNodeId); if (changedFields.length > 0) { const typeName = await getTypeNameOf(siteContext, doc.nodeId); recordEvent(siteContext, { eventType: "document.update", actorId: authorizedAccount.accountId, targetType: "document", targetId: encodeLNodeId(lNodeId), eventData: { nodeId: doc.nodeId, typeName, title: doc.title, language: doc.language, changedFields, }, }); } return toDocumentSeed(doc); }, deleteDocument: async (_parent, { documentId }, { siteContext, httpContext }) => { siteReadyGuard(siteContext); const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit"); const parsedId = parseLNodeId(documentId); const doc = await getOneDocument(siteContext, parsedId); const typeName = await getTypeNameOf(siteContext, doc.nodeId); await deleteDocument(siteContext, parsedId); recordEvent(siteContext, { eventType: "document.delete", actorId: authorizedAccount.accountId, targetType: "document", targetId: documentId, eventData: { nodeId: doc.nodeId, typeName, title: doc.title, language: doc.language, }, }); return true; }, moveDocument: async (_parent, { documentNodeId, newParentNodeId }, { siteContext, httpContext }) => { siteReadyGuard(siteContext); const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit"); const node = await findOneNode(siteContext, documentNodeId); let doc; for (const language of siteContext.siteSchema.languages) { doc = await findOneDocument(siteContext, { nodeId: documentNodeId, language }); if (doc) break; } if (!doc) throw new Error(`can't find any document for nodeId '${documentNodeId}'`); await moveDocumentQuery(siteContext, { documentNodeId, newParentNodeId }); recordEvent(siteContext, { eventType: "document.move", actorId: authorizedAccount.accountId, targetType: "document", targetId: encodeLNodeId({ nodeId: documentNodeId, language: doc.language }), eventData: { documentNodeId, typeName: node.typeName, title: doc.title, language: doc.language, oldParentNodeId: node.parentId ?? "", newParentNodeId, }, }); return true; }, deleteNodeAndDocuments: async (_parent, { documentId }, { siteContext, httpContext }) => { siteReadyGuard(siteContext); await permissionGuard(siteContext, httpContext, "document.edit"); await deleteNodeAndDocuments(siteContext, parseLNodeId(documentId).nodeId); return true; }, createNodeWithDocument: async (_parent, { values, parentDocumentId }, { siteContext, httpContext }) => { siteReadyGuard(siteContext); const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit"); const documentId = await createNodeWithDocument(siteContext, { parentId: parseLNodeId(parentDocumentId), values: { relativeId: values.relativeId ?? undefined, title: values.title ?? undefined, slug: values.slug ?? undefined, typeName: values.typeName, }, }); const doc = await getOneDocument(siteContext, documentId); recordEvent(siteContext, { eventType: "document.create", actorId: authorizedAccount.accountId, targetType: "document", targetId: encodeLNodeId(documentId), eventData: { nodeId: doc.nodeId, typeName: values.typeName, title: doc.title, language: doc.language, }, }); return toDocumentSeed(doc); }, createDocumentOnNode: async (_parent, { values, language, nodeId }, { siteContext, httpContext }) => { siteReadyGuard(siteContext); const authorizedAccount = await permissionGuard(siteContext, httpContext, "document.edit"); const typeName = await getTypeNameOf(siteContext, nodeId); const documentId = await createDocumentOnNode(siteContext, { language, nodeId, values: values ? { title: values.title ?? undefined, slug: values.slug ?? undefined } : undefined, }); const doc = await getOneDocument(siteContext, documentId); recordEvent(siteContext, { eventType: "document.create", actorId: authorizedAccount.accountId, targetType: "document", targetId: encodeLNodeId(documentId), eventData: { nodeId: doc.nodeId, typeName, title: doc.title, language: doc.language, }, }); return toDocumentSeed(doc); }, }, Document: { async url(parent, _values, { siteContext }) { siteReadyGuard(siteContext); const url = await getUrlOfDocument(siteContext, createNoTracker(), { language: parent.language, nodeId: parent.nodeId, }, { returnUndef: true }); return url ? toAbsoluteUrl(siteContext, url) : null; }, }, }; //# sourceMappingURL=document.resolver.js.map