import { fail, redirect } from '@sveltejs/kit'; import { db } from '$lib/server/db'; import { users } from '$lib/server/db/schema'; import { eq } from 'drizzle-orm'; import { hashPassword } from '$lib/server/auth/password'; import { createSession, SESSION_COOKIE } from '$lib/server/auth/session'; import type { Actions, PageServerLoad } from './$types'; export const load: PageServerLoad = async ({ params }) => { const [user] = await db .select({ id: users.id, firstName: users.firstName, email: users.email }) .from(users) .where(eq(users.inviteToken, params.token)) .limit(1); if (!user) { redirect(302, '/login'); } return { firstName: user.firstName, email: user.email }; }; export const actions: Actions = { default: async ({ params, request, cookies }) => { const data = await request.formData(); const password = data.get('password')?.toString(); const confirm = data.get('confirm')?.toString(); if (!password || password.length < 8) { return fail(400, { error: 'Passwort muss mindestens 8 Zeichen haben.' }); } if (password !== confirm) { return fail(400, { error: 'Passwörter stimmen nicht überein.' }); } const [user] = await db .select() .from(users) .where(eq(users.inviteToken, params.token)) .limit(1); if (!user) { return fail(400, { error: 'Ungültiger Einladungslink.' }); } const passwordHash = await hashPassword(password); await db .update(users) .set({ passwordHash, inviteToken: null }) .where(eq(users.id, user.id)); const sessionId = await createSession(user.id); cookies.set(SESSION_COOKIE, sessionId, { path: '/', httpOnly: true, sameSite: 'lax', secure: process.env.NODE_ENV === 'production', maxAge: 30 * 24 * 60 * 60 }); redirect(302, '/dashboard'); } };