Add developper role

This commit is contained in:
Jérémy Munsch 2021-07-23 11:04:09 +02:00
parent 3b0dade346
commit 4e3a1635ee
17 changed files with 61 additions and 42 deletions

View file

@ -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();

View file

@ -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')
];

View file

@ -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);

View file

@ -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');

View file

@ -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();
}
/**

View file

@ -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'
];
}

View file

@ -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();
}
/**

View file

@ -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(',')
]));
}
}

View file

@ -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);
}
}

View file

@ -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(

View file

@ -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(),

View file

@ -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()));
}
}

View file

@ -15,6 +15,6 @@ abstract class UserRoleRules extends StaticRules
protected static function userIsAdmin(User $user)
{
return $user->role->equals(Role::admin());
return $user->isAdmin();
}
}

View file

@ -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()) ?

View file

@ -24,7 +24,7 @@
</a>
@auth
<div class="collapse navbar-collapse" id="navbarSupportedContent">
@if (Auth::user()->role->equals(Role::admin()))
@if (Auth::user()->isAdmin())
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link @if(strpos(request()->route()->getName(), 'ticket') === 0)active @endif" href="{{ route('ticket.index') }}">Tickets</a>

View file

@ -7,7 +7,7 @@ $userPr = Auth::user()->projects ?? collect([]);
<label for="project" class="col-form-label">{{ __('Projet') }}</label>
<select class="form-select" name="project_id" id="project">
@foreach($projects as $project)
@if (Auth::user()->role->equals(Role::admin()))
@if (Auth::user()->isAdmin())
<option value="{{ $project->id }}" @if ($project->id == old('project_id') or (isset($ticket) and $ticket->project->id == $project->id))selected @endif>{{ $project->name }}</option>
@elseif ($userPr->filter(function($pr) use($project) { return $pr->id === $project->id; })->count())
<option value="{{ $project->id }}" selected>{{ $project->name }}</option>

View file

@ -23,7 +23,7 @@ $userPr = Auth::user()->projects ?? collect([]);
<select class="form-select" onchange="window.location='{{ route('ticket.index') }}?'+(this.value == -1 ? 'prs=-1' : 'pr='+this.value);">
<option value="-1">{{ __('Tous') }}</option>
@foreach($projects as $project)
@if (Auth::user()->role->equals(Role::admin()))
@if (Auth::user()->isAdmin())
<option value="{{ $project->id }}" @if(intval(session('tickets.pr')) == $project->id)selected="selected" @endif>{{ $project->name }}</option>
@elseif ($userPr->filter(function($pr) use($project) { return $pr->id === $project->id; })->count())
<option value="{{ $project->id }}" @if(intval(session('tickets.pr')) == $project->id)selected="selected" @endif>{{ $project->name }}</option>
@ -146,7 +146,7 @@ $userPr = Auth::user()->projects ?? collect([]);
</td>
<td>
<a href="{{ route('ticket.show', $ticket->id) }}" class="btn btn-sm btn-outline-success">{{ __('Messages') }}</a>
@if(auth()->user()->role->equals(Role::admin()))
@if(auth()->user()->isAdmin())
<a href="{{ route('ticket.edit', $ticket) }}" class="btn btn-sm btn-outline-primary">{{ __('Modifier') }}</a>
@endif
@can('delete', $ticket)