124 lines
2.9 KiB
TypeScript
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;
|