@paroicms/server
Version:
The ParoiCMS server
172 lines • 8.39 kB
JavaScript
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 { 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);
const doc = await getOneDocument(siteContext, {
nodeId: documentNodeId,
language: siteContext.siteSchema.languages[0],
});
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