UNPKG

@paroicms/server

Version:
70 lines 3.16 kB
import { getDocumentTypeByName } from "@paroicms/internal-anywhere-lib"; import { createTracker } from "@paroicms/internal-server-lib"; import { trackerReportToMessage } from "../common/tracker-report.js"; import { serve404SimpleHtml, serveTextContent } from "../express/http-helpers.js"; import { renderLiquidTemplate } from "../liquidjs-tools/liquidjs-rendering/render-liquidjs.js"; import { createRenderingContext } from "../liquidjs-tools/liquidjs-rendering/rendering-context.js"; import { ADMIN_TOKEN_COOKIE, validateAdminUiToken, } from "../protected-site/protected-access-token.js"; import { getDocItem } from "../rendering-payload/doc-values.queries.js"; import { makeRegularTemplatePayload } from "../rendering-payload/make-public-payload.js"; import { getUrlOfDocument } from "./page-route/make-url.js"; import { createPluginRenderedDocument } from "./serve-document/serve-document-helpers.js"; const previewUrlPattern = /^\/preview-([a-z0-9]+)\/([a-z-]{2,6})\/(\d+)$/; export async function previewReqHandler(siteContext, httpContext) { const { req } = httpContext; const match = req.path.match(previewUrlPattern); if (!match) return false; const [, secret, language, nodeId] = match; if (secret !== siteContext.previewSecret) return false; const adminToken = req.cookies?.[ADMIN_TOKEN_COOKIE]; if (!adminToken || !(await validateAdminUiToken(adminToken))) { serve404SimpleHtml(httpContext); return true; } if (!siteContext.siteSchema.languages.includes(language)) { serve404SimpleHtml(httpContext); return true; } const tracker = createTracker(); const docValues = await getDocItem(siteContext, tracker, { nodeId, language }, { allowUndef: true, forPreview: true, }); if (!docValues) { serve404SimpleHtml(httpContext); return true; } const docUrl = await getUrlOfDocument(siteContext, tracker, { nodeId, language }, { returnUndef: true, forPreview: true }); if (!docUrl) { serve404SimpleHtml(httpContext); return true; } const documentType = getDocumentTypeByName(siteContext.siteSchema, docValues.type); const previewCacheKey = `preview:${nodeId}:${language}`; const renderingContext = await createRenderingContext(siteContext, { cacheKey: previewCacheKey, language, tracker, isPreview: true, mainDocument: createPluginRenderedDocument(docValues, { url: docUrl }), }); try { const html = await renderLiquidTemplate(renderingContext, { templateNames: [...documentType.templateNames, "default"], payload: makeRegularTemplatePayload(renderingContext, docValues, { url: docUrl, urlQuery: req.query, frontendAppPath: undefined, }), }); serveTextContent(httpContext, { text: html }); } finally { await renderingContext.close(); } siteContext.logger.stats(trackerReportToMessage(tracker.toReport(), `preview ${req.path}`)); return true; } //# sourceMappingURL=preview.req-handler.js.map