apiService = $apiService; } public function mount() { // Check role-based access $userInfo = Session::get('userInfo'); if (!$userInfo || $userInfo['role'] != 1) { return redirect()->route('404'); } } public function create() { $this->loading = true; $this->errors = []; try { $this->validate([ 'username' => ['required', 'max:128', 'regex:/^[a-zA-Z0-9_@.ñÑ ]+$/'], 'firstname' => ['required', 'max:128', 'regex:/^[A-Za-z ñÑ-]+$/'], 'lastname' => ['required', 'max:128', 'regex:/^[A-Za-z ñÑ-]+$/'], 'email' => ['required', 'email', 'max:128', 'regex:/^[A-Za-z0-9@_.ñÑ ]+$/'], 'role' => ['required'], 'status' => ['required'], 'password' => ['required'], ], [ 'username.required' => 'Username is required!', 'username.max' => 'Maximum character is 128.', 'username.regex' => 'Invalid Username.', 'firstname.required' => 'First Name is required!', 'firstname.max' => 'Maximum character is 128.', 'firstname.regex' => 'Invalid First Name.', 'lastname.required' => 'Last Name is required!', 'lastname.max' => 'Maximum character is 128.', 'lastname.regex' => 'Invalid Last Name.', 'email.required' => 'Email is required!', 'email.email' => 'Invalid Email Address.', 'email.max' => 'Maximum character is 128.', 'email.regex' => 'Invalid Email Address.', 'role.required' => 'Role is required!', 'status.required' => 'Status is required!', 'password.required' => 'Default Password is required!', ]); $params = [ 'username' => strtolower(trim($this->username)), 'firstname' => trim($this->firstname), 'lastname' => trim($this->lastname), 'email' => $this->email, 'role' => (int)$this->role, 'status' => $this->status, 'password' => $this->password, ]; $response = $this->apiService->post('admin', $params); if ($response && isset($response['status']) && $response['status'] === 200) { Session::flash('success', 'User account created successfully. Please send the login credentials to the user.'); Log::info('User created successfully', ['source' => 'UserManagementCreate']); return redirect()->route('user-management'); } } catch (\Illuminate\Validation\ValidationException $e) { $this->errors = $e->errors(); Session::flash('error', 'Something went wrong creating new record: ' . implode(', ', array_merge(...array_values($e->errors())))); Log::error('Validation failed', ['errors' => $e->errors(), 'source' => 'UserManagementCreate']); } catch (\Exception $e) { $errorMessage = ''; if ($e->getCode() === 422) { $errors = json_decode($e->getMessage(), true)['data'] ?? []; $errorMessage = 'Something went wrong creating new record: '; if (!empty($errors['username'])) { $errorMessage .= $errors['username'][0] . ' '; } if (!empty($errors['email'])) { $errorMessage .= $errors['email'][0]; } } else { $errorMessage = 'Something went wrong creating new record: ' . $e->getMessage(); } Session::flash('error', $errorMessage); Log::error('Failed to create user', ['error' => $e->getMessage(), 'source' => 'UserManagementCreate']); } finally { $this->loading = false; } } public function generatePassword() { $this->loading = true; try { // Note: React uses adminProfile to get admin_uuid, but for Create, we may not have it yet. // Assuming the API accepts no admin_uuid for new users or uses a different endpoint. $response = $this->apiService->post('generatePassword', []); if ($response && isset($response['data']['password'])) { $this->password = $response['data']['password']; $this->isGenerated = true; Session::flash('success', 'Password generated successfully.'); Log::info('Password generated', ['source' => 'UserManagementCreate']); } } catch (\Exception $e) { Session::flash('error', 'Something went wrong generating password: ' . $e->getMessage()); Log::error('Failed to generate password', ['error' => $e->getMessage(), 'source' => 'UserManagementCreate']); } finally { $this->loading = false; } } public function copyPassword() { $this->dispatchBrowserEvent('copy-password', ['password' => $this->password]); } public function render() { return view('livewire.user-management.create')->layout('layouts.app', ['title' => 'Add User']); } }