Add the Post service code.
This commit is contained in:
parent
db3e79fd8f
commit
5eb143ab4a
@ -1,2 +1,3 @@
|
||||
export const POST_PATH: string = __dirname + '/../posts';
|
||||
export const STATIC_PATH: string = __dirname + '/../static';
|
||||
export const POST_ROUTE_PREFIX: string = '/posts'
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { PostMeta } from '@blog/model/PostMeta';
|
||||
import { PostMeta } from '@blog/models/PostMeta';
|
||||
|
||||
export type Post = {
|
||||
meta: PostMeta,
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { marked } from 'marked';
|
||||
import type { Post } from '@blog/model/Post';
|
||||
import type { PostMeta } from '@blog/model/PostMeta';
|
||||
import type { Post } from '@blog/models/Post';
|
||||
import type { PostMeta } from '@blog/models/PostMeta';
|
||||
import * as yamlFront from 'yaml-front-matter';
|
||||
import { readdir } from 'node:fs/promises';
|
||||
|
||||
|
@ -1,5 +1,50 @@
|
||||
import { POST_PATH } from '@blog/config';
|
||||
import { POST_PATH, POST_ROUTE_PREFIX } from '@blog/config';
|
||||
import { readdir } from 'node:fs/promises';
|
||||
import type { Post } from '@blog/models/Post';
|
||||
import * as yamlFront from 'yaml-front-matter';
|
||||
import { marked } from 'marked';
|
||||
|
||||
export class PostFileService {
|
||||
private postFiles: string[];
|
||||
private posts: Record<string, Post>;
|
||||
|
||||
public constructor(postFiles: string[]) {
|
||||
this.postFiles = postFiles;
|
||||
this.posts = new Record<string, Post>();
|
||||
}
|
||||
|
||||
public static async create() {
|
||||
const posts = new Record<string, Post>();
|
||||
const postFiles: string[] = await readdir(POST_PATH);
|
||||
for (const postFile in postFiles) {
|
||||
const post = await this.readPostFile(postFile);
|
||||
posts.add(postFile, post);
|
||||
}
|
||||
|
||||
return new PostFileService(postFiles);
|
||||
}
|
||||
|
||||
protected async openFileAsText(fileName: string): Promise<string> {
|
||||
const file = Bun.file(POST_PATH + '/' + fileName);
|
||||
return file.text();
|
||||
}
|
||||
|
||||
protected async readPostFile(fileName: string): Promise<Post> {
|
||||
const fileContent = await this.openFileAsText(fileName);
|
||||
const parsedData = yamlFront.loadFront(fileContent);
|
||||
const postHtml = await marked.parse(parsedData.__content);
|
||||
|
||||
return {
|
||||
meta: {
|
||||
title: parsedData.title,
|
||||
description: parsedData.description,
|
||||
date: new Date(parsedData.date),
|
||||
draft: parsedData?.draft || false,
|
||||
tags: parsedData.tags,
|
||||
slug: POST_ROUTE_PREFIX + '/' + fileName,
|
||||
},
|
||||
content: parsedData.__content,
|
||||
html: postHtml
|
||||
};
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user