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;