feat: add billing and organization workflows

This commit is contained in:
2026-06-24 13:53:52 +01:00
parent 4fd81c923b
commit 44bfb083f9
97 changed files with 10966 additions and 2044 deletions
@@ -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.');
}
};