| | import type { Response } from 'express' |
| |
|
| | import { Context } from '@/types' |
| | import { ExtendedRequestWithPageInfo } from '@/article-api/types' |
| | import contextualize from '@/frame/middleware/context/context' |
| | import { transformerRegistry } from '@/article-api/transformers' |
| | import { allVersions } from '@/versions/lib/all-versions' |
| | import type { Page } from '@/types' |
| |
|
| | |
| | |
| | |
| | |
| | async function createContextualizedRenderingRequest(pathname: string, page: Page) { |
| | const mockedContext: Context = {} |
| | const renderingReq = { |
| | path: pathname, |
| | language: page.languageCode, |
| | pagePath: pathname, |
| | cookies: {}, |
| | context: mockedContext, |
| | headers: { |
| | 'content-type': 'text/markdown', |
| | }, |
| | } |
| |
|
| | |
| | await contextualize(renderingReq as ExtendedRequestWithPageInfo, {} as Response, () => {}) |
| | renderingReq.context.page = page |
| |
|
| | return renderingReq |
| | } |
| |
|
| | export async function getArticleBody(req: ExtendedRequestWithPageInfo) { |
| | |
| | |
| | const { page, pathname, archived } = req.pageinfo |
| |
|
| | if (archived?.isArchived) |
| | throw new Error(`Page ${pathname} is archived and can't be rendered in markdown.`) |
| |
|
| | |
| | const apiVersion = req.query.apiVersion as string | undefined |
| |
|
| | |
| | const transformer = transformerRegistry.findTransformer(page) |
| |
|
| | if (transformer) { |
| | |
| | const renderingReq = await createContextualizedRenderingRequest(pathname, page) |
| |
|
| | |
| | |
| | const currentVersion = renderingReq.context.currentVersion |
| | let effectiveApiVersion = apiVersion |
| |
|
| | |
| | if (!effectiveApiVersion && currentVersion && allVersions[currentVersion]) { |
| | effectiveApiVersion = allVersions[currentVersion].latestApiVersion || undefined |
| | } |
| |
|
| | return await transformer.transform(page, pathname, renderingReq.context, effectiveApiVersion) |
| | } |
| |
|
| | |
| | if (page.documentType !== 'article') { |
| | throw new Error(`Page ${pathname} isn't yet available in markdown.`) |
| | } |
| |
|
| | |
| | const renderingReq = await createContextualizedRenderingRequest(pathname, page) |
| | renderingReq.context.markdownRequested = true |
| | return await page.render(renderingReq.context) |
| | } |
| |
|