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(); } }