md-toy-blog
Version:
Very simple Markdown blog: serves your md as html without fancy databases. You will only spend time writing the actual data.
46 lines (40 loc) • 1.42 kB
text/typescript
import NotFoundController from './NotFoundController';
export default class BlogPostController extends NotFoundController {
protected config: BlogControllerCtorConfig;
constructor(config: BlogControllerCtorConfig) {
super(config);
this.config = config;
}
async action({ postSlug }: BlogPostControllerActionParams) {
const controllerName = this.constructor.name;
const {
markdownToHtmlService,
templateHydratorService,
appPaths,
additionalViewData,
} = this.config;
const { getMarkdownFilePath, getViewTemplateFilePath } = appPaths;
try {
const postDataWithHtmlBody: FmDataInterface = await markdownToHtmlService.extractFmAttributesAndHtmlBodyFromMd(
postSlug,
getMarkdownFilePath(postSlug)
);
const computedViewData: ViewData = {
...(additionalViewData || {}),
// TODO correct this Index Signature is missing in FmDataInterface
...postDataWithHtmlBody as unknown as ViewData,
};
const postTemplateData = await templateHydratorService.loadViewTemplate(
{ ...computedViewData },
getViewTemplateFilePath(controllerName)
);
return {
code: 200,
headers: {'content-type': 'text/html; charset=utf-8'},
body: templateHydratorService.hydrateView(postTemplateData),
};
} catch (err) {
return this.handleError(err);
}
}
}