diff --git a/src/Controller/PermissionController.php b/src/Controller/PermissionController.php index 1746ce09..35931ac5 100644 --- a/src/Controller/PermissionController.php +++ b/src/Controller/PermissionController.php @@ -17,6 +17,7 @@ use App\Form\RoleType; use App\Model\PermissionSection; use App\Repository\RolePermissionRepository; use App\Repository\RoleRepository; +use App\Repository\UserRepository; use App\Security\RolePermissionManager; use App\Security\RoleService; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; @@ -195,9 +196,16 @@ final class PermissionController extends AbstractController * @Route(path="/roles/{id}/delete", name="admin_user_role_delete", methods={"GET", "POST"}) * @Security("is_granted('role_permissions')") */ - public function deleteRole(Role $role): Response + public function deleteRole(Role $role, UserRepository $userRepository): Response { try { + // workaround, as roles is still a string array on users table + // until this is fixed, the users must be manually updated + $users = $userRepository->findUsersWithRole($role->getName()); + foreach ($users as $user) { + $user->removeRole($role->getName()); + $userRepository->saveUser($user); + } $this->roleRepository->deleteRole($role); $this->flashSuccess('action.delete.success'); } catch (\Exception $ex) { diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index 5817203a..65b9d650 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -9,6 +9,7 @@ namespace App\Repository; +use App\Entity\Role; use App\Entity\User; use App\Repository\Loader\UserLoader; use App\Repository\Paginator\LoaderPaginator; @@ -170,6 +171,28 @@ class UserRepository extends EntityRepository implements UserLoaderInterface } } + /** + * @param string $role + * @return User[] + * @internal + */ + public function findUsersWithRole(string $role): array + { + if ($role === User::ROLE_USER) { + return $this->findAll(); + } + + $qb = $this->getEntityManager()->createQueryBuilder(); + + $qb + ->select('u') + ->from(User::class, 'u') + ->andWhere('u.roles LIKE :role'); + $qb->setParameter('role', '%' . $role . '%'); + + return $qb->getQuery()->getResult(); + } + private function getQueryBuilderForQuery(UserQuery $query): QueryBuilder { $qb = $this->getEntityManager()->createQueryBuilder(); diff --git a/tests/Controller/PermissionControllerTest.php b/tests/Controller/PermissionControllerTest.php index 244587be..f02ed4af 100644 --- a/tests/Controller/PermissionControllerTest.php +++ b/tests/Controller/PermissionControllerTest.php @@ -9,6 +9,7 @@ namespace App\Tests\Controller; +use App\DataFixtures\UserFixtures; use App\Entity\RolePermission; use App\Entity\User; @@ -105,6 +106,23 @@ class PermissionControllerTest extends ControllerBaseTest $content = $client->getResponse()->getContent(); self::assertStringContainsString('