48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import { fail, redirect } from '@sveltejs/kit';
|
|
import type { Actions, PageServerLoad } from './$types';
|
|
import {
|
|
createFirstAdmin,
|
|
createSession,
|
|
hasUsers,
|
|
setupIsConfigured,
|
|
validDisplayName,
|
|
validEmail,
|
|
validPassword
|
|
} from '#lib/server/auth.js';
|
|
|
|
export const load: PageServerLoad = () => {
|
|
if (hasUsers()) redirect(303, '/login');
|
|
return { configured: setupIsConfigured() };
|
|
};
|
|
|
|
export const actions = {
|
|
default: async ({ request, cookies }) => {
|
|
if (hasUsers()) redirect(303, '/login');
|
|
const data = await request.formData();
|
|
const setupToken = String(data.get('setupToken') || '');
|
|
const displayName = String(data.get('displayName') || '').trim();
|
|
const email = String(data.get('email') || '').trim();
|
|
const password = String(data.get('password') || '');
|
|
if (!validDisplayName(displayName) || !validEmail(email) || !validPassword(password)) {
|
|
return fail(400, {
|
|
error: 'Bitte Name, gültige E-Mail und ein Passwort mit mindestens 12 Zeichen prüfen.',
|
|
displayName,
|
|
email
|
|
});
|
|
}
|
|
try {
|
|
const user = await createFirstAdmin({ setupToken, displayName, email, password });
|
|
createSession(user.id, cookies);
|
|
} catch (cause) {
|
|
const code = cause instanceof Error ? cause.message : '';
|
|
if (code === 'SETUP_CLOSED') redirect(303, '/login');
|
|
return fail(403, {
|
|
error: 'Das Betreiber-Setup-Token ist ungültig.',
|
|
displayName,
|
|
email
|
|
});
|
|
}
|
|
redirect(303, '/fundus');
|
|
}
|
|
} satisfies Actions;
|