'use server' import type { CreateUserInput, CreateUserResult } from './types' import { getAuditRequestMetadata } from '@admin/actions/audit/get-audit-request-metadata' import { auth } from '@admin/auth' import { requireRole, UserRole } from '@admin/auth/middleware' import db from '@admin/db' import { user } from '@admin/db/schema' import { runAdminEventHooks } from '@admin/lib/lifecycle-hooks' import { getTouchedFieldNames } from '@admin/utils/audit/get-touched-field-names' import { toActionError } from '@admin/utils/error/to-action-error' import { eq } from 'drizzle-orm' import { updateTag } from 'next/cache' import { usersCacheTags } from './types' export async function createUser(input: CreateUserInput): Promise { const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR]) try { const now = new Date().toISOString() const auditRequestMetadata = await getAuditRequestMetadata() const result = await auth.api.signUpEmail({ body: { email: input.email, password: input.password, name: input.name } }) if (!result?.user) { return { success: false, error: 'Failed to create user' } } await db .update(user) .set({ role: input.role, updatedAt: new Date() }) .where(eq(user.id, result.user.id)) updateTag(usersCacheTags.all) runAdminEventHooks({ category: 'user', action: 'create', targetType: 'user', targetId: result.user.id, targetLabel: result.user.email, user: actor, timestamp: now, sourceType: 'admin_ui' as const, changedFields: getTouchedFieldNames(input as unknown as Record), metadata: { role: input.role }, ...auditRequestMetadata }) return { success: true, user: { id: result.user.id, email: result.user.email, name: input.name, emailVerified: false, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), role: input.role } } } catch (error) { return { success: false, error: toActionError(error, 'Failed to create user') } } }