129 lines
3.0 KiB
PHP
129 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Traits;
|
|
|
|
use App\Enums\Role;
|
|
use Cache;
|
|
|
|
trait HasRole
|
|
{
|
|
/**
|
|
* Determine if the user has admin role.
|
|
*
|
|
* @return bool
|
|
*/
|
|
final public function isAdmin(): bool
|
|
{
|
|
return $this->hasRole(Role::ADMIN);
|
|
}
|
|
|
|
/**
|
|
* Determine if the user has role.
|
|
*
|
|
* @param Role $role
|
|
* @return bool
|
|
*/
|
|
final public function hasRole(Role|array $role): bool
|
|
{
|
|
if (is_array($role)) {
|
|
foreach ($role as $e) {
|
|
if ($this->role_id === $e->value) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
return $this->role_id === $role->value;
|
|
}
|
|
|
|
/**
|
|
* Returns the user role in the project.
|
|
*
|
|
* @param $projectId
|
|
* @return int|null
|
|
*/
|
|
final public function getProjectRole(int $projectId): ?int
|
|
{
|
|
$project = self::projects()
|
|
->where(['project_id' => $projectId])
|
|
->first();
|
|
|
|
return optional(optional($project)->pivot)->role_id;
|
|
}
|
|
|
|
/**
|
|
* Determine if the user has a role in the project.
|
|
*
|
|
* @param Role|array $role
|
|
* @param int $projectId
|
|
* @return bool
|
|
*/
|
|
final public function hasProjectRole(Role|array $role, int $projectId): bool
|
|
{
|
|
$self = $this;
|
|
$roles = Cache::store('octane')->remember(
|
|
"role_project_$self->id",
|
|
config('cache.role_caching_ttl'),
|
|
static fn() => $self->projectsRelation()
|
|
->get(['role_id', 'project_id'])
|
|
->keyBy('project_id')
|
|
->map(static fn($el) => $el->role_id)
|
|
->all(),
|
|
);
|
|
|
|
if (!isset($roles[$projectId])) {
|
|
return false;
|
|
}
|
|
|
|
if (is_array($role)) {
|
|
foreach ($role as $e) {
|
|
if ($roles[$projectId] === $e->value) {
|
|
return true;
|
|
}
|
|
}
|
|
} elseif ($roles[$projectId] === $role->value) {
|
|
return true;
|
|
}
|
|
|
|
if ($role === Role::ANY) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Determine if the user has a role in any project.
|
|
*
|
|
* @param Role|array $role
|
|
* @return bool
|
|
*/
|
|
final public function hasRoleInAnyProject(Role|array $role): bool
|
|
{
|
|
$self = $this;
|
|
$roles = Cache::store('octane')->remember(
|
|
"role_any_project_$self->id",
|
|
config('cache.role_caching_ttl'),
|
|
static fn() => $self->projectsRelation()
|
|
->get(['role_id'])
|
|
->keyBy('role_id')
|
|
->map(static fn($el) => $el->role_id)
|
|
->all(),
|
|
);
|
|
|
|
if (is_array($role)) {
|
|
foreach ($role as $e) {
|
|
if (isset($roles[$e->value])) {
|
|
return true;
|
|
}
|
|
}
|
|
} elseif (isset($roles[$role->value])) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|