From 5179b00e3e175d2018084011364550b1fdbf313b Mon Sep 17 00:00:00 2001 From: Paco Barba Date: Wed, 30 Oct 2024 23:18:15 +0100 Subject: [PATCH 1/8] new users threads delete route --- routes/web.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/routes/web.php b/routes/web.php index d5146396c..3e141b0bb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -138,6 +138,8 @@ Route::put('users/{username}/unban', [UsersController::class, 'unban'])->name('.users.unban'); Route::delete('users/{username}', [UsersController::class, 'delete'])->name('.users.delete'); + Route::delete('users/{username}/threads', [UsersController::class, 'deleteThreads'])->name('.users.threads.delete'); + // Articles Route::put('articles/{article}/approve', [AdminArticlesController::class, 'approve'])->name('.articles.approve'); Route::put('articles/{article}/disapprove', [AdminArticlesController::class, 'disapprove'])->name('.articles.disapprove'); From ce3b1f33eb7ba0f07597b9dfe99bee2980ab5f09 Mon Sep 17 00:00:00 2001 From: Paco Barba Date: Wed, 30 Oct 2024 23:18:29 +0100 Subject: [PATCH 2/8] new job to delete user threads --- app/Jobs/DeleteUserThreads.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/Jobs/DeleteUserThreads.php diff --git a/app/Jobs/DeleteUserThreads.php b/app/Jobs/DeleteUserThreads.php new file mode 100644 index 000000000..445b9dc4f --- /dev/null +++ b/app/Jobs/DeleteUserThreads.php @@ -0,0 +1,15 @@ +user->deleteThreads(); + } +} From 8f659302405d9dc0097abba0e2a5a02f3603cfab Mon Sep 17 00:00:00 2001 From: Paco Barba Date: Wed, 30 Oct 2024 23:18:44 +0100 Subject: [PATCH 3/8] add option in admin panel to delete threads --- resources/views/admin/users.blade.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/resources/views/admin/users.blade.php b/resources/views/admin/users.blade.php index 72c104266..39ae38262 100644 --- a/resources/views/admin/users.blade.php +++ b/resources/views/admin/users.blade.php @@ -68,7 +68,7 @@ {{ $user->createdAt()->format('j M Y H:i:s') }} - + @@ -81,6 +81,14 @@

Deleting this user will remove their account and any related content like threads & replies. This cannot be undone.

+ + + + +

All the threads from this user will be deleted. This cannot be undone.

+
@endcan
From 67a3217d3568c63632877f0bd99c8790c2d66233 Mon Sep 17 00:00:00 2001 From: Paco Barba Date: Wed, 30 Oct 2024 23:19:08 +0100 Subject: [PATCH 4/8] add new logic on controller to delete threads from user and from banning them --- app/Http/Controllers/Admin/UsersController.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/app/Http/Controllers/Admin/UsersController.php b/app/Http/Controllers/Admin/UsersController.php index c24441d22..f48615c18 100644 --- a/app/Http/Controllers/Admin/UsersController.php +++ b/app/Http/Controllers/Admin/UsersController.php @@ -7,6 +7,7 @@ use App\Http\Requests\BanRequest; use App\Jobs\BanUser; use App\Jobs\DeleteUser; +use App\Jobs\DeleteUserThreads; use App\Jobs\UnbanUser; use App\Models\User; use App\Policies\UserPolicy; @@ -39,6 +40,10 @@ public function ban(BanRequest $request, User $user): RedirectResponse $this->dispatchSync(new BanUser($user, $request->get('reason'))); + if ($request->get('delete_threads')) { + $this->dispatchSync(new DeleteUserThreads($user)); + } + $this->success($user->name().' was banned!'); return redirect()->route('profile', $user->username()); @@ -65,4 +70,17 @@ public function delete(User $user): RedirectResponse return redirect()->route('admin.users'); } + + public function deleteThreads(User $user): RedirectResponse + { + $this->authorize(UserPolicy::DELETE, $user); + + $this->dispatchSync(new DeleteUserThreads($user)); + + $this->success($user->name().' threads were deleted!'); + + return redirect()->route('admin.users'); + } + + } From e795f2dbc878c1155d33ad2d293d51c15cfc2595 Mon Sep 17 00:00:00 2001 From: Paco Barba Date: Wed, 30 Oct 2024 23:19:29 +0100 Subject: [PATCH 5/8] delete_threads param validation when banning user --- app/Http/Requests/BanRequest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Http/Requests/BanRequest.php b/app/Http/Requests/BanRequest.php index 252626d74..9b7bda2b1 100644 --- a/app/Http/Requests/BanRequest.php +++ b/app/Http/Requests/BanRequest.php @@ -15,6 +15,7 @@ public function rules(): array { return [ 'reason' => 'required|string', + 'delete_threads' => 'required|boolean', ]; } From 202f67dcd28bfa2785be1732965594b50609e4d1 Mon Sep 17 00:00:00 2001 From: Paco Barba Date: Wed, 30 Oct 2024 23:19:42 +0100 Subject: [PATCH 6/8] add checkbox to delete threads or not when banning user --- resources/views/users/profile.blade.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/views/users/profile.blade.php b/resources/views/users/profile.blade.php index d5c60afff..c77b29a27 100644 --- a/resources/views/users/profile.blade.php +++ b/resources/views/users/profile.blade.php @@ -238,8 +238,11 @@ class="w-full bg-center bg-gray-800 h-60 container mx-auto" type="update" >

Banning this user will prevent them from logging in, posting threads and replying to threads.

-
+
+ + Delete threads +
@endif From 5acc43e728b70f3f6f6418e8d92a008d9338a62c Mon Sep 17 00:00:00 2001 From: Paco Barba Date: Wed, 30 Oct 2024 23:20:03 +0100 Subject: [PATCH 7/8] added test suite --- tests/Feature/AdminTest.php | 28 +++++++++++++++++-- .../Jobs/DeleteUserThreadsTest.php | 21 ++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/Integration/Jobs/DeleteUserThreadsTest.php diff --git a/tests/Feature/AdminTest.php b/tests/Feature/AdminTest.php index c7b748733..bac4da402 100644 --- a/tests/Feature/AdminTest.php +++ b/tests/Feature/AdminTest.php @@ -41,12 +41,24 @@ assertCanBanUsers(); }); +test('admins can ban a user and delete their threads', function () { + $this->loginAsAdmin(); + + assertCanBanUsersAndDeleteThreads(); +}); + test('moderators can ban a user', function () { $this->loginAsModerator(); assertCanBanUsers(); }); +test('moderators can ban a user and delete their threads', function () { + $this->loginAsModerator(); + + assertCanBanUsersAndDeleteThreads(); +}); + test('admins can unban a user', function () { $this->loginAsAdmin(); @@ -366,11 +378,23 @@ function assertCanBanUsers() { $user = User::factory()->create(['name' => 'Freek Murze']); - test()->put('/admin/users/'.$user->username().'/ban', ['reason' => 'A good reason']) + test()->put('/admin/users/'.$user->username().'/ban', ['reason' => 'A good reason', 'delete_threads' => false]) + ->assertRedirect('/user/'.$user->username()); + + test()->assertDatabaseMissing('users', ['id' => $user->id(), 'banned_at' => null]); + test()->assertDatabaseHas('users', ['id' => $user->id(), 'banned_reason' => 'A good reason']); +} + +function assertCanBanUsersAndDeleteThreads() +{ + $user = User::factory()->create(['name' => 'Freek Murze']); + + test()->put('/admin/users/'.$user->username().'/ban', ['reason' => 'A good reason', 'delete_threads' => true]) ->assertRedirect('/user/'.$user->username()); test()->assertDatabaseMissing('users', ['id' => $user->id(), 'banned_at' => null]); test()->assertDatabaseHas('users', ['id' => $user->id(), 'banned_reason' => 'A good reason']); + test()->assertDatabaseMissing('threads', ['author_id' => $user->id()]); } function assertCanUnbanUsers() @@ -397,6 +421,6 @@ function assertCannotBanUsersByType(int $type) { $user = User::factory()->create(['type' => $type]); - test()->put('/admin/users/'.$user->username().'/ban', ['reason' => 'A good reason']) + test()->put('/admin/users/'.$user->username().'/ban', ['reason' => 'A good reason', 'delete_threads' => fake()->boolean()]) ->assertForbidden(); } diff --git a/tests/Integration/Jobs/DeleteUserThreadsTest.php b/tests/Integration/Jobs/DeleteUserThreadsTest.php new file mode 100644 index 000000000..bc6907773 --- /dev/null +++ b/tests/Integration/Jobs/DeleteUserThreadsTest.php @@ -0,0 +1,21 @@ +create(); + + Thread::factory()->for($user, 'authorRelation')->count(5)->create(); + + $this->loginAsAdmin(); + $this->dispatch(new DeleteUserThreads($user)); + + $this->assertDatabaseMissing('threads', ['author_id' => $user->id()]); +}); From cbb338d292f553eac85d17b8db72fbe0836e8a64 Mon Sep 17 00:00:00 2001 From: Dries Vints Date: Wed, 20 Nov 2024 20:00:29 +0100 Subject: [PATCH 8/8] wip --- app/Http/Controllers/Admin/UsersController.php | 4 +--- app/Http/Requests/BanRequest.php | 7 ++++++- resources/views/admin/users.blade.php | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Admin/UsersController.php b/app/Http/Controllers/Admin/UsersController.php index f48615c18..9474ccb0b 100644 --- a/app/Http/Controllers/Admin/UsersController.php +++ b/app/Http/Controllers/Admin/UsersController.php @@ -40,7 +40,7 @@ public function ban(BanRequest $request, User $user): RedirectResponse $this->dispatchSync(new BanUser($user, $request->get('reason'))); - if ($request->get('delete_threads')) { + if ($request->willDeleteThreads()) { $this->dispatchSync(new DeleteUserThreads($user)); } @@ -81,6 +81,4 @@ public function deleteThreads(User $user): RedirectResponse return redirect()->route('admin.users'); } - - } diff --git a/app/Http/Requests/BanRequest.php b/app/Http/Requests/BanRequest.php index 9b7bda2b1..1a4b3f3f7 100644 --- a/app/Http/Requests/BanRequest.php +++ b/app/Http/Requests/BanRequest.php @@ -15,7 +15,7 @@ public function rules(): array { return [ 'reason' => 'required|string', - 'delete_threads' => 'required|boolean', + 'delete_threads' => 'boolean', ]; } @@ -23,4 +23,9 @@ public function reason(): string { return $this->get('reason'); } + + public function willDeleteThreads(): bool + { + return $this->boolean('delete_threads'); + } } diff --git a/resources/views/admin/users.blade.php b/resources/views/admin/users.blade.php index 39ae38262..2ab53e2ee 100644 --- a/resources/views/admin/users.blade.php +++ b/resources/views/admin/users.blade.php @@ -68,7 +68,7 @@ {{ $user->createdAt()->format('j M Y H:i:s') }} - + @@ -83,7 +83,7 @@