init
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
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');
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user