From 7795adde8544c74c020ad872080394c95b1fd593 Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 26 Aug 2024 18:47:13 +0900 Subject: [PATCH] feat: make article pages a component --- articles | 2 +- src/lib/article.ts | 15 +- src/lib/components/head.svelte | 19 ++ src/lib/page/article_page.svelte | 162 ++++++++++++++++++ src/lib/server/database/article.ts | 12 -- src/lib/server/database/init_db.ts | 20 ++- src/routes/article/+layout.server.ts | 20 --- src/routes/article/+layout.svelte | 157 +---------------- .../article/[category]/[id]/+page.server.ts | 29 ++++ .../article/[category]/[id]/+page.svelte | 10 ++ .../[category]/[series]/[id]/+page.server.ts | 29 ++++ .../[category]/[series]/[id]/+page.svelte | 10 ++ src/routes/article/[id]/+page.server.ts | 46 ----- src/routes/article/[id]/+page.svelte | 3 - 14 files changed, 283 insertions(+), 251 deletions(-) create mode 100644 src/lib/components/head.svelte create mode 100644 src/lib/page/article_page.svelte delete mode 100644 src/lib/server/database/article.ts delete mode 100644 src/routes/article/+layout.server.ts create mode 100644 src/routes/article/[category]/[series]/[id]/+page.server.ts create mode 100644 src/routes/article/[category]/[series]/[id]/+page.svelte delete mode 100644 src/routes/article/[id]/+page.server.ts delete mode 100644 src/routes/article/[id]/+page.svelte diff --git a/articles b/articles index b72a133..172da35 160000 --- a/articles +++ b/articles @@ -1 +1 @@ -Subproject commit b72a133cdd6acd08d3edf802af2ebfac0a630bf9 +Subproject commit 172da3590a2e7cec7b41dcf9a60306db277b7159 diff --git a/src/lib/article.ts b/src/lib/article.ts index e108d41..352397d 100644 --- a/src/lib/article.ts +++ b/src/lib/article.ts @@ -1,7 +1,14 @@ -export type Content = { +import type { Publish } from "./publish"; + +export type Article = { + seq: number; + id: string; title: string; - image: string; - date: string; - link: string; + category: string; + released_at: Date; + updated_at: Date; tags: string[]; + image: string; + publish: Publish; + content: string; }; \ No newline at end of file diff --git a/src/lib/components/head.svelte b/src/lib/components/head.svelte new file mode 100644 index 0000000..621607d --- /dev/null +++ b/src/lib/components/head.svelte @@ -0,0 +1,19 @@ + + +{article.title} | Blog | HareWorks + + + + + +{#if article.updated_at} + +{/if} + + + + \ No newline at end of file diff --git a/src/lib/page/article_page.svelte b/src/lib/page/article_page.svelte new file mode 100644 index 0000000..57dfe73 --- /dev/null +++ b/src/lib/page/article_page.svelte @@ -0,0 +1,162 @@ + + + + {data.title} | Blog | HareWorks + + + + + + {#if data.updated_at} + + {/if} + + + + + + + +
+
+

{data.title}

+
+ + released + {#if data.updated_at}
+ updated + {/if} +
+ + {data.category[0].toUpperCase() + data.category.slice(1)} + {#each data.tags as tag} + {tag} + {/each} + +
+
+
+
+
+ +
+
+
+
+
+ + diff --git a/src/lib/server/database/article.ts b/src/lib/server/database/article.ts deleted file mode 100644 index fa2745e..0000000 --- a/src/lib/server/database/article.ts +++ /dev/null @@ -1,12 +0,0 @@ -export type Article = { - seq: number; - id: string; - title: string; - category: string; - released_at: Date; - updated_at: Date; - tags: string[]; - image: string; - publish: string; - content: string; -}; \ No newline at end of file diff --git a/src/lib/server/database/init_db.ts b/src/lib/server/database/init_db.ts index a1fa58e..b96f03c 100644 --- a/src/lib/server/database/init_db.ts +++ b/src/lib/server/database/init_db.ts @@ -105,22 +105,24 @@ export default async function init() { } } } - scanDir('./articles/dist'); + scanDir('./articles/article'); await db.query('update tag set ref_count = 0'); db.commit(); for (const { path, id } of articleFiles) { const res = await db.query('select * from article where id = $1', [id]); - const md = await compile(fs.readFileSync(path, 'utf-8')); - const title = md.data.fm.title; + const compiled = await compile(fs.readFileSync(path, 'utf-8')); + const title = compiled.data.fm.title; const category = path.split('/')[3]; - const tags: string[] = md.data.fm.tags; - const released_at = new Date(md.data.fm.released_at); - const updated_at = new Date(md.data.fm.updated_at); - const image = md.data.fm.image; - const publish = md.data.fm.publish; - const content = md.code; + const tags: string[] = compiled.data.fm.tags; + const released_at = new Date(compiled.data.fm.released_at); + const updated_at = new Date(compiled.data.fm.updated_at); + const image = compiled.data.fm.image; + const publish = compiled.data.fm.publish; + const content = compiled.code + .replace(/>{@html ``}<\/pre>/g, ''); if (res.rowCount == 0) { console.log(`New article: ${id}`); await db.query( diff --git a/src/routes/article/+layout.server.ts b/src/routes/article/+layout.server.ts deleted file mode 100644 index ceb38bc..0000000 --- a/src/routes/article/+layout.server.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Article } from '$lib/server/database/article'; -import type { LayoutServerLoad } from './$types'; -export const load: LayoutServerLoad = async () => { - return { - props: { - article: { - seq: 0, - id: 'test', - title: 'test', - category: 'test', - released_at: new Date(), - updated_at: new Date(), - tags: ['test'], - image: 'test', - publish: 'test', - content: 'test', - } as Article, - }, - }; -}; \ No newline at end of file diff --git a/src/routes/article/+layout.svelte b/src/routes/article/+layout.svelte index eb14329..34678ce 100644 --- a/src/routes/article/+layout.svelte +++ b/src/routes/article/+layout.svelte @@ -1,161 +1,6 @@ - - {data.props.article.title} | Blog | HareWorks - - - - - - {#if data.props.article.updated_at} - - {/if} - - - - - - - -
-
-

{data.props.article.title}

-
- - released - {#if data.props.article.updated_at}
- updated - {/if} -
- - {data.props.article.category[0].toUpperCase() + data.props.article.category.slice(1)} - {#each data.props.article.tags as tag} - {tag} - {/each} - -
-
-
-
-
- -
-
-
-
-
- - + \ No newline at end of file diff --git a/src/routes/article/[category]/[id]/+page.server.ts b/src/routes/article/[category]/[id]/+page.server.ts index e69de29..c7c9759 100644 --- a/src/routes/article/[category]/[id]/+page.server.ts +++ b/src/routes/article/[category]/[id]/+page.server.ts @@ -0,0 +1,29 @@ +import type { Article } from '$lib/article'; +import type { PageServerLoad } from './$types'; +import PG from '$lib/server/database'; +import { error } from '@sveltejs/kit'; + +export const load: PageServerLoad = async ({ params }) => { + const { category, id } = params; + console.log(id); + + const db = await PG(); + await db.begin(); + try { + const article = await db.query( + "SELECT * FROM article WHERE id = $1 AND category = $2", + [id, category] + ); + if (article.rowCount === 0) { + error(404, 'Not found'); + } + const row = article.rows[0]; + const data: Article = { ...row }; + return data + } catch (e) { + await db.rollback(); + error(500, (e as Error).message); + } finally { + await db.release(); + } +}; \ No newline at end of file diff --git a/src/routes/article/[category]/[id]/+page.svelte b/src/routes/article/[category]/[id]/+page.svelte index e69de29..dc6c70e 100644 --- a/src/routes/article/[category]/[id]/+page.svelte +++ b/src/routes/article/[category]/[id]/+page.svelte @@ -0,0 +1,10 @@ + + + + {@html data.content} + diff --git a/src/routes/article/[category]/[series]/[id]/+page.server.ts b/src/routes/article/[category]/[series]/[id]/+page.server.ts new file mode 100644 index 0000000..50dfac0 --- /dev/null +++ b/src/routes/article/[category]/[series]/[id]/+page.server.ts @@ -0,0 +1,29 @@ +import type { Article } from '$lib/article'; +import type { PageServerLoad } from './$types'; +import PG from '$lib/server/database'; +import { error } from '@sveltejs/kit'; + +export const load: PageServerLoad = async ({ params }) => { + const { category, id, series } = params; + console.log(id); + + const db = await PG(); + await db.begin(); + try { + const article = await db.query( + "SELECT * FROM article WHERE id = $1 AND category = $2 AND series = $3", + [id, category, series] + ); + if (article.rowCount === 0) { + error(404, 'Not found'); + } + const row = article.rows[0]; + const data: Article = { ...row }; + return data + } catch (e) { + await db.rollback(); + error(500, (e as Error).message); + } finally { + await db.release(); + } +}; \ No newline at end of file diff --git a/src/routes/article/[category]/[series]/[id]/+page.svelte b/src/routes/article/[category]/[series]/[id]/+page.svelte new file mode 100644 index 0000000..81a88d4 --- /dev/null +++ b/src/routes/article/[category]/[series]/[id]/+page.svelte @@ -0,0 +1,10 @@ + + + + {@html data.content} + diff --git a/src/routes/article/[id]/+page.server.ts b/src/routes/article/[id]/+page.server.ts deleted file mode 100644 index e9b960c..0000000 --- a/src/routes/article/[id]/+page.server.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { Article } from '$lib/server/database/article'; -import type { PageServerLoad } from './$types'; -import PG from '$lib/server/database'; - -export const load: PageServerLoad = async ({ params }) => { - const { id } = params; - - const db = await PG(); - await db.begin(); - try { - const article = await db.query( - "SELECT * FROM article WHERE id = $1", - [id] - ); - if (article.rowCount === 0) { - return { - status: 404, - error: new Error('Not found'), - }; - } - const row = article.rows[0]; - const data: Article = { - seq: row.seq, - id: row.id, - title: row.title, - category: row.category, - released_at: row.released_at, - updated_at: row.updated_at, - tags: row.tags, - image: row.image, - publish: row.publish, - content: row.content, - }; - return { - props: { data }, - }; - } catch (e) { - await db.rollback(); - return { - status: 500, - error: e as Error, - }; - } finally { - await db.release(); - } -}; \ No newline at end of file diff --git a/src/routes/article/[id]/+page.svelte b/src/routes/article/[id]/+page.svelte deleted file mode 100644 index 85c9b3e..0000000 --- a/src/routes/article/[id]/+page.svelte +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file