peer-at-code-web/src/routes/(auth)/register/+page.server.ts
2024-03-28 21:52:15 +01:00

124 lines
2.9 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 { superValidate } from 'sveltekit-superforms/server';
import { registerConfirmationSchema, registerSchema } from '$lib/validations/auth';
export const load = (async ({ locals: { user } }) => {
if (user) redirect(302, '/');
const registerForm = await superValidate(zod(registerSchema));
const registerConfirmationForm = await superValidate(zod(registerConfirmationSchema));
return {
title: 'Inscription',
registerForm,
registerConfirmationForm
};
}) satisfies PageServerLoad;
export const 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) {
return {
success: true
};
}
if (res.status === 400) {
const { email_valid, username_valid } = await res.json();
if (!email_valid) form.errors.email = ['Un compte avec cette adresse email existe déjà'];
if (!username_valid) form.errors.pseudo = ['Ce pseudo est déjà utilisé'];
return fail(400, { form });
}
form.errors.pseudo = ["Une erreur s'est produite"];
return fail(400, {
form
});
},
confirmation: async ({ request, cookies }) => {
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) {
const token = res.headers.get('Authorization')?.split('Bearer ')[1];
if (!token) {
form.errors.code = [`Une erreur s'est produite lors de la confirmation de votre compte.`];
return fail(400, {
form
});
}
cookies.set('session', token, {
path: '/',
secure: !dev,
sameSite: 'strict',
});
redirect(302, '/');
}
if (res.status === 400) {
try {
const { email_valid, username_valid } = await res.json();
if (email_valid) form.errors.email = ['Un compte avec cette adresse email existe déjà'];
if (username_valid) form.errors.pseudo = ['Ce pseudo est déjà utilisé'];
return fail(400, { form });
} catch (e) {
console.error(e);
form.errors.code = ['Le code envoyé est invalide.'];
return fail(400, { form });
}
}
form.errors.code = [`Le code envoyé est invalide.`];
return fail(400, {
form
});
}
} satisfies Actions;