From 89eb7e1052cc34bddf8cd85d2c09ce2dd0ee34ae Mon Sep 17 00:00:00 2001 From: Matt Young Date: Tue, 16 Jul 2024 10:13:56 -0500 Subject: [PATCH] auditionadmin-23 Need ability to make a user an administrator or tabulator Administrators can now adjust user privileges on the user management screen. #23 --- app/Http/Controllers/Admin/UserController.php | 23 +++++++++++-------- app/Models/User.php | 16 ++++--------- resources/views/admin/users/edit.blade.php | 11 +++++++++ resources/views/admin/users/index.blade.php | 10 +++++++- tests/Feature/Models/UserTest.php | 16 ------------- tests/Feature/Pages/Admin/UsersEditTest.php | 2 ++ 6 files changed, 40 insertions(+), 38 deletions(-) diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 1da19b7..961089e 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -50,7 +50,7 @@ class UserController extends Controller abort(403); } - request()->validate([ + $validData = $request->validate([ 'first_name' => ['required'], 'last_name' => ['required'], 'email' => ['required', 'email'], @@ -58,14 +58,18 @@ class UserController extends Controller 'judging_preference' => ['required'], 'school_id' => ['required', 'exists:schools,id'], ]); + $validData['is_admin'] = $request->get('is_admin') == 'on' ? 1 : 0; + $validData['is_tab'] = $request->get('is_tab') == 'on' ? 1 : 0; $user->update([ - 'first_name' => request('first_name'), - 'last_name' => request('last_name'), - 'email' => request('email'), - 'cell_phone' => request('cell_phone'), - 'judging_preference' => request('judging_preference'), - 'school_id' => request('school_id'), + 'first_name' => $validData['first_name'], + 'last_name' => $validData['last_name'], + 'email' => $validData['email'], + 'cell_phone' => $validData['cell_phone'], + 'judging_preference' => $validData['judging_preference'], + 'school_id' => $validData['school_id'], + 'is_admin' => $validData['is_admin'], + 'is_tab' => $validData['is_tab'], ]); return redirect('/admin/users'); @@ -82,7 +86,7 @@ class UserController extends Controller // Generate a random password $randomPassword = Str::random(12); - $user = \App\Models\User::make([ + $user = User::make([ 'first_name' => request('first_name'), 'last_name' => request('last_name'), 'email' => request('email'), @@ -104,12 +108,13 @@ class UserController extends Controller return redirect('/admin/users'); } - public function destroy(Request $request, User $user) + public function destroy(User $user) { if (! Auth::user()->is_admin) { abort(403); } $user->delete(); + return redirect()->route('admin.users.index')->with('success', 'User deleted successfully'); } } diff --git a/app/Models/User.php b/app/Models/User.php index b1c4697..0cf53b1 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -30,6 +30,8 @@ class User extends Authenticatable implements MustVerifyEmail 'password', 'profile_image_url', 'school_id', + 'is_tab', + 'is_admin', ]; /** @@ -122,33 +124,23 @@ class User extends Authenticatable implements MustVerifyEmail return $this->belongsToMany(BonusScoreDefinition::class, 'bonus_score_judge_assignment'); } - public function advancementVotes(): HasMany - { - return $this->hasMany(JudgeAdvancementVote::class); - } - public function isJudge(): bool { return $this->judgingAssignments()->count() > 0 || $this->bonusJudgingAssignments()->count() > 0; } - /** - * Return an array of schools using the users email domain - * - * @return SchoolEmailDomain[] - */ public function possibleSchools(): Collection { if ($this->school_id) { $return[] = $this->school; - return $return; + return collect($return); } return SchoolEmailDomain::with('school')->where('domain', '=', $this->emailDomain())->get(); } - public function canTab() + public function canTab(): bool { if ($this->is_admin) { return true; diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php index c23987c..5ba71e6 100644 --- a/resources/views/admin/users/edit.blade.php +++ b/resources/views/admin/users/edit.blade.php @@ -30,6 +30,17 @@ @endforeach +
+ + Administrator + +
+
+ + Tabulator + +
+ Update User diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index d5bef00..3e4aff3 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -16,16 +16,24 @@ Email Cell Phone Judging Preference + Privileges @foreach($users as $user) - + {{ $user->full_name(true) }} {{ $user->has_school() ? $user->school->name : ' ' }} {{ $user->email }} {{ $user->cell_phone }} {{ $user->judging_preference }} + + @if($user->is_admin) + Admin + @elseif($user->is_tab) + Tabulator + @endif + @endforeach diff --git a/tests/Feature/Models/UserTest.php b/tests/Feature/Models/UserTest.php index 82baa6d..aa66ad4 100644 --- a/tests/Feature/Models/UserTest.php +++ b/tests/Feature/Models/UserTest.php @@ -1,7 +1,6 @@ and($this->user->judgingAssignments->first())->toBeInstanceOf(Room::class); }); -it('has advancement votes', function () { - // Arrange - $entries = Entry::factory()->count(5)->create(); - foreach ($entries as $entry) { - JudgeAdvancementVote::create([ - 'user_id' => $this->user->id, - 'entry_id' => $entry->id, - 'vote' => fake()->randomElement(['yes', 'no', 'dq']), - ]); - } - // Act & Assert - expect($this->user->advancementVotes->count())->toBe(5) - ->and($this->user->advancementVotes->first())->toBeInstanceOf(JudgeAdvancementVote::class); -}); - it('knows if it is a judge', function () { expect($this->user->isJudge())->toBeFalse(); Room::factory()->create()->addJudge($this->user); diff --git a/tests/Feature/Pages/Admin/UsersEditTest.php b/tests/Feature/Pages/Admin/UsersEditTest.php index b0f12a6..ffb3722 100644 --- a/tests/Feature/Pages/Admin/UsersEditTest.php +++ b/tests/Feature/Pages/Admin/UsersEditTest.php @@ -58,6 +58,8 @@ it('has all needed fields', function () { 'email', 'cell_phone', 'judging_preference', + 'is_admin', + 'is_tab', ]; // Act & Assert $response = get(route('admin.users.edit', $this->users[0])); -- 2.39.5