From b3d23bbed88f2afa20b69fa050264ca37faee65e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Fri, 14 Sep 2018 15:41:50 +0200 Subject: [PATCH] Filter user in user picker by flags, method to get/filter user by flag in UserRepository --- CHANGELOG.md | 5 ++++ Form/Type/UserPickerType.php | 14 +++++++-- Repository/UserRepository.php | 54 +++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5641f5207..7f593f8d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,4 +7,9 @@ Version 1.5.1 - spare ressource with recursive trigger on inserting user ; - fix error when no flags are used during edit and creation of permission group ; +Master branch +============= + +- allow to filters users shown by `UserPickerType` based on flags. This flags do an additional filter based on the flags assigned in permissions groups; +- add a method to filters users by permissions groups flags in `UserRepository` diff --git a/Form/Type/UserPickerType.php b/Form/Type/UserPickerType.php index 0d0a44fdd..a179f4740 100644 --- a/Form/Type/UserPickerType.php +++ b/Form/Type/UserPickerType.php @@ -55,7 +55,7 @@ class UserPickerType extends AbstractType /** * - * @var EntityRepository + * @var \Chill\MainBundle\Repository\UserRepository */ protected $userRepository; @@ -82,6 +82,8 @@ class UserPickerType extends AbstractType ; $resolver + ->setDefault('having_permissions_group_flag', null) + ->setAllowedTypes('having_permissions_group_flag', ['string', 'null']) ->setDefault('class', User::class) ->setDefault('placeholder', 'Choose an user') ->setDefault('choice_label', function(User $u) { @@ -89,8 +91,16 @@ class UserPickerType extends AbstractType }) ->setNormalizer('choices', function(Options $options) { - return $this->authorizationHelper + $users = $this->authorizationHelper ->findUsersReaching($options['role'], $options['center']); + + if (NULL !== $options['having_permissions_group_flag']) { + return $this->userRepository + ->findUsersHavingFlags($options['having_permissions_group_flag'], $users) + ; + } + + return $users; }) ; } diff --git a/Repository/UserRepository.php b/Repository/UserRepository.php index ca7053351..51bcda6eb 100644 --- a/Repository/UserRepository.php +++ b/Repository/UserRepository.php @@ -17,6 +17,9 @@ */ namespace Chill\MainBundle\Repository; +use Chill\MainBundle\Entity\GroupCenter; +use Chill\MainBundle\Entity\User; + /** * * @@ -46,6 +49,57 @@ class UserRepository extends \Doctrine\ORM\EntityRepository return $qb->getQuery()->getSingleResult(); } + /** + * Get the users having a specific flags + * + * If provided, only the users amongst "filtered users" are searched. This + * allows to make a first search amongst users based on role and center + * and, then filter those users having some flags. + * + * @param \Chill\MainBundle\Entity\User[] $amongstUsers + */ + public function findUsersHavingFlags($flag, $amongstUsers = []) + { + $gcs = $this->_em->createQuery("SELECT DISTINCT gc " + . "FROM ".GroupCenter::class." gc " + . "JOIN gc.permissionsGroup pg " + . "WHERE " + . "JSONB_EXISTS_IN_ARRAY(pg.flags, :flag) = :true ") + ->setParameters([ + 'true' => true, + 'flag' => $flag + ]) + ->getResult(); + + if (count($gcs) === 0) { + return []; + } + + $qb = $this->_em->createQueryBuilder(); + $qb + ->select('DISTINCT u') + ->from(User::class, 'u') + ->where("u.enabled = 'TRUE'") + ; + + $orx = $qb->expr()->orX(); + foreach($gcs as $i => $gc) { + $orx->add(':gc_'.$i.' MEMBER OF u.groupCenters'); + $qb->setParameter('gc_'.$i, $gc); + } + + $qb->andWhere($orx); + + if (count($amongstUsers) > 0) { + $qb + ->andWhere($qb->expr()->in('u', ':amongstUsers')) + ->setParameter('amongstUsers', $amongstUsers) + ; + } + + return $qb->getQuery()->getResult(); + } + protected function queryByUsernameOrEmail($pattern) { $qb = $this->createQueryBuilder('u');