Some checks failed
Test and deploy staging / staging (push) Failing after 43s
Run the sveltekit-3 migration and finish its manual tasks:
- Move kit config into the sveltekit() Vite plugin; drop svelte.config.js
- Replace $lib with #lib subpath imports
- Declare env vars in src/env.ts and import them from $app/env/{private,public}
- Consolidate param matchers into src/params.ts
- Use error(status, message), Response.json, refreshAll and goto reset/shallow
- Fall back to a full page load when goto rejects a login return path
Switch from adapter-node to adapter-bun: the build script runs Vite under
Bun (the adapter requires it) and the image starts with `bun ./build`.
Runtime env names (PORT, BODY_SIZE_LIMIT, ADDRESS_HEADER, ...) are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
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`);
|
|
}
|
|
};
|