diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index a694e9f..7796359 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -2,7 +2,9 @@ namespace App\Http\Controllers; +use App\Http\Requests\UpdateUserRequest; use App\Models\User; +use Illuminate\Http\RedirectResponse; use Illuminate\View\View; class UserController extends Controller @@ -20,4 +22,32 @@ class UserController extends Controller 'users' => $users, ]); } + + /** + * Show the form for editing the specified user. + */ + public function edit(User $user): View + { + return view('user.edit', [ + 'user' => $user, + ]); + } + + /** + * Update the specified user. + */ + public function update(UpdateUserRequest $request, User $user): RedirectResponse + { + $user->fill($request->validated()); + + if ($user->isDirty('email')) { + $user->email_verified_at = null; + } + + $user->save(); + + return redirect() + ->route('user.edit', $user) + ->with('status', 'user-updated'); + } } diff --git a/app/Http/Requests/UpdateUserRequest.php b/app/Http/Requests/UpdateUserRequest.php new file mode 100644 index 0000000..469ee8f --- /dev/null +++ b/app/Http/Requests/UpdateUserRequest.php @@ -0,0 +1,37 @@ +|string> + */ + public function rules(): array + { + return [ + 'name' => ['required', 'string', 'max:255'], + 'email' => [ + 'required', + 'string', + 'email', + 'max:255', + Rule::unique('users', 'email')->ignore($this->route('user')), + ], + ]; + } +} diff --git a/resources/views/user/edit.blade.php b/resources/views/user/edit.blade.php new file mode 100644 index 0000000..399a4f1 --- /dev/null +++ b/resources/views/user/edit.blade.php @@ -0,0 +1,46 @@ + + +

+ {{ __('Edit User') }} +

+
+ +
+
+
+
+ @if (session('status') === 'user-updated') +
+ {{ __('User updated successfully.') }} +
+ @endif + +
+ @csrf + @method('patch') + +
+ + + +
+ +
+ + + +
+ +
+ {{ __('Save') }} + + + {{ __('Back') }} + +
+
+
+
+
+
+
\ No newline at end of file diff --git a/resources/views/user/index.blade.php b/resources/views/user/index.blade.php index 82c8dea..e1101c0 100644 --- a/resources/views/user/index.blade.php +++ b/resources/views/user/index.blade.php @@ -17,6 +17,7 @@ Name Email Created + Actions @@ -26,10 +27,15 @@ {{ $user->name }} {{ $user->email }} {{ $user->created_at?->format('Y-m-d H:i') }} + + + {{ __('Edit') }} + + @empty - + No users found. diff --git a/routes/web.php b/routes/web.php index 1dfd459..9ad00ff 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,6 +14,8 @@ Route::get('/dashboard', function () { Route::middleware('auth')->group(function () { Route::get('/user', [UserController::class, 'index'])->name('user.index'); + Route::get('/user/{user}/edit', [UserController::class, 'edit'])->name('user.edit'); + Route::patch('/user/{user}', [UserController::class, 'update'])->name('user.update'); Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); diff --git a/tests/Feature/UserTest.php b/tests/Feature/UserTest.php new file mode 100644 index 0000000..7d4b744 --- /dev/null +++ b/tests/Feature/UserTest.php @@ -0,0 +1,44 @@ +create(); + + $this->get("/user/{$user->id}/edit")->assertRedirect('/login'); +}); + +test('authenticated users can view the user edit page', function () { + $actingUser = User::factory()->create(); + $user = User::factory()->create(); + + $response = $this + ->actingAs($actingUser) + ->get("/user/{$user->id}/edit"); + + $response + ->assertSuccessful() + ->assertSee('Edit User') + ->assertSee($user->name) + ->assertSee($user->email); +}); + +test('authenticated users can update a user', function () { + $actingUser = User::factory()->create(); + $user = User::factory()->create(); + + $response = $this + ->actingAs($actingUser) + ->patch("/user/{$user->id}", [ + 'name' => 'Updated User', + 'email' => 'updated@example.com', + ]); + + $response + ->assertRedirect("/user/{$user->id}/edit"); + + $user->refresh(); + + $this->assertSame('Updated User', $user->name); + $this->assertSame('updated@example.com', $user->email); +});