import { db } from '#lib/server/db/index.js'; import { blogArticles } from '#lib/server/db/schema/index.js'; import { isAdmin, requireAdmin } from '#lib/server/auth.js'; import { uniqueSlug } from '#lib/server/slugify.js'; import { createArticleSchema } from '#lib/validation/blog.js'; import { desc, eq } from 'drizzle-orm'; import { fail, redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types.js'; 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, isAdmin: admin, now: Date.now() }; }; export const actions = { default: async (event) => { requireAdmin(event); const formData = await event.request.formData(); const parsed = createArticleSchema.safeParse({ title: formData.get('title')?.toString() }); 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`); } };