From 46643f669df5b2f6ee47e7f250913ac1d5c969fc Mon Sep 17 00:00:00 2001 From: sawirricardo Date: Tue, 14 Jun 2022 15:08:02 +0700 Subject: [PATCH 01/14] add blocked users table --- ...6_14_072001_create_blocked_users_table.php | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 database/migrations/2022_06_14_072001_create_blocked_users_table.php diff --git a/database/migrations/2022_06_14_072001_create_blocked_users_table.php b/database/migrations/2022_06_14_072001_create_blocked_users_table.php new file mode 100644 index 000000000..e8cc16b40 --- /dev/null +++ b/database/migrations/2022_06_14_072001_create_blocked_users_table.php @@ -0,0 +1,23 @@ +id(); + $table->unsignedInteger('user_id')->nullable(); + $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete(); + $table->unsignedInteger('blocked_user_id')->nullable(); + $table->foreign('blocked_user_id')->references('id')->on('users')->cascadeOnDelete(); + }); + } + + public function down() + { + Schema::dropIfExists('blocked_users'); + } +}; From 8037b4dece288a1a07e93bb66a7b0e3d659e8b0d Mon Sep 17 00:00:00 2001 From: sawirricardo Date: Tue, 14 Jun 2022 15:09:12 +0700 Subject: [PATCH 02/14] add blockedUser relationship --- app/Models/User.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/Models/User.php b/app/Models/User.php index dc427f05b..54d02a9b8 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -196,6 +196,11 @@ public function replyAble(): HasMany return $this->hasMany(Reply::class, 'author_id'); } + public function blockedUsers() + { + return $this->belongsToMany(User::class, 'blocked_users', 'user_id', 'blocked_user_id'); + } + public function articles(): HasMany { return $this->hasMany(Article::class, 'author_id'); From 46277b663c9dd39fc77dc6ea1af9fc59e77ffc97 Mon Sep 17 00:00:00 2001 From: sawirricardo Date: Tue, 14 Jun 2022 15:09:26 +0700 Subject: [PATCH 03/14] add crud to blocked users list --- app/Http/Livewire/ListBlockedUsers.php | 56 +++++++++++++++++++ .../livewire/list-blocked-users.blade.php | 52 +++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 app/Http/Livewire/ListBlockedUsers.php create mode 100644 resources/views/livewire/list-blocked-users.blade.php diff --git a/app/Http/Livewire/ListBlockedUsers.php b/app/Http/Livewire/ListBlockedUsers.php new file mode 100644 index 000000000..140cc5618 --- /dev/null +++ b/app/Http/Livewire/ListBlockedUsers.php @@ -0,0 +1,56 @@ +userId = $user->getKey(); + } + + public function getBlockedUsersProperty() + { + return User::find($this->userId)->blockedUsers; + } + + public function getPotentiallyBlockedUsersProperty() + { + return User::query() + ->whereKeyNot($this->userId) + ->whereRaw('username like ? escape ?', ["%{$this->blockedUsername}%", '\\']) + ->whereNotIn('id', User::find($this->userId)->blockedUsers->pluck('id')) + ->get(); + } + + public function addBlockedUser() + { + $this->validate([ + 'blockedUsername' => [ + 'required', + Rule::exists('users', 'username') + ->whereNotIn('id', [$this->userId]) + ], + ]); + + $user = User::query()->where('username', $this->blockedUsername)->first(); + User::find($this->userId)->blockedUsers()->attach($user->getKey()); + + $this->reset('blockedUsername'); + } + + public function removeBlockedUser($username) + { + $blockedUser = User::findByUsername($username); + User::find($this->userId)->blockedUsers()->detach($blockedUser->getKey()); + + $this->reset('blockedUsername'); + } +} diff --git a/resources/views/livewire/list-blocked-users.blade.php b/resources/views/livewire/list-blocked-users.blade.php new file mode 100644 index 000000000..1bba100bd --- /dev/null +++ b/resources/views/livewire/list-blocked-users.blade.php @@ -0,0 +1,52 @@ +
+
+
+
+
+

Blocked Users

+

+ Adding these users will result in them being blocked from your account. +

+
+ @empty($this->blockedUsers) +
No Blocked users
+ @endempty +
    + @foreach ($this->blockedUsers as $user) +
  • +
    + + {{ $user->username() }} + +
    + + + Remove from blocked list + +
  • + @endforeach +
+
+
+ User name + + + + @foreach ($this->potentiallyBlockedUsers as $user) + +
+ @if ($errors->has('blockedUsername')) + {{ $errors->first('blockedUsername') }} + @endif +
+ + Add to the blocked list + +
+
+
+
+
+
From 8481c9d1f8547d18485bc017e441dfca7bef3553 Mon Sep 17 00:00:00 2001 From: sawirricardo Date: Tue, 14 Jun 2022 15:09:35 +0700 Subject: [PATCH 04/14] add crud component to the settings page --- resources/views/users/settings/settings.blade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/views/users/settings/settings.blade.php b/resources/views/users/settings/settings.blade.php index 3f059e25a..1ce399d69 100644 --- a/resources/views/users/settings/settings.blade.php +++ b/resources/views/users/settings/settings.blade.php @@ -19,6 +19,7 @@ @include('users.settings.password') @include('users.settings.api_tokens') @include('users.settings.remove') + From 8cce3f3f756fc45f236acca57b9d887303a56ba5 Mon Sep 17 00:00:00 2001 From: sawirricardo Date: Tue, 14 Jun 2022 15:18:44 +0700 Subject: [PATCH 05/14] add scopes --- app/Models/User.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/Models/User.php b/app/Models/User.php index 54d02a9b8..a4a08b7fb 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -306,4 +306,18 @@ public function scopeModerators(Builder $query) self::MODERATOR, ]); } + + public function scopeWithUsersWhoDoesntBlock(Builder $query, User $user) + { + return $query->whereDoesntHave('blockedUsers', function ($query) use ($user) { + $query->where('blocked_user_id', $user->getKey()); + }); + } + + public function scopeWithUsersWhoArentBlockedBy(Builder $query, User $user) + { + return $query->whereDoesntHave('blockedUsers', function ($query) use ($user) { + $query->where('user_id', $user->getKey()); + }); + } } From 862d4f43789ba4f5bdcce52eeba12a2a41fb70dd Mon Sep 17 00:00:00 2001 From: sawirricardo Date: Tue, 14 Jun 2022 15:19:58 +0700 Subject: [PATCH 06/14] fix styleci check --- app/Http/Livewire/ListBlockedUsers.php | 2 +- .../2022_06_14_072001_create_blocked_users_table.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/Http/Livewire/ListBlockedUsers.php b/app/Http/Livewire/ListBlockedUsers.php index 140cc5618..812172002 100644 --- a/app/Http/Livewire/ListBlockedUsers.php +++ b/app/Http/Livewire/ListBlockedUsers.php @@ -36,7 +36,7 @@ public function addBlockedUser() 'blockedUsername' => [ 'required', Rule::exists('users', 'username') - ->whereNotIn('id', [$this->userId]) + ->whereNotIn('id', [$this->userId]), ], ]); diff --git a/database/migrations/2022_06_14_072001_create_blocked_users_table.php b/database/migrations/2022_06_14_072001_create_blocked_users_table.php index e8cc16b40..6c4336583 100644 --- a/database/migrations/2022_06_14_072001_create_blocked_users_table.php +++ b/database/migrations/2022_06_14_072001_create_blocked_users_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('blocked_users', function (Blueprint $table) { From 087fbf36ab5faa6ced5281090817d3292cb2963a Mon Sep 17 00:00:00 2001 From: Ricardo Sawir <37329575+sawirricardo@users.noreply.github.com> Date: Fri, 8 Jul 2022 08:31:36 +0700 Subject: [PATCH 07/14] format code Co-authored-by: Dries Vints --- .../2022_06_14_072001_create_blocked_users_table.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/database/migrations/2022_06_14_072001_create_blocked_users_table.php b/database/migrations/2022_06_14_072001_create_blocked_users_table.php index 6c4336583..733ae69cc 100644 --- a/database/migrations/2022_06_14_072001_create_blocked_users_table.php +++ b/database/migrations/2022_06_14_072001_create_blocked_users_table.php @@ -16,9 +16,4 @@ public function up() $table->foreign('blocked_user_id')->references('id')->on('users')->cascadeOnDelete(); }); } - - public function down() - { - Schema::dropIfExists('blocked_users'); - } }; From 407e761fffbbc06fadbe317342189b0d503a7e69 Mon Sep 17 00:00:00 2001 From: Ricardo Sawir <37329575+sawirricardo@users.noreply.github.com> Date: Fri, 8 Jul 2022 08:32:14 +0700 Subject: [PATCH 08/14] reformat code Co-authored-by: Dries Vints --- resources/views/livewire/list-blocked-users.blade.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/views/livewire/list-blocked-users.blade.php b/resources/views/livewire/list-blocked-users.blade.php index 1bba100bd..c896c2922 100644 --- a/resources/views/livewire/list-blocked-users.blade.php +++ b/resources/views/livewire/list-blocked-users.blade.php @@ -8,9 +8,11 @@ Adding these users will result in them being blocked from your account.

+ @empty($this->blockedUsers)
No Blocked users
@endempty +
    @foreach ($this->blockedUsers as $user)
  • From bdd42c0453bcb33a546f39ff793a2ca5d3dbd510 Mon Sep 17 00:00:00 2001 From: Ricardo Sawir <37329575+sawirricardo@users.noreply.github.com> Date: Fri, 8 Jul 2022 08:32:34 +0700 Subject: [PATCH 09/14] reformat code Co-authored-by: Dries Vints --- resources/views/livewire/list-blocked-users.blade.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/views/livewire/list-blocked-users.blade.php b/resources/views/livewire/list-blocked-users.blade.php index c896c2922..fe0710fc1 100644 --- a/resources/views/livewire/list-blocked-users.blade.php +++ b/resources/views/livewire/list-blocked-users.blade.php @@ -39,9 +39,11 @@ @endforeach + @if ($errors->has('blockedUsername')) {{ $errors->first('blockedUsername') }} @endif +
    Add to the blocked list From bf8b76eae58e4e94cd9d8e7a8a5e8e31bc088721 Mon Sep 17 00:00:00 2001 From: sawirricardo Date: Fri, 8 Jul 2022 08:45:24 +0700 Subject: [PATCH 10/14] add avatar https://github.com/laravelio/laravel.io/pull/879#discussion_r914960998 --- .../views/livewire/list-blocked-users.blade.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/resources/views/livewire/list-blocked-users.blade.php b/resources/views/livewire/list-blocked-users.blade.php index fe0710fc1..47fd3cb38 100644 --- a/resources/views/livewire/list-blocked-users.blade.php +++ b/resources/views/livewire/list-blocked-users.blade.php @@ -16,10 +16,15 @@
      @foreach ($this->blockedUsers as $user)
    • -
      - - {{ $user->username() }} - + From ebfc86015a5a6e916bf3d0f2a8ff8086da39ceee Mon Sep 17 00:00:00 2001 From: Dries Vints Date: Wed, 27 Jul 2022 14:33:05 +0200 Subject: [PATCH 11/14] wip --- .../Settings/ApiTokenController.php | 5 +- .../Settings/BlockUserController.php | 26 ++++++++ .../Settings/PasswordController.php | 3 +- .../Settings/ProfileController.php | 3 +- .../Settings/UnblockUserController.php | 26 ++++++++ app/Http/Livewire/ListBlockedUsers.php | 56 ----------------- app/Jobs/BlockUser.php | 17 ++++++ app/Jobs/UnblockUser.php | 17 ++++++ ...6_14_072001_create_blocked_users_table.php | 4 +- database/seeders/UserSeeder.php | 5 +- lang/en/settings.php | 2 + resources/views/layouts/_nav.blade.php | 6 +- .../livewire/list-blocked-users.blade.php | 61 ------------------- .../views/users/settings/blocked.blade.php | 42 +++++++++++++ .../views/users/settings/password.blade.php | 2 +- .../views/users/settings/remove.blade.php | 6 +- .../views/users/settings/settings.blade.php | 36 +++++++++-- routes/web.php | 4 ++ 18 files changed, 184 insertions(+), 137 deletions(-) create mode 100644 app/Http/Controllers/Settings/BlockUserController.php create mode 100644 app/Http/Controllers/Settings/UnblockUserController.php delete mode 100644 app/Http/Livewire/ListBlockedUsers.php create mode 100644 app/Jobs/BlockUser.php create mode 100644 app/Jobs/UnblockUser.php delete mode 100644 resources/views/livewire/list-blocked-users.blade.php create mode 100644 resources/views/users/settings/blocked.blade.php diff --git a/app/Http/Controllers/Settings/ApiTokenController.php b/app/Http/Controllers/Settings/ApiTokenController.php index 224989b67..22ef58b43 100644 --- a/app/Http/Controllers/Settings/ApiTokenController.php +++ b/app/Http/Controllers/Settings/ApiTokenController.php @@ -8,7 +8,6 @@ use App\Jobs\CreateApiToken; use App\Jobs\DeleteApiToken; use Illuminate\Auth\Middleware\Authenticate; -use Illuminate\Support\Facades\Auth; class ApiTokenController extends Controller { @@ -19,7 +18,7 @@ public function __construct() public function store(CreateApiTokenRequest $request) { - $this->dispatchSync(new CreateApiToken($user = Auth::user(), $request->name())); + $this->dispatchSync(new CreateApiToken($user = $request->user(), $request->name())); $token = $user->tokens()->where('name', $request->name())->first(); @@ -30,7 +29,7 @@ public function store(CreateApiTokenRequest $request) public function destroy(DeleteApiTokenRequest $request) { - $this->dispatchSync(new DeleteApiToken(Auth::user(), $request->id())); + $this->dispatchSync(new DeleteApiToken($request->user(), $request->id())); $this->success('settings.api_token.deleted'); diff --git a/app/Http/Controllers/Settings/BlockUserController.php b/app/Http/Controllers/Settings/BlockUserController.php new file mode 100644 index 000000000..152ec475f --- /dev/null +++ b/app/Http/Controllers/Settings/BlockUserController.php @@ -0,0 +1,26 @@ +middleware(Authenticate::class); + } + + public function __invoke(Request $request, User $user) + { + $this->dispatchSync(new BlockUser($request->user(), $user)); + + $this->success('settings.user.blocked'); + + return redirect()->route('profile', $user); + } +} diff --git a/app/Http/Controllers/Settings/PasswordController.php b/app/Http/Controllers/Settings/PasswordController.php index 62c9fe009..d27822005 100644 --- a/app/Http/Controllers/Settings/PasswordController.php +++ b/app/Http/Controllers/Settings/PasswordController.php @@ -6,7 +6,6 @@ use App\Http\Requests\UpdatePasswordRequest; use App\Jobs\UpdatePassword; use Illuminate\Auth\Middleware\Authenticate; -use Illuminate\Support\Facades\Auth; class PasswordController extends Controller { @@ -17,7 +16,7 @@ public function __construct() public function update(UpdatePasswordRequest $request) { - $this->dispatchSync(new UpdatePassword(Auth::user(), $request->newPassword())); + $this->dispatchSync(new UpdatePassword($request->user(), $request->newPassword())); $this->success('settings.password.updated'); diff --git a/app/Http/Controllers/Settings/ProfileController.php b/app/Http/Controllers/Settings/ProfileController.php index af15a5547..dad816126 100644 --- a/app/Http/Controllers/Settings/ProfileController.php +++ b/app/Http/Controllers/Settings/ProfileController.php @@ -9,7 +9,6 @@ use App\Policies\UserPolicy; use Illuminate\Auth\Middleware\Authenticate; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; class ProfileController extends Controller { @@ -25,7 +24,7 @@ public function edit() public function update(UpdateProfileRequest $request) { - $this->dispatchSync(UpdateProfile::fromRequest(Auth::user(), $request)); + $this->dispatchSync(UpdateProfile::fromRequest($request->user(), $request)); $this->success('settings.updated'); diff --git a/app/Http/Controllers/Settings/UnblockUserController.php b/app/Http/Controllers/Settings/UnblockUserController.php new file mode 100644 index 000000000..624bfe7ee --- /dev/null +++ b/app/Http/Controllers/Settings/UnblockUserController.php @@ -0,0 +1,26 @@ +middleware(Authenticate::class); + } + + public function __invoke(Request $request, User $user) + { + $this->dispatchSync(new UnblockUser($request->user(), $user)); + + $this->success('settings.user.unblocked'); + + return redirect()->route('settings.profile'); + } +} diff --git a/app/Http/Livewire/ListBlockedUsers.php b/app/Http/Livewire/ListBlockedUsers.php deleted file mode 100644 index 812172002..000000000 --- a/app/Http/Livewire/ListBlockedUsers.php +++ /dev/null @@ -1,56 +0,0 @@ -userId = $user->getKey(); - } - - public function getBlockedUsersProperty() - { - return User::find($this->userId)->blockedUsers; - } - - public function getPotentiallyBlockedUsersProperty() - { - return User::query() - ->whereKeyNot($this->userId) - ->whereRaw('username like ? escape ?', ["%{$this->blockedUsername}%", '\\']) - ->whereNotIn('id', User::find($this->userId)->blockedUsers->pluck('id')) - ->get(); - } - - public function addBlockedUser() - { - $this->validate([ - 'blockedUsername' => [ - 'required', - Rule::exists('users', 'username') - ->whereNotIn('id', [$this->userId]), - ], - ]); - - $user = User::query()->where('username', $this->blockedUsername)->first(); - User::find($this->userId)->blockedUsers()->attach($user->getKey()); - - $this->reset('blockedUsername'); - } - - public function removeBlockedUser($username) - { - $blockedUser = User::findByUsername($username); - User::find($this->userId)->blockedUsers()->detach($blockedUser->getKey()); - - $this->reset('blockedUsername'); - } -} diff --git a/app/Jobs/BlockUser.php b/app/Jobs/BlockUser.php new file mode 100644 index 000000000..b9545f171 --- /dev/null +++ b/app/Jobs/BlockUser.php @@ -0,0 +1,17 @@ +user->blockedUsers()->attach($this->blockedUser); + } +} diff --git a/app/Jobs/UnblockUser.php b/app/Jobs/UnblockUser.php new file mode 100644 index 000000000..339ed54c4 --- /dev/null +++ b/app/Jobs/UnblockUser.php @@ -0,0 +1,17 @@ +user->blockedUsers()->detach($this->blockedUser); + } +} diff --git a/database/migrations/2022_06_14_072001_create_blocked_users_table.php b/database/migrations/2022_06_14_072001_create_blocked_users_table.php index 733ae69cc..3ff2aba3e 100644 --- a/database/migrations/2022_06_14_072001_create_blocked_users_table.php +++ b/database/migrations/2022_06_14_072001_create_blocked_users_table.php @@ -10,9 +10,9 @@ public function up() { Schema::create('blocked_users', function (Blueprint $table) { $table->id(); - $table->unsignedInteger('user_id')->nullable(); + $table->unsignedInteger('user_id'); $table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete(); - $table->unsignedInteger('blocked_user_id')->nullable(); + $table->unsignedInteger('blocked_user_id'); $table->foreign('blocked_user_id')->references('id')->on('users')->cascadeOnDelete(); }); } diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index bbe8542c3..cd0e921fa 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -13,7 +13,7 @@ class UserSeeder extends Seeder { public function run() { - User::factory()->createQuietly([ + $admin = User::factory()->createQuietly([ 'name' => 'Test User', 'email' => 'test@example.com', 'username' => 'testing', @@ -59,5 +59,8 @@ public function run() ->inRandomOrder() ->take(4) ->update(['is_pinned' => true]); + + // Block some users... + $admin->blockedUsers()->sync(range(20, 24)); } } diff --git a/lang/en/settings.php b/lang/en/settings.php index 63aaedad1..f4b8fab69 100644 --- a/lang/en/settings.php +++ b/lang/en/settings.php @@ -5,6 +5,8 @@ 'updated' => 'Settings successfully saved! If you changed your email address you\'ll receive an email address to re-confirm it.', 'deleted' => 'Account was successfully removed.', 'password.updated' => 'Password successfully changed!', + 'user.blocked' => 'User successfully blocked.', + 'user.unblocked' => 'User successfully unblocked.', 'api_token' => [ 'created' => 'API token created! Please copy the following token as it will not be shown again:', 'deleted' => 'API token successfully removed.', diff --git a/resources/views/layouts/_nav.blade.php b/resources/views/layouts/_nav.blade.php index 002e361ff..489a0fad9 100644 --- a/resources/views/layouts/_nav.blade.php +++ b/resources/views/layouts/_nav.blade.php @@ -184,7 +184,7 @@
    • @else
    • -
      +
      - + -
      +