2025-06-16 07:49:36 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Blax\Roles\Traits;
|
|
|
|
|
|
2025-06-19 11:36:10 +00:00
|
|
|
use Illuminate\Support\Collection;
|
|
|
|
|
|
2025-06-16 07:49:36 +00:00
|
|
|
trait HasPermissions
|
|
|
|
|
{
|
2025-06-19 12:45:06 +00:00
|
|
|
public function hasPermission(string $permission): bool
|
2025-06-16 07:49:36 +00:00
|
|
|
{
|
2025-07-10 08:29:53 +00:00
|
|
|
$allpermissions = $this->permissions();
|
2025-06-19 11:36:10 +00:00
|
|
|
|
2025-06-19 12:45:06 +00:00
|
|
|
if ($allpermissions->contains('slug', '*')) {
|
|
|
|
|
return true; // If any permission is '*', all permissions are granted
|
2025-06-19 11:36:10 +00:00
|
|
|
}
|
|
|
|
|
|
2025-06-19 12:45:06 +00:00
|
|
|
return $allpermissions->contains(function ($perm) use ($permission) {
|
|
|
|
|
return $perm->slug === $permission || $perm->name === $permission;
|
|
|
|
|
});
|
|
|
|
|
}
|
2025-06-19 11:36:10 +00:00
|
|
|
|
2025-06-19 12:45:06 +00:00
|
|
|
public function rolePermissions()
|
|
|
|
|
{
|
|
|
|
|
return $this->hasManyThrough(
|
|
|
|
|
config('roles.models.permission'),
|
|
|
|
|
config('roles.models.role_member'),
|
|
|
|
|
'member_id',
|
|
|
|
|
'id',
|
|
|
|
|
'id',
|
|
|
|
|
'role_id'
|
|
|
|
|
);
|
|
|
|
|
}
|
2025-06-19 11:36:10 +00:00
|
|
|
|
2025-07-10 08:29:53 +00:00
|
|
|
public function individualPermissions()
|
2025-06-19 12:45:06 +00:00
|
|
|
{
|
|
|
|
|
return $this->morphToMany(
|
|
|
|
|
config('roles.models.permission'),
|
|
|
|
|
'member',
|
|
|
|
|
config('roles.table_names.permission_member', 'permission_member')
|
|
|
|
|
);
|
2025-06-19 11:36:10 +00:00
|
|
|
}
|
|
|
|
|
|
2025-07-10 08:29:53 +00:00
|
|
|
public function permissions()
|
|
|
|
|
{
|
|
|
|
|
$rolePerms = $this->rolePermissions()->get();
|
|
|
|
|
$directPerms = $this->permissions()->get();
|
|
|
|
|
|
|
|
|
|
return $rolePerms
|
|
|
|
|
->merge($directPerms)
|
|
|
|
|
->unique('id');
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-19 12:52:09 +00:00
|
|
|
public function assignPermission($permission)
|
2025-06-19 11:36:10 +00:00
|
|
|
{
|
|
|
|
|
$permission_class = config('roles.models.permission');
|
|
|
|
|
|
|
|
|
|
if (is_numeric($permission)) {
|
|
|
|
|
$permission = $permission_class::find($permission);
|
|
|
|
|
} elseif (is_string($permission)) {
|
2025-06-19 13:08:49 +00:00
|
|
|
$permission = $permission_class::firstOrCreate([
|
|
|
|
|
'slug' => $permission
|
|
|
|
|
]);
|
2025-06-19 12:45:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($permission instanceof $permission_class) {
|
2025-06-19 11:36:10 +00:00
|
|
|
// Already a Permission instance
|
|
|
|
|
} else {
|
|
|
|
|
throw new \InvalidArgumentException('Permission must be a string, numeric ID, or an instance of Permission.');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($permission) {
|
2025-06-19 13:08:49 +00:00
|
|
|
$this->permissions()->syncWithoutDetaching($permission);
|
|
|
|
|
|
|
|
|
|
return true;
|
2025-06-19 11:36:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function removePermission($permission): bool
|
|
|
|
|
{
|
|
|
|
|
$permission_class = config('roles.models.permission');
|
|
|
|
|
|
|
|
|
|
if (is_numeric($permission)) {
|
|
|
|
|
$permission = $permission_class::find($permission);
|
|
|
|
|
} elseif (is_string($permission)) {
|
|
|
|
|
$permission = $permission_class::where('slug', $permission)->first();
|
2025-06-19 12:45:06 +00:00
|
|
|
}
|
|
|
|
|
|
2025-06-19 11:36:10 +00:00
|
|
|
if ($permission) {
|
2025-06-19 13:08:49 +00:00
|
|
|
$this->permissions()->detach($permission);
|
|
|
|
|
|
|
|
|
|
return true;
|
2025-06-19 11:36:10 +00:00
|
|
|
}
|
|
|
|
|
|
2025-06-19 13:08:49 +00:00
|
|
|
return true;
|
2025-06-19 11:36:10 +00:00
|
|
|
}
|
2025-06-16 07:49:36 +00:00
|
|
|
}
|