import type { BlitzApiRequest, BlitzApiResponse } from "blitz"; import { getConfig } from "blitz"; import { getPreviewPostBySlug } from "../../../../integrations/datocms"; const { serverRuntimeConfig } = getConfig(); export default async function preview(req: BlitzApiRequest, res: BlitzApiResponse) { // Check the secret and next parameters // This secret should only be known to this API route and the CMS if ( req.query.secret !== serverRuntimeConfig.datoCms.previewSecret || !req.query.slug || Array.isArray(req.query.slug) ) { return res.status(401).json({ message: "Invalid token" }); } // Fetch the headless CMS to check if the provided `slug` exists const post = await getPreviewPostBySlug(req.query.slug); // If the slug doesn't exist prevent preview mode from being enabled if (!post) { return res.status(401).json({ message: "Invalid slug" }); } // Enable Preview Mode by setting the cookies res.setPreviewData({}); // Redirect to the path from the fetched post // We don't redirect to req.query.slug as that might lead to open redirect vulnerabilities res.writeHead(307, { Location: `/posts/${post.slug}` }); res.end(); }