boredgame/src/routes/(auth)/sign-up/+page.server.ts

146 lines
3.8 KiB
TypeScript
Raw Normal View History

2024-03-25 06:11:25 +00:00
import {fail, error, type Actions} from '@sveltejs/kit';
import {Argon2id} from 'oslo/password';
import {eq} from 'drizzle-orm';
import {zod} from 'sveltekit-superforms/adapters';
import {setError, superValidate} from 'sveltekit-superforms/server';
import {redirect} from 'sveltekit-flash-message/server';
import {RateLimiter} from 'sveltekit-rate-limiter/server';
import type {PageServerLoad} from './$types';
import {lucia} from '$lib/server/auth';
import {signUpSchema} from '$lib/validations/auth';
import {add_user_to_role} from '$server/roles';
import db from '$lib/drizzle';
2024-03-25 06:11:25 +00:00
import {collections, users, wishlists} from '../../../schema';
import {createId as cuid2} from '@paralleldrive/cuid2';
2023-05-21 05:18:04 +00:00
const limiter = new RateLimiter({
// A rate is defined by [number, unit]
IPUA: [5, 'm']
});
const signUpDefaults = {
firstName: '',
lastName: '',
email: '',
username: '',
password: '',
confirm_password: '',
terms: true
};
export const load: PageServerLoad = async (event) => {
// redirect(
// 302,
// '/waitlist',
// { type: 'error', message: 'Sign-up not yet available. Please add your email to the waitlist!' },
// event
// );
if (event.locals.user) {
2024-03-25 06:11:25 +00:00
const message = {type: 'success', message: 'You are already signed in'} as const;
throw redirect('/', message, event);
}
2023-05-21 05:18:04 +00:00
return {
form: await superValidate(zod(signUpSchema), {
defaults: signUpDefaults
})
2023-05-21 05:18:04 +00:00
};
};
export const actions: Actions = {
2023-05-21 05:18:04 +00:00
default: async (event) => {
if (await limiter.isLimited(event)) {
throw error(429);
}
2024-03-11 06:19:55 +00:00
// fail(401, { message: 'Sign-up not yet available. Please add your email to the waitlist!' });
const form = await superValidate(event, zod(signUpSchema));
2023-05-21 05:18:04 +00:00
if (!form.valid) {
form.data.password = '';
form.data.confirm_password = '';
2023-05-21 05:18:04 +00:00
return fail(400, {
form
});
}
let session;
let sessionCookie;
2023-05-21 05:18:04 +00:00
// Adding user to the db
console.log('Check if user already exists');
const existing_user = await db.query.users.findFirst({
where: eq(users.username, form.data.username)
});
if (existing_user) {
return setError(form, 'username', 'You cannot create an account with that username');
}
console.log('Creating user');
2023-05-21 05:18:04 +00:00
const hashedPassword = await new Argon2id().hash(form.data.password);
const user = await db
2024-03-25 06:11:25 +00:00
.insert(users)
.values({
username: form.data.username,
hashed_password: hashedPassword,
email: form.data.email,
first_name: form.data.firstName ?? '',
last_name: form.data.lastName ?? '',
verified: false,
receive_email: false,
theme: 'system',
two_factor_secret: '',
two_factor_enabled: false
2024-03-25 06:11:25 +00:00
})
.returning();
console.log('signup user', user);
2023-05-21 05:18:04 +00:00
if (!user || user.length === 0) {
return fail(400, {
form,
2024-03-12 19:28:54 +00:00
message: `Could not create your account. Please try again. If the problem persists, please contact support. Error ID: ${cuid2()}`
});
}
2023-05-21 05:18:04 +00:00
add_user_to_role(user[0].id, 'user', true);
await db.insert(collections).values({
user_id: user[0].id
});
await db.insert(wishlists).values({
user_id: user[0].id
});
try {
session = await lucia.createSession(user[0].id, {
ip_country: event.locals.ip,
ip_address: event.locals.country
});
sessionCookie = lucia.createSessionCookie(session.id);
} catch (e: any) {
if (e.message.toUpperCase() === `DUPLICATE_KEY_ID`) {
// key already exists
console.error('Lucia Error: ', e);
}
console.log(e);
const message = {
type: 'error',
message: 'Unable to create your account. Please try again.'
};
form.data.password = '';
form.data.confirm_password = '';
error(500, message);
2023-05-21 05:18:04 +00:00
}
event.cookies.set(sessionCookie.name, sessionCookie.value, {
path: '.',
...sessionCookie.attributes
});
redirect(302, '/');
// const message = { type: 'success', message: 'Signed Up!' } as const;
// throw flashRedirect(message, event);
2023-05-21 05:18:04 +00:00
}
};