diff --git a/app/Http/Controllers/Settings/ProfileController.php b/app/Http/Controllers/Settings/ProfileController.php index 9d38f31..5398878 100644 --- a/app/Http/Controllers/Settings/ProfileController.php +++ b/app/Http/Controllers/Settings/ProfileController.php @@ -66,6 +66,13 @@ class ProfileController extends Controller return to_route('profile.edit'); } + public function destroyAvatar(Request $request): RedirectResponse + { + $this->avatars->generate($request->user()); + + return to_route('profile.edit'); + } + /** * Delete the user's profile. */ diff --git a/resources/js/pages/settings/Profile.vue b/resources/js/pages/settings/Profile.vue index 89e6027..677c901 100644 --- a/resources/js/pages/settings/Profile.vue +++ b/resources/js/pages/settings/Profile.vue @@ -1,5 +1,6 @@ @@ -93,13 +107,26 @@ onBeforeUnmount(() => {
PNG, JPG, or WebP up to 2 MB.
diff --git a/routes/web/settings.php b/routes/web/settings.php index 78233a9..3c0d956 100644 --- a/routes/web/settings.php +++ b/routes/web/settings.php @@ -16,6 +16,7 @@ Route::middleware('auth') ->group(function (): void { Route::get('/', 'edit')->name('profile.edit'); Route::patch('/', 'update')->name('profile.update'); + Route::delete('avatar', 'destroyAvatar')->name('profile.avatar.destroy'); }); }); diff --git a/tests/Feature/Settings/ProfileUpdateTest.php b/tests/Feature/Settings/ProfileUpdateTest.php index 5dee781..72cee36 100644 --- a/tests/Feature/Settings/ProfileUpdateTest.php +++ b/tests/Feature/Settings/ProfileUpdateTest.php @@ -104,6 +104,37 @@ class ProfileUpdateTest extends TestCase Storage::disk('public')->assertExists($user->avatar_path); } + public function test_user_can_delete_their_uploaded_profile_picture() + { + Storage::fake('public'); + + $user = User::factory()->create([ + 'name' => 'Upload User', + 'avatar_path' => 'avatars/uploads/current.png', + 'avatar_color' => '#06B6D4', + 'avatar_is_generated' => false, + ]); + Storage::disk('public')->put($user->avatar_path, 'uploaded image'); + + $response = $this + ->actingAs($user) + ->delete(route('profile.avatar.destroy')); + + $response + ->assertSessionHasNoErrors() + ->assertRedirect(route('profile.edit')); + + $user->refresh(); + + $this->assertTrue($user->avatar_is_generated); + $this->assertSame('#06B6D4', $user->avatar_color); + $this->assertNotSame('avatars/uploads/current.png', $user->avatar_path); + $this->assertStringStartsWith('avatars/generated/', $user->avatar_path); + Storage::disk('public')->assertMissing('avatars/uploads/current.png'); + Storage::disk('public')->assertExists($user->avatar_path); + $this->assertStringContainsString('UU', Storage::disk('public')->get($user->avatar_path)); + } + public function test_name_change_regenerates_the_default_profile_picture() { Storage::fake('public');