vernova/app/Policies/TaskPolicy.php
2026-07-26 19:58:27 +03:30

97 lines
2.5 KiB
PHP

<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Task;
class TaskPolicy
{
/**
* Determine whether the user can view any tasks.
*/
public function viewAny(User $user): bool
{
return $user->tenant_id === session('tenant_id')
&& ($user->hasRole('admin')
|| $user->hasRole('manager')
|| $user->hasPermissionTo('view tasks'));
}
/**
* Determine whether the user can view the task.
*/
public function view(User $user, Task $task): bool
{
if ($user->tenant_id !== $task->tenant_id) {
return false;
}
// Admin and managers can view all
if ($user->hasRole('admin') || $user->hasRole('manager')) {
return true;
}
// Check if user is a member of the project
return $task->project
&& $task->project->users()->where('user_id', $user->id)->exists();
}
/**
* Determine whether the user can create tasks.
*/
public function create(User $user): bool
{
return $user->tenant_id === session('tenant_id')
&& ($user->hasRole('admin')
|| $user->hasRole('manager')
|| $user->hasPermissionTo('create tasks'));
}
/**
* Determine whether the user can update the task.
*/
public function update(User $user, Task $task): bool
{
if ($user->tenant_id !== $task->tenant_id) {
return false;
}
if ($user->hasRole('admin') || $user->hasRole('manager')) {
return true;
}
// User can update if they are the assignee or reporter
return $task->assignee_id === $user->id
|| $task->reporter_id === $user->id;
}
/**
* Determine whether the user can delete the task.
*/
public function delete(User $user, Task $task): bool
{
return $user->tenant_id === $task->tenant_id
&& ($user->hasRole('admin')
|| $user->hasPermissionTo('delete tasks'));
}
/**
* Determine whether the user can update the task status.
*/
public function updateStatus(User $user, Task $task): bool
{
if ($user->tenant_id !== $task->tenant_id) {
return false;
}
if ($user->hasRole('admin') || $user->hasRole('manager')) {
return true;
}
// User can update status if they are a member of the project
return $task->project
&& $task->project->users()->where('user_id', $user->id)->exists();
}
}