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.'); } };