peer-at-code-web/src/routes/(auth)/register/+page.server.ts
2024-03-31 23:55:56 +02:00

103 lines
2.8 KiB
TypeScript

import { dev } from '$app/environment';
import { API_URL } from '$env/static/private';
import { fail, redirect, type Actions } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
import { zod } from 'sveltekit-superforms/adapters';
import { setError, superValidate } from 'sveltekit-superforms/server';
import { registerConfirmationSchema, registerSchema } from '$lib/validations/auth';
export const load: PageServerLoad = async ({ locals: { user } }) => {
if (user) redirect(302, '/');
const registerForm = await superValidate(zod(registerSchema));
const registerConfirmationForm = await superValidate(zod(registerConfirmationSchema));
return {
title: 'Inscription',
registerForm,
registerConfirmationForm
};
}
export const actions: Actions = {
register: async ({ request }) => {
const form = await superValidate(request, zod(registerSchema));
if (!form.valid) {
return fail(400, { form });
}
const res = await fetch(`${API_URL}/register`, {
method: 'POST',
body: JSON.stringify({
email: form.data.email
})
});
if (!res.ok) {
if (res.status === 400) {
const { email_valid, username_valid } = await res.json();
if (!email_valid) return setError(form, 'email', 'Un compte avec cette adresse email existe déjà');
if (!username_valid) return setError(form, 'pseudo', 'Ce pseudo est déjà utilisé');
}
return setError(form, 'email', "Une erreur est survenue lors de l'inscription");
}
return {
form
};
},
confirmation: async ({ request, cookies, url: { searchParams } }) => {
const form = await superValidate(request, zod(registerConfirmationSchema));
if (!form.valid) {
return fail(400, { form });
}
const res = await fetch(`${API_URL}/confirmation`, {
method: 'POST',
body: JSON.stringify({
firstname: form.data.firstname,
lastname: form.data.lastname,
pseudo: form.data.pseudo,
email: form.data.email,
passwd: form.data.passwd,
code: parseInt(form.data.code),
})
});
if (!res.ok) {
if (res.status === 400) {
const { email_valid, username_valid } = await res.json();
if (!email_valid) return setError(form, 'email', 'Un compte avec cette adresse email existe déjà');
if (!username_valid) return setError(form, 'pseudo', "Ce nom d'utilisateur est déjà utilisé");
}
return setError(form, 'code', "Une erreur est survenue lors de la confirmation");
}
const token = res.headers.get('Authorization')?.split('Bearer ').pop();
if (!token) {
return setError(form, 'code', "Une erreur est survenue, veuillez réessayer plus tard");
}
cookies.set('session', token, {
path: '/',
secure: !dev,
sameSite: 'strict',
});
const redirectTo = searchParams.get('redirectTo');
if (redirectTo)
redirect(302, `/${redirectTo.slice(1)}`);
redirect(302, '/');
}
}