124 lines
3.0 KiB
TypeScript
124 lines
3.0 KiB
TypeScript
import { asc, eq } from 'drizzle-orm';
|
|
import { message, superValidate } from 'sveltekit-superforms/server';
|
|
import { zod4 } from 'sveltekit-superforms/adapters';
|
|
import { auth } from '$lib/server/auth';
|
|
import { db } from '$lib/server/db';
|
|
import { user } from '$lib/server/db/schema';
|
|
import { createAdminSchema, deleteAdminSchema, editAdminSchema } from '$lib/schemas/admin';
|
|
import type { Actions, PageServerLoad } from './$types';
|
|
|
|
export const load: PageServerLoad = async ({ locals }) => {
|
|
const users = await db
|
|
.select({
|
|
id: user.id,
|
|
name: user.name,
|
|
email: user.email,
|
|
role: user.role,
|
|
banned: user.banned,
|
|
emailVerified: user.emailVerified,
|
|
createdAt: user.createdAt,
|
|
updatedAt: user.updatedAt
|
|
})
|
|
.from(user)
|
|
.orderBy(asc(user.name), asc(user.email));
|
|
|
|
return {
|
|
currentUserId: locals.user?.id,
|
|
users,
|
|
createForm: await superValidate(zod4(createAdminSchema), {
|
|
id: 'create-admin',
|
|
errors: false
|
|
}),
|
|
editForm: await superValidate(zod4(editAdminSchema), { id: 'edit-admin', errors: false }),
|
|
deleteForm: await superValidate(zod4(deleteAdminSchema), {
|
|
id: 'delete-admin',
|
|
errors: false
|
|
})
|
|
};
|
|
};
|
|
|
|
export const actions: Actions = {
|
|
create: async (event) => {
|
|
const form = await superValidate(event, zod4(createAdminSchema), { id: 'create-admin' });
|
|
|
|
if (!form.valid) {
|
|
return message(form, 'Check the highlighted fields.', { status: 400 });
|
|
}
|
|
|
|
try {
|
|
await auth.api.createUser({
|
|
headers: event.request.headers,
|
|
body: {
|
|
name: form.data.name,
|
|
email: form.data.email,
|
|
password: form.data.password,
|
|
role: form.data.role
|
|
}
|
|
});
|
|
} catch {
|
|
return message(form, 'Unable to create admin. Check whether that email already exists.', {
|
|
status: 400
|
|
});
|
|
}
|
|
|
|
return message(form, 'Admin created.');
|
|
},
|
|
|
|
edit: async (event) => {
|
|
const form = await superValidate(event, zod4(editAdminSchema), { id: 'edit-admin' });
|
|
|
|
if (!form.valid) {
|
|
return message(form, 'Check the highlighted fields.', { status: 400 });
|
|
}
|
|
|
|
try {
|
|
await auth.api.adminUpdateUser({
|
|
headers: event.request.headers,
|
|
body: {
|
|
userId: form.data.id,
|
|
data: {
|
|
name: form.data.name,
|
|
email: form.data.email
|
|
}
|
|
}
|
|
});
|
|
|
|
await auth.api.setRole({
|
|
headers: event.request.headers,
|
|
body: {
|
|
userId: form.data.id,
|
|
role: form.data.role
|
|
}
|
|
});
|
|
|
|
if (form.data.password) {
|
|
await auth.api.setUserPassword({
|
|
headers: event.request.headers,
|
|
body: {
|
|
userId: form.data.id,
|
|
newPassword: form.data.password
|
|
}
|
|
});
|
|
}
|
|
} catch {
|
|
return message(form, 'Unable to update admin. Check whether that email already exists.', {
|
|
status: 400
|
|
});
|
|
}
|
|
|
|
return message(form, 'Admin updated.');
|
|
},
|
|
|
|
delete: async (event) => {
|
|
const form = await superValidate(event, zod4(deleteAdminSchema), { id: 'delete-admin' });
|
|
|
|
if (!form.valid) {
|
|
return message(form, 'Admin id is required.', { status: 400 });
|
|
}
|
|
|
|
await db.delete(user).where(eq(user.id, form.data.id));
|
|
|
|
return message(form, 'Admin deleted.');
|
|
}
|
|
};
|