From 4e3a1635eec5333f5b5713cd1983e6a9466f2cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Fri, 23 Jul 2021 11:04:09 +0200 Subject: [PATCH] Add developper role --- app/Console/Commands/CreateUser.php | 10 ---------- app/Enums/Role.php | 3 +++ app/Http/Controllers/TicketController.php | 2 +- app/Http/Middleware/IsAdmin.php | 5 +++-- app/Http/Requests/ChangeTicketStatus.php | 5 +++-- app/Http/Requests/CreateMessage.php | 8 ++++++-- app/Http/Requests/StoreProject.php | 5 +++-- app/Http/Requests/StoreTicket.php | 12 ++++++++---- app/Http/Requests/UpdateTicket.php | 6 ++++-- app/Models/Message.php | 3 ++- app/Models/Project.php | 4 +++- app/Models/User.php | 15 ++++++++++++++- app/Policies/Rules/UserRoleRules.php | 2 +- app/Policies/TicketPolicy.php | 15 ++++++--------- resources/views/layout/app.blade.php | 2 +- resources/views/ticket/form-inputs.blade.php | 2 +- resources/views/ticket/index.blade.php | 4 ++-- 17 files changed, 61 insertions(+), 42 deletions(-) diff --git a/app/Console/Commands/CreateUser.php b/app/Console/Commands/CreateUser.php index 16c73ea..42a270f 100644 --- a/app/Console/Commands/CreateUser.php +++ b/app/Console/Commands/CreateUser.php @@ -52,16 +52,6 @@ class CreateUser extends Command $user->role = Role::admin(); } else { $user->role = Role::client(); - try { - $project = Project::where( - 'id', - $this->ask("What's the id of the project (s)he's working on?") - )->firstOrFail(); - $user->projects()->sync([$project->id]); - } catch (ModelNotFoundException $e) { - $this->error('The project does not exists'); - return -1; - } } $user->password = Hash::make($pwd); $user->save(); diff --git a/app/Enums/Role.php b/app/Enums/Role.php index 4bd4d9b..d4a65a0 100644 --- a/app/Enums/Role.php +++ b/app/Enums/Role.php @@ -5,6 +5,7 @@ namespace App\Enums; use Kwaadpepper\Enum\BaseEnum; /** + * @method static self developper() * @method static self admin() * @method static self client() */ @@ -14,6 +15,7 @@ class Role extends BaseEnum protected static function values(): array { return [ + 'developper' => 0, 'admin' => 1, 'client' => 2 ]; @@ -22,6 +24,7 @@ class Role extends BaseEnum protected static function labels(): array { return [ + 'developper' => trans('Developpeur'), 'admin' => trans('Administrateur'), 'client' => trans('Client') ]; diff --git a/app/Http/Controllers/TicketController.php b/app/Http/Controllers/TicketController.php index b3dadab..732806b 100644 --- a/app/Http/Controllers/TicketController.php +++ b/app/Http/Controllers/TicketController.php @@ -36,7 +36,7 @@ class TicketController extends Controller /** @var \App\Models\User */ $user = auth()->user(); $tickets = Ticket::with('project')->has('project'); - if (!$user->role->equals(Role::admin())) { + if (!$user->isAdmin()) { $tickets = $tickets->whereHas('project', function ($q) use ($user) { $q->whereHas('users', function ($q) use ($user) { $q->whereId($user->id); diff --git a/app/Http/Middleware/IsAdmin.php b/app/Http/Middleware/IsAdmin.php index 0e9a7de..138af08 100644 --- a/app/Http/Middleware/IsAdmin.php +++ b/app/Http/Middleware/IsAdmin.php @@ -5,7 +5,6 @@ namespace App\Http\Middleware; use App\Enums\Role; use Closure; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; class IsAdmin { @@ -18,7 +17,9 @@ class IsAdmin */ public function handle(Request $request, Closure $next) { - if (Auth::user()->role->equals(Role::admin())) { + /** @var \App\Models\User */ + $user = auth()->user(); + if ($user->isAdmin()) { return $next($request); } return redirect()->route('home'); diff --git a/app/Http/Requests/ChangeTicketStatus.php b/app/Http/Requests/ChangeTicketStatus.php index 8386c9d..d60fdc4 100644 --- a/app/Http/Requests/ChangeTicketStatus.php +++ b/app/Http/Requests/ChangeTicketStatus.php @@ -15,8 +15,9 @@ class ChangeTicketStatus extends FormRequest */ public function authorize() { - return auth()->check() and - auth()->user()->role->equals(Role::admin()); + /** @var \App\Models\User */ + $user = auth()->user(); + return auth()->check() and $user->isAdmin(); } /** diff --git a/app/Http/Requests/CreateMessage.php b/app/Http/Requests/CreateMessage.php index cd9f9cd..301635e 100644 --- a/app/Http/Requests/CreateMessage.php +++ b/app/Http/Requests/CreateMessage.php @@ -14,10 +14,12 @@ class CreateMessage extends FormRequest */ public function authorize() { + /** @var \App\Models\User */ + $user = auth()->user(); $this->merge([ 'subscribe' => $this->subscribe ? true : false ]); - return auth()->check() and (auth()->user()->role->equals(Role::admin()) or + return auth()->check() and ($user->isAdmin() or auth()->user()->projects->contains(request()->route()->ticket->project_id)); } @@ -28,9 +30,11 @@ class CreateMessage extends FormRequest */ public function rules() { + /** @var \App\Models\User */ + $user = auth()->user(); return [ 'subscribe' => 'required|boolean', - 'message' => 'required|min:' . (auth()->user()->role->equals(Role::admin()) ? '5' : '20'), + 'message' => 'required|min:' . ($user->isAdmin() ? '5' : '20'), 'file_message' => 'sometimes|mimes:jpeg,jpg,png,pdf|max:2048' ]; } diff --git a/app/Http/Requests/StoreProject.php b/app/Http/Requests/StoreProject.php index 162b683..46fb91a 100644 --- a/app/Http/Requests/StoreProject.php +++ b/app/Http/Requests/StoreProject.php @@ -14,8 +14,9 @@ class StoreProject extends FormRequest */ public function authorize() { - return auth()->check() and - auth()->user()->role->equals(Role::admin()); + /** @var \App\Models\User */ + $user = auth()->user(); + return auth()->check() and $user->isAdmin(); } /** diff --git a/app/Http/Requests/StoreTicket.php b/app/Http/Requests/StoreTicket.php index 741d9e8..71f08a3 100644 --- a/app/Http/Requests/StoreTicket.php +++ b/app/Http/Requests/StoreTicket.php @@ -16,7 +16,9 @@ class StoreTicket extends FormRequest */ public function authorize() { - if (!auth()->user()->role->equals(Role::admin())) { + /** @var \App\Models\User */ + $user = auth()->user(); + if (!$user->isAdmin()) { $this->merge([ 'status' => TicketStatus::new()->value, ]); @@ -37,12 +39,14 @@ class StoreTicket extends FormRequest 'exists:projects,id', // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed function ($attribute, $value, $fail) { - if (auth()->user()->role->equals(Role::admin())) { + /** @var \App\Models\User */ + $user = auth()->user(); + if ($user->isAdmin()) { return; } - if (!in_array($value, auth()->user()->projects()->pluck('id')->all())) { + if (!in_array($value, $user->projects()->pluck('id')->all())) { $fail(__('Veuillez choisir entre :values', [ - 'values' => auth()->user()->projects()->pluck('name')->implode(',') + 'values' => $user->projects()->pluck('name')->implode(',') ])); } } diff --git a/app/Http/Requests/UpdateTicket.php b/app/Http/Requests/UpdateTicket.php index 040bde7..3dae5a1 100644 --- a/app/Http/Requests/UpdateTicket.php +++ b/app/Http/Requests/UpdateTicket.php @@ -9,12 +9,14 @@ class UpdateTicket extends StoreTicket { public function authorize() { - if (!auth()->user()->role->equals(Role::admin())) { + /** @var \App\Models\User */ + $user = auth()->user(); + if (!$user->isAdmin()) { $this->merge([ 'status' => $this->project->status->value, ]); } - return auth()->check() and (auth()->user()->role->equals(Role::admin()) or + return auth()->check() and ($user->isAdmin() or request()->route()->ticket->created_by === auth()->user()->id); } } diff --git a/app/Models/Message.php b/app/Models/Message.php index eebe2d1..f338502 100644 --- a/app/Models/Message.php +++ b/app/Models/Message.php @@ -48,7 +48,8 @@ class Message extends Model ->where(function ($q) use ($ticket) { $q->whereHas('projects', function ($q) use ($ticket) { $q->where('id', $ticket->project->id); - })->orWhere('role', Role::admin()->value); + })->orWhere('role', Role::admin()->value) + ->orWhere('role', Role::developper()->value); })->firstOrFail(); $usersNotified->add($user); SendTicketMentionMail::dispatchAfterResponse( diff --git a/app/Models/Project.php b/app/Models/Project.php index 58bff7c..e2946da 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -50,7 +50,9 @@ class Project extends Model 'belongsToManyLabel' => 'name', 'nullable' => true, 'readonly' => function () { - return auth()->user()->role->equals(Role::admin()) ? false : true; + /** @var \App\Models\User */ + $user = auth()->user(); + return $user->isAdmin(); }, 'actions' => [ CrudAction::viewAny(), diff --git a/app/Models/User.php b/app/Models/User.php index 8e0f7ef..0be8db9 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -130,7 +130,9 @@ class User extends Authenticatable 'belongsToManyLabel' => 'name', 'nullable' => true, 'readonly' => function () { - return auth()->user()->role->equals(Role::admin()) ? false : true; + /** @var \App\Models\User */ + $user = auth()->user(); + return $user->isAdmin(); }, 'actions' => [ CrudAction::viewAny(), @@ -185,4 +187,15 @@ class User extends Authenticatable { dispatch(new SendUserCreatedEmail($this)); } + + /** + * Is the user an admin or a developper ? + * + * @return boolean + */ + public function isAdmin(): bool + { + return ($this->role->equals(Role::developper()) or + $this->role->equals(Role::admin())); + } } diff --git a/app/Policies/Rules/UserRoleRules.php b/app/Policies/Rules/UserRoleRules.php index afbfd55..27010db 100644 --- a/app/Policies/Rules/UserRoleRules.php +++ b/app/Policies/Rules/UserRoleRules.php @@ -15,6 +15,6 @@ abstract class UserRoleRules extends StaticRules protected static function userIsAdmin(User $user) { - return $user->role->equals(Role::admin()); + return $user->isAdmin(); } } diff --git a/app/Policies/TicketPolicy.php b/app/Policies/TicketPolicy.php index c6b3e90..5372d80 100644 --- a/app/Policies/TicketPolicy.php +++ b/app/Policies/TicketPolicy.php @@ -60,7 +60,7 @@ class TicketPolicy */ public function update(User $user, Ticket $ticket) { - return Auth::user()->role->equals(Role::admin()) or $user->projects->contains($ticket->project_id); + return $user->isAdmin() or $user->projects->contains($ticket->project_id); } /** @@ -85,7 +85,7 @@ class TicketPolicy */ public function restore(User $user, Ticket $ticket) { - return Auth::user()->role->equals(Role::admin()) or $user->projects->contains($ticket->project_id); + return $user->isAdmin() or $user->projects->contains($ticket->project_id); } /** @@ -103,7 +103,9 @@ class TicketPolicy public function changeStatus(User $user) { - return $user->role->equals(Role::admin()); + /** @var \App\Models\User */ + $user = auth()->user(); + return $user->isAdmin(); } // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed @@ -119,12 +121,7 @@ class TicketPolicy //role == 1 // OR project_id IN user->projects - if ( - !( - $user->role->equals(Role::admin()) - or $user->projects->contains($ticket->project_id) ) - ) - { + if (!($user->isAdmin() or $user->projects->contains($ticket->project_id))) { return Response::deny(trans('Vous ne pouvez modifier un ticket qui ne vous appartient pas.')); } return $ticket->status->equals(TicketStatus::archived()) ? diff --git a/resources/views/layout/app.blade.php b/resources/views/layout/app.blade.php index e611d89..61f020a 100644 --- a/resources/views/layout/app.blade.php +++ b/resources/views/layout/app.blade.php @@ -24,7 +24,7 @@ @auth