feat: add billing and organization workflows
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
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.');
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user