New-Thanasoft/thanasoft-back/app/Repositories/AccessControlRepository.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();
}
}