lotteryAdmin(); $payload = $request->all(); if (isset($payload['username']) && is_string($payload['username'])) { $payload['username'] = Str::lower(trim($payload['username'])); } if (array_key_exists('email', $payload) && $payload['email'] === '') { $payload['email'] = null; } $data = validator($payload, [ 'username' => ['required', 'string', 'min:2', 'max:64', 'regex:/^[a-zA-Z0-9._-]+$/u', 'unique:admin_users,username'], 'nickname' => ['required', 'string', 'max:128'], 'email' => ['nullable', 'string', 'email', 'max:255'], 'password' => ['required', 'string', 'min:8', 'max:256'], 'status' => ['sometimes', 'integer', 'in:0,1'], 'role_slugs' => ['required', 'array', 'min:1'], 'role_slugs.*' => ['string', 'max:64', 'distinct', 'exists:admin_roles,slug'], ])->validate(); $email = is_string($data['email'] ?? null) && trim($data['email']) !== '' ? trim($data['email']) : null; $roleSlugs = array_values(array_unique($data['role_slugs'])); $user = DB::transaction(function () use ($data, $email, $roleSlugs): AdminUser { $created = AdminUser::query()->create([ 'username' => $data['username'], 'name' => $data['nickname'], 'email' => $email, 'password' => $data['password'], 'status' => array_key_exists('status', $data) ? (int) $data['status'] : 0, ]); $created->syncRoleSlugsForDefaultSite($roleSlugs); return $created; }); $user->load('roles'); AuditLogger::recordForAdmin( $actor, $request, 'system', 'admin_user.create', 'admin_user', (string) $user->getKey(), null, AdminUserApiPresenter::listItem($user), ); return ApiResponse::success(AdminUserApiPresenter::listItem($user)); } }