40 lines
1.4 KiB
Text
40 lines
1.4 KiB
Text
---
|
|
export const prerender = false;
|
|
|
|
import { getCollection, render } from 'astro:content';
|
|
import { requireAdminSession } from '../../lib/auth';
|
|
import Layout from '../../layouts/Layout.astro';
|
|
import { formatDate, formatListItem } from '../../lib/format';
|
|
import { getSlug, enrichPostWithDates, enrichPostsWithDates, resolveRelatedPosts } from '../../lib/md';
|
|
|
|
const { session, error } = await requireAdminSession(Astro.request);
|
|
if (error) return error;
|
|
if (!session) return Astro.redirect('/api/auth/signin');
|
|
|
|
const slug = Astro.params.slug;
|
|
const rawPosts = await getCollection('md', ({ data }) => data.draft === true);
|
|
const rawPost = rawPosts.find(p => getSlug(p.id) === slug);
|
|
|
|
if (!rawPost) {
|
|
return new Response('Not found', { status: 404 });
|
|
}
|
|
|
|
const allPosts = enrichPostsWithDates(rawPosts);
|
|
const post = enrichPostWithDates(rawPost);
|
|
const { Content } = await render(post);
|
|
const related = post.data.related ? resolveRelatedPosts(post.data.related, allPosts) : [];
|
|
---
|
|
<Layout title={`${post.data.title} - lewis m.w.`}>
|
|
|
|
<article>
|
|
<h1>{post.data.title}</h1>
|
|
<p class="muted" style="margin-top: 0;">{formatDate(post.dates.created)}{post.dates.updated && ` (updated ${formatDate(post.dates.updated)})`}</p>
|
|
<Content />
|
|
</article>
|
|
{related.length > 0 && (
|
|
<details open>
|
|
<summary>related</summary>
|
|
<pre set:html={related.map(p => formatListItem(p.dates.created, `/draft/${getSlug(p.id)}`, p.data.title)).join('\n')} />
|
|
</details>
|
|
)}
|
|
</Layout>
|