58 lines
1.7 KiB
PHP
58 lines
1.7 KiB
PHP
|
<?php declare(strict_types=1);
|
||
|
|
||
|
namespace App\Services\Role;
|
||
|
|
||
|
use App\Enums\Permission;
|
||
|
use App\Exceptions\Rule\RoleSyncPermissionsCommandHandlerException;
|
||
|
use App\Models\Role;
|
||
|
use App\Models\RolePermission;
|
||
|
|
||
|
final readonly class RoleSyncPermissionsCommandHandler
|
||
|
{
|
||
|
public function handle(Role $role, array $dataPermissions): Role
|
||
|
{
|
||
|
$rolePermissions = $role->permissions->pluck('id', 'permission')->toArray();
|
||
|
|
||
|
$data = $this->getInsertDeleteData($role->id, $rolePermissions, $dataPermissions);
|
||
|
|
||
|
if (!empty($data['insert'])) {
|
||
|
RolePermission::query()->insert($data['insert']);
|
||
|
}
|
||
|
|
||
|
if (!empty($data['delete'])) {
|
||
|
RolePermission::query()->whereIn('id', $data['delete'])->delete();
|
||
|
}
|
||
|
|
||
|
return $role;
|
||
|
}
|
||
|
|
||
|
private function getInsertDeleteData(int $roleId, array $rolePermissions, array $permissionsData): array
|
||
|
{
|
||
|
$data = [
|
||
|
'insert' => [],
|
||
|
'delete' => []
|
||
|
];
|
||
|
|
||
|
$permissions = Permission::toArrayListCodes();
|
||
|
foreach ($permissionsData as $permission) {
|
||
|
if (array_search($permission, $permissions) === false) {
|
||
|
throw new RoleSyncPermissionsCommandHandlerException('Таких разрешений в системе нет: ' . $permission);
|
||
|
}
|
||
|
|
||
|
if (isset($rolePermissions[$permission])) {
|
||
|
unset($rolePermissions[$permission]);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$data['insert'][] = [
|
||
|
'role_id' => $roleId,
|
||
|
'permission' => $permission,
|
||
|
];
|
||
|
}
|
||
|
|
||
|
$data['delete'] = array_values($rolePermissions);
|
||
|
|
||
|
return $data;
|
||
|
}
|
||
|
}
|