Add Password Reset email page
This commit is contained in:
		
							parent
							
								
									da82cf6700
								
							
						
					
					
						commit
						2a330f911f
					
				|  | @ -5,6 +5,7 @@ namespace Modules\Auth; | ||||||
| use Illuminate\Routing\Router; | use Illuminate\Routing\Router; | ||||||
| use Illuminate\Support\ServiceProvider; | use Illuminate\Support\ServiceProvider; | ||||||
| use Modules\Auth\Components\LoginForm; | use Modules\Auth\Components\LoginForm; | ||||||
|  | use Modules\Auth\Components\PasswordReset; | ||||||
| 
 | 
 | ||||||
| class AuthServiceProvider extends ServiceProvider | class AuthServiceProvider extends ServiceProvider | ||||||
| { | { | ||||||
|  | @ -26,6 +27,8 @@ class AuthServiceProvider extends ServiceProvider | ||||||
|     { |     { | ||||||
|         app(Router::class)->middleware(['web', 'guest'])->group(function ($router) { |         app(Router::class)->middleware(['web', 'guest'])->group(function ($router) { | ||||||
|             $router->get('/login', LoginForm::class)->name('login'); |             $router->get('/login', LoginForm::class)->name('login'); | ||||||
|  |             $router->get('/password/reset', PasswordReset::class)->name('password.request'); | ||||||
|  |             $router->get('/password/reseta', PasswordReset::class)->name('password.reset'); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -52,7 +52,7 @@ class LoginForm extends Component | ||||||
|                         <x-form::text name="password" wire:model="password" type="password" label="Passwort"></x-form::text> |                         <x-form::text name="password" wire:model="password" type="password" label="Passwort"></x-form::text> | ||||||
|                         <x-ui::button type="submit">Login</x-ui::button> |                         <x-ui::button type="submit">Login</x-ui::button> | ||||||
|                         <div class="flex justify-center"> |                         <div class="flex justify-center"> | ||||||
|                             <button type="button" class="text-gray-500 text-sm hover:text-gray-300" @click.prevent="$inertia.visit('/password/reset')">Passwort vergessen?</button> |                             <a href="{{route('password.request')}}" class="text-gray-500 text-sm hover:text-gray-300">Passwort vergessen?</a> | ||||||
|                         </div> |                         </div> | ||||||
|                     </div> |                     </div> | ||||||
|                 </form> |                 </form> | ||||||
|  |  | ||||||
|  | @ -23,7 +23,8 @@ it('displays component', function () { | ||||||
| it('displays form', function () { | it('displays form', function () { | ||||||
|     Livewire::test(LoginForm::class) |     Livewire::test(LoginForm::class) | ||||||
|         ->assertSee('Login') |         ->assertSee('Login') | ||||||
|         ->assertSee('Passwort vergessen'); |         ->assertSee('Passwort vergessen') | ||||||
|  |         ->assertSee(route('password.request')); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| it('loggs in', function () { | it('loggs in', function () { | ||||||
|  |  | ||||||
|  | @ -0,0 +1,66 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace Modules\Auth\Components; | ||||||
|  | 
 | ||||||
|  | use Illuminate\Foundation\Auth\SendsPasswordResetEmails; | ||||||
|  | use Illuminate\Http\Request; | ||||||
|  | use Illuminate\Validation\ValidationException; | ||||||
|  | use Livewire\Attributes\Layout; | ||||||
|  | use Livewire\Component; | ||||||
|  | 
 | ||||||
|  | class PasswordReset extends Component | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     use SendsPasswordResetEmails; | ||||||
|  | 
 | ||||||
|  |     public string $email = ''; | ||||||
|  | 
 | ||||||
|  |     protected function validateEmail(Request $request) | ||||||
|  |     { | ||||||
|  |         $this->validate([ | ||||||
|  |             'email' => 'required|max:255|string|email', | ||||||
|  |         ]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected function sendResetLinkFailedResponse(Request $request, $response) | ||||||
|  |     { | ||||||
|  |         throw ValidationException::withMessages([ | ||||||
|  |             'email' => [trans($response)], | ||||||
|  |         ]); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected function credentials(Request $request) | ||||||
|  |     { | ||||||
|  |         return ['email' => $this->email]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function submit() | ||||||
|  |     { | ||||||
|  |         $this->sendResetLinkEmail(request()); | ||||||
|  |         $this->dispatch('success', 'Du hast weitere Instruktionen per E-Mail erhalten.'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[Layout('components.layouts.full')]
 | ||||||
|  |     public function render(): string | ||||||
|  |     { | ||||||
|  |         return <<<'HTML' | ||||||
|  |             <x-page::full heading="Passwort vergessen" title="Passwort vergessen"> | ||||||
|  |                 <form wire:submit.prevent="submit"> | ||||||
|  |                     <div class="grid gap-5"> | ||||||
|  |                         <span class="text-gray-500 text-sm" | ||||||
|  |                             >Hier kannst du dein Passwort zurücksetzen.<br /> | ||||||
|  |                             Gebe dafür die E-Mail-Adresse deines Benutzerkontos ein.<br /> | ||||||
|  |                             Anschließend bekommst du eine E-Mail<br /> | ||||||
|  |                             mit weiteren Anweisungen.</span | ||||||
|  |                         > | ||||||
|  |                         <x-form::text name="email" wire:model="email" label="E-Mail-Adresse"></x-form::text> | ||||||
|  |                         <x-ui::button type="submit">Passwort zurücksetzen</x-ui::button> | ||||||
|  |                         <div class="flex justify-center"> | ||||||
|  |                             <a href="/login" class="text-gray-500 text-sm hover:text-gray-300">Zurück zum Login</a> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                 </form> | ||||||
|  |             </x-page::full> | ||||||
|  |         HTML; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,53 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace Modules\Auth\Components; | ||||||
|  | 
 | ||||||
|  | use App\Auth\ResetPassword; | ||||||
|  | use App\User; | ||||||
|  | use Illuminate\Auth\Events\Lockout; | ||||||
|  | use Tests\TestCase; | ||||||
|  | use Illuminate\Foundation\Testing\DatabaseTransactions; | ||||||
|  | use Illuminate\Support\Facades\Event; | ||||||
|  | use Illuminate\Support\Facades\Mail; | ||||||
|  | use Illuminate\Support\Facades\Notification; | ||||||
|  | use Livewire\Livewire; | ||||||
|  | 
 | ||||||
|  | uses(TestCase::class); | ||||||
|  | uses(DatabaseTransactions::class); | ||||||
|  | 
 | ||||||
|  | it('displays component', function () { | ||||||
|  |     test()->get(route('password.request'))->assertSeeLivewire(PasswordReset::class)->assertDontSee('Dashboard'); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | it('shows intro', function () { | ||||||
|  |     Livewire::test(PasswordReset::class)->assertSee('Hier kannst du dein Passwort zurücksetzen.'); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | it('it needs email address', function (string $email, string $error) { | ||||||
|  |     Livewire::test(PasswordReset::class) | ||||||
|  |         ->set('email', $email) | ||||||
|  |         ->call('submit') | ||||||
|  |         ->assertHasErrors(['email' => $error]); | ||||||
|  | }) | ||||||
|  |     ->with([ | ||||||
|  |         ['', 'E-Mail Adresse ist erforderlich.'], | ||||||
|  |         ['aaa', 'E-Mail Adresse muss eine gültige E-Mail-Adresse sein.'], | ||||||
|  |     ]); | ||||||
|  | 
 | ||||||
|  | it('displays error when user doesnt exsst', function () { | ||||||
|  |     Livewire::test(PasswordReset::class) | ||||||
|  |         ->set('email', 'nowhere@example.com') | ||||||
|  |         ->call('submit') | ||||||
|  |         ->assertHasErrors(['email' => 'Es konnte leider kein Nutzer mit dieser E-Mail-Adresse gefunden werden.']); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | it('requests link', function () { | ||||||
|  |     Notification::fake(); | ||||||
|  |     $user = User::factory()->loginData('admin@example.com', 'secret')->create(); | ||||||
|  |     Livewire::test(PasswordReset::class) | ||||||
|  |         ->set('email', 'admin@example.com') | ||||||
|  |         ->call('submit') | ||||||
|  |         ->assertDispatched('success', 'Du hast weitere Instruktionen per E-Mail erhalten.'); | ||||||
|  | 
 | ||||||
|  |     Notification::assertSentTo($user, ResetPassword::class); | ||||||
|  | }); | ||||||
		Loading…
	
		Reference in New Issue