This repository has been archived on 2026-08-28. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
zeiterfassung_old/src/routes/invite/[token]/+page.server.ts
T
2026-04-24 10:49:56 +02:00

64 lines
1.7 KiB
TypeScript

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');
}
};