@paroicms/server
Version:
The ParoiCMS server
70 lines • 3.16 kB
JavaScript
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