diff --git a/app/Http/Controllers/CreateUserController.php b/app/Http/Controllers/CreateUserController.php index aa4b366..7c37cf2 100644 --- a/app/Http/Controllers/CreateUserController.php +++ b/app/Http/Controllers/CreateUserController.php @@ -18,6 +18,7 @@ public function createUsers(Request $request): RedirectResponse 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users', 'password' => 'required|string|min:8', + 'password_confirm' => 'required|string|min:8' ]); try { diff --git a/app/Livewire/Admin/CreateUser.php b/app/Livewire/Admin/CreateUser.php new file mode 100644 index 0000000..6da50f5 --- /dev/null +++ b/app/Livewire/Admin/CreateUser.php @@ -0,0 +1,85 @@ + 'required|string|max:255', + 'email' => 'required|email', + 'password' => 'required|string|min:8', + 'password_confirm' => 'required|string|same:password', // <-- Regra importante! + 'permission_level' => 'required|boolean' // ou 'required|in:0,1' + ]; + + protected $messages = [ + 'name' => 'Nome precisa ser informado.', + 'email' => 'O email precisa ser informado.', + 'password' => 'A senha precisa ter 8 ou mais caracteres.', + 'password_confirm' => 'As senhas não coincidem.', + 'permission_level' => 'Defina o nível de autorização do usuário.' + ]; + + /** + * O método de "salvar", que substitui o seu 'createUsers'. + * + * Note como injetamos o UserService direto no método! + * O Livewire cuida disso para você, assim como o Laravel faz nos controllers. + */ + public function save(UserService $userService) + { + + // 3. Valida as propriedades públicas ($this->name, $this->email, etc.) + $validated = $this->validate($this->rules, $this->messages); + // 4. Seu 'try...catch' - praticamente idêntico + try { + + // 5. CHAMA O MESMO SERVICE! Nenhuma lógica de negócio é duplicada. + $user = $userService->createUser($validated); + + // 6. O "Sucesso" (Tradução do Redirect) + + // Limpa o formulário + $this->reset(); + + // Dispara um evento para o Alpine.js fechar o modal + $this->dispatch('user-created'); + + // Envia a mesma mensagem de sucesso do seu controller + session()->flash('message', 'Usuário cadastrado com sucesso!'); + + // (Opcional) Se sua tabela de usuários for outro componente Livewire, + // você pode mandar ela atualizar assim: + // $this->dispatch('refreshUserList'); + + } catch (\Exception $e) { + + // 7. O "Erro" (Tradução do Redirect de Erro) + // Em vez de redirecionar, adicionamos o erro ao formulário + // para que o usuário veja na tela, sem refresh. + if ($e->getMessage() == 'O e-mail já está cadastrado.') { + $this->addError('email', $e->getMessage()); + } + + $this->addError('general', $e->getMessage()); + } + } + + public function render() + { + return view('livewire.admin.create-user'); + } +} diff --git a/app/Services/UserService.php b/app/Services/UserService.php index d72284f..bed4b22 100644 --- a/app/Services/UserService.php +++ b/app/Services/UserService.php @@ -11,6 +11,10 @@ class UserService public function __construct(protected User $user) {} public function createUser(array $user) { + if (User::where('email', '=', $user['email'])) { + throw new \Exception('O e-mail já está cadastrado.'); + } + return User::create($user); } } diff --git a/package-lock.json b/package-lock.json index 67005d4..bee4267 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,7 +4,9 @@ "requires": true, "packages": { "": { - "name": "nexus-linepbx", + "dependencies": { + "alpinejs": "^3.15.1" + }, "devDependencies": { "@tailwindcss/vite": "^4.0.0", "axios": "^1.11.0", @@ -1097,6 +1099,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.1.5" + } + }, + "node_modules/@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "license": "MIT" + }, + "node_modules/alpinejs": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.15.1.tgz", + "integrity": "sha512-HLO1TtiE92VajFHtLLPK8BWaK1YepV/uj31UrfoGnQ00lyFOJZ+oVY3F0DghPAwvg8sLU79pmjGQSytERa2gEg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "~3.1.1" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", diff --git a/package.json b/package.json index a5707d8..0c228c0 100644 --- a/package.json +++ b/package.json @@ -13,5 +13,8 @@ "laravel-vite-plugin": "^2.0.0", "tailwindcss": "^4.0.0", "vite": "^7.0.4" + }, + "dependencies": { + "alpinejs": "^3.15.1" } } diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 3aeba3b..91c081f 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -1,6 +1,14 @@ -