add blog editor

This commit is contained in:
2026-08-31 16:39:56 +00:00
parent d793400336
commit 4822125787
13 changed files with 447 additions and 60 deletions

View File

@@ -1,29 +1,50 @@
import { db } from '$lib/server/db';
import { blogArticles } from '$lib/server/db/schema';
import { redirect } from '@sveltejs/kit';
import { isAdmin, requireAdmin } from '$lib/server/auth';
import { uniqueSlug } from '$lib/server/slugify';
import { createArticleSchema } from '$lib/validation/blog';
import { desc, eq } from 'drizzle-orm';
import { fail, redirect } from '@sveltejs/kit';
import type { PageServerLoad } from './$types.js';
export const load: PageServerLoad = async () => {
const articles = await db.select().from(blogArticles);
export const load: PageServerLoad = async (event) => {
const admin = isAdmin(event);
const articles = admin
? await db.select().from(blogArticles).orderBy(desc(blogArticles.createdAt))
: await db
.select()
.from(blogArticles)
.where(eq(blogArticles.status, 'published'))
.orderBy(desc(blogArticles.createdAt));
return {
blogArticles: articles
blogArticles: articles,
isAdmin: admin
};
};
export const actions = {
default: async ({ request }): Promise<Response> => {
const formData = await request.formData();
default: async (event) => {
requireAdmin(event);
const blogArticle = await db
.insert(blogArticles)
.values({
title: formData.get('title')?.toString(),
slug: formData.get('slug')?.toString(),
content: formData.get('content')?.toString()
})
.returning();
const formData = await event.request.formData();
const parsed = createArticleSchema.safeParse({
title: formData.get('title')?.toString()
});
return redirect(303, `/blog/${blogArticle[0].slug}`);
if (!parsed.success) {
return fail(400, { message: 'Title is required' });
}
const slug = await uniqueSlug(parsed.data.title);
await db.insert(blogArticles).values({
title: parsed.data.title,
slug,
status: 'draft'
});
return redirect(303, `/blog/${slug}/edit`);
}
};