146 lines
3.9 KiB
PHP
146 lines
3.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Repositories;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
use Spatie\Permission\Models\Permission;
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
class AccessControlRepository implements AccessControlRepositoryInterface
|
|
{
|
|
public function index(): array
|
|
{
|
|
return [
|
|
'roles' => Role::query()
|
|
->with('permissions:id,name')
|
|
->withCount('users')
|
|
->orderBy('name')
|
|
->get(),
|
|
'permissions' => Permission::query()
|
|
->with('roles:id,name')
|
|
->orderBy('name')
|
|
->get(),
|
|
];
|
|
}
|
|
|
|
public function createRole(array $attributes): Role
|
|
{
|
|
return DB::transaction(function () use ($attributes): Role {
|
|
$permissions = $attributes['permissions'] ?? [];
|
|
unset($attributes['permissions']);
|
|
|
|
$role = Role::query()->create([
|
|
'name' => $attributes['name'],
|
|
'guard_name' => $attributes['guard_name'] ?? 'sanctum',
|
|
]);
|
|
|
|
if (is_array($permissions) && $permissions !== []) {
|
|
$role->syncPermissions($permissions);
|
|
}
|
|
|
|
return $role->load('permissions:id,name');
|
|
});
|
|
}
|
|
|
|
public function updateRole(int $id, array $attributes): ?Role
|
|
{
|
|
return DB::transaction(function () use ($id, $attributes): ?Role {
|
|
$role = Role::query()->find($id);
|
|
|
|
if (! $role) {
|
|
return null;
|
|
}
|
|
|
|
$permissions = $attributes['permissions'] ?? null;
|
|
unset($attributes['permissions']);
|
|
|
|
if (array_key_exists('name', $attributes)) {
|
|
$role->name = $attributes['name'];
|
|
}
|
|
|
|
if (array_key_exists('guard_name', $attributes) && is_string($attributes['guard_name'])) {
|
|
$role->guard_name = $attributes['guard_name'];
|
|
}
|
|
|
|
$role->save();
|
|
|
|
if (is_array($permissions)) {
|
|
$role->syncPermissions($permissions);
|
|
}
|
|
|
|
return $role->load('permissions:id,name');
|
|
});
|
|
}
|
|
|
|
public function deleteRole(int $id): bool
|
|
{
|
|
return (bool) DB::transaction(function () use ($id): bool {
|
|
$role = Role::query()->find($id);
|
|
|
|
if (! $role) {
|
|
return false;
|
|
}
|
|
|
|
$role->delete();
|
|
|
|
return true;
|
|
});
|
|
}
|
|
|
|
public function syncRolePermissions(int $id, array $permissions): ?Role
|
|
{
|
|
return DB::transaction(function () use ($id, $permissions): ?Role {
|
|
$role = Role::query()->find($id);
|
|
|
|
if (! $role) {
|
|
return null;
|
|
}
|
|
|
|
$role->syncPermissions($permissions);
|
|
|
|
return $role->load('permissions:id,name');
|
|
});
|
|
}
|
|
|
|
public function createPermission(array $attributes): Permission
|
|
{
|
|
return Permission::query()->create([
|
|
'name' => $attributes['name'],
|
|
'guard_name' => $attributes['guard_name'] ?? 'sanctum',
|
|
]);
|
|
}
|
|
|
|
public function updatePermission(int $id, array $attributes): ?Permission
|
|
{
|
|
$permission = Permission::query()->find($id);
|
|
|
|
if (! $permission) {
|
|
return null;
|
|
}
|
|
|
|
if (array_key_exists('name', $attributes)) {
|
|
$permission->name = $attributes['name'];
|
|
}
|
|
|
|
if (array_key_exists('guard_name', $attributes) && is_string($attributes['guard_name'])) {
|
|
$permission->guard_name = $attributes['guard_name'];
|
|
}
|
|
|
|
$permission->save();
|
|
|
|
return $permission->load('roles:id,name');
|
|
}
|
|
|
|
public function deletePermission(int $id): bool
|
|
{
|
|
$permission = Permission::query()->find($id);
|
|
|
|
if (! $permission) {
|
|
return false;
|
|
}
|
|
|
|
return (bool) $permission->delete();
|
|
}
|
|
} |