boredgame/src/routes/(app)/(protected)/profile/+page.server.ts

140 lines
3.4 KiB
TypeScript
Raw Normal View History

import { fail, type Actions } from '@sveltejs/kit';
import { eq } from 'drizzle-orm';
import { zod } from 'sveltekit-superforms/adapters';
import { message, setError, superValidate } from 'sveltekit-superforms/server';
import { redirect } from 'sveltekit-flash-message/server';
import { changeEmailSchema, profileSchema } from '$lib/validations/account';
import type { PageServerLoad } from './$types';
import { users } from '../../../../schema';
import db from '$lib/drizzle';
export const load: PageServerLoad = async (event) => {
if (!event.locals.user) {
const message = { type: 'error', message: 'You are not signed in' } as const;
throw redirect(302, '/login', message, event);
}
const { user } = event.locals;
const dbUser = await db.query
.users
.findFirst({
where: eq(users.id, user.id)
});
const profileForm = await superValidate(zod(profileSchema), {
defaults: {
firstName: dbUser?.first_name || '',
lastName: dbUser?.last_name || '',
username: dbUser?.username || '',
}
});
const emailForm = await superValidate(zod(changeEmailSchema), {
defaults: {
email: dbUser?.email || '',
}
});
return {
profileForm,
emailForm,
};
};
export const actions: Actions = {
profileUpdate: async (event) => {
const form = await superValidate(event, zod(profileSchema));
if (!form.valid) {
return fail(400, {
form
});
}
if (!event.locals.user) {
throw redirect(302, '/login');
}
try {
console.log('updating profile');
const user = event.locals.user;
const newUsername = form.data.username;
2024-02-27 17:27:26 +00:00
const existingUser = await db.query
.users
.findFirst({
where: eq(users.username, newUsername)
}
);
if (existingUser && existingUser.id !== user.id) {
return setError(form, 'username', 'That username is already taken');
}
await db
.update(users)
.set({
first_name: form.data.firstName,
last_name: form.data.lastName,
username: form.data.username
})
.where(eq(users.id, user.id));
} catch (e) {
if (e.message === `AUTH_INVALID_USER_ID`) {
// invalid user id
console.error(e);
}
return setError(form, 'There was a problem updating your profile.');
}
console.log('profile updated successfully');
return message(form, { type: 'success', message: 'Profile updated successfully!' });
2024-02-27 17:27:26 +00:00
},
changeEmail: async (event) => {
const form = await superValidate(event, zod(changeEmailSchema));
const newEmail = form.data?.email;
if (!form.valid || !newEmail || newEmail === '') {
return fail(400, {
form
});
}
if (!event.locals.user) {
throw redirect(302, '/login');
}
const user = event.locals.user;
const existingUser = await db.query.users.findFirst({
where: eq(users.email, newEmail)
});
if (existingUser && existingUser.id !== user.id) {
return setError(form, 'email', { type: 'error', message: 'That email is already taken' });
2024-02-27 17:27:26 +00:00
}
await db
.update(users)
.set({ email: form.data.email })
.where(eq(users.id, user.id));
if (user.email !== form.data.email) {
// Send email to confirm new email?
// auth.update
// await locals.prisma.key.update({
// where: {
// id: 'emailpassword:' + user.email
// },
// data: {
// id: 'emailpassword:' + form.data.email
// }
// });
// auth.updateUserAttributes(user.user_id, {
// receiveEmail: false
// });
}
return message(form, { type: 'success', message: 'Email updated successfully!' });
}
};