diff --git a/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowRepository.php b/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowRepository.php index 13c900ffb..cd39b6e28 100644 --- a/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowRepository.php +++ b/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowRepository.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\MainBundle\Repository\Workflow; use Chill\MainBundle\Entity\User; +use Chill\MainBundle\Entity\UserGroup; use Chill\MainBundle\Entity\Workflow\EntityWorkflow; use Chill\MainBundle\Entity\Workflow\EntityWorkflowStep; use Doctrine\ORM\EntityManagerInterface; @@ -264,6 +265,7 @@ class EntityWorkflowRepository implements ObjectRepository $qb->expr()->orX( $qb->expr()->isMemberOf(':user', 'step.destUser'), $qb->expr()->isMemberOf(':user', 'step.destUserByAccessKey'), + $qb->expr()->exists(sprintf('SELECT 1 FROM %s ug WHERE ug MEMBER OF step.destUserGroups AND :user MEMBER OF ug.users', UserGroup::class)) ), $qb->expr()->isNull('step.transitionAfter'), $qb->expr()->eq('step.isFinal', "'FALSE'") diff --git a/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepRepository.php b/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepRepository.php index db57836c2..bdf47357a 100644 --- a/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepRepository.php +++ b/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepRepository.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\MainBundle\Repository\Workflow; use Chill\MainBundle\Entity\User; +use Chill\MainBundle\Entity\UserGroup; use Chill\MainBundle\Entity\Workflow\EntityWorkflowStep; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; @@ -65,7 +66,11 @@ readonly class EntityWorkflowStepRepository implements ObjectRepository $qb->where( $qb->expr()->andX( - $qb->expr()->isMemberOf(':user', 'e.destUser'), + $qb->expr()->orX( + $qb->expr()->isMemberOf(':user', 'e.destUser'), + $qb->expr()->isMemberOf(':user', 'e.destUserByAccessKey'), + $qb->expr()->exists(sprintf('SELECT 1 FROM %s ug WHERE ug MEMBER OF e.destUserGroups AND :user MEMBER OF ug.users', UserGroup::class)) + ), $qb->expr()->isNull('e.transitionAt'), $qb->expr()->eq('e.isFinal', ':bool'), ) diff --git a/src/Bundle/ChillMainBundle/Tests/Repository/EntityWorkflowRepositoryTest.php b/src/Bundle/ChillMainBundle/Tests/Repository/EntityWorkflowRepositoryTest.php index 4efb8196e..a26b29709 100644 --- a/src/Bundle/ChillMainBundle/Tests/Repository/EntityWorkflowRepositoryTest.php +++ b/src/Bundle/ChillMainBundle/Tests/Repository/EntityWorkflowRepositoryTest.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace ChillMainBundle\Tests\Repository; +use Chill\MainBundle\Entity\User; use Chill\MainBundle\Repository\Workflow\EntityWorkflowRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; @@ -43,4 +44,14 @@ class EntityWorkflowRepositoryTest extends KernelTestCase self::assertIsArray($actual, 'check that the query is successful'); } + + public function testCountQueryByDest(): void + { + $repository = new EntityWorkflowRepository($this->em); + $user = $this->em->createQuery(sprintf('SELECT u FROM %s u', User::class)) + ->setMaxResults(1)->getSingleResult(); + $actual = $repository->countByDest($user); + + self::assertIsInt($actual); + } } diff --git a/src/Bundle/ChillMainBundle/Tests/Repository/EntityWorkflowStepRepositoryTest.php b/src/Bundle/ChillMainBundle/Tests/Repository/EntityWorkflowStepRepositoryTest.php new file mode 100644 index 000000000..572f7d66b --- /dev/null +++ b/src/Bundle/ChillMainBundle/Tests/Repository/EntityWorkflowStepRepositoryTest.php @@ -0,0 +1,44 @@ +entityManager = self::getContainer()->get(EntityManagerInterface::class); + } + + public function testCountUnreadByUser(): void + { + $repository = new EntityWorkflowStepRepository($this->entityManager); + $user = $this->entityManager->createQuery(sprintf('SELECT u FROM %s u', User::class)) + ->setMaxResults(1)->getSingleResult(); + + $actual = $repository->countUnreadByUser($user); + + self::assertIsInt($actual); + } +} diff --git a/src/Bundle/ChillMainBundle/Workflow/Counter/WorkflowByUserCounter.php b/src/Bundle/ChillMainBundle/Workflow/Counter/WorkflowByUserCounter.php index a1b631265..8a6474034 100644 --- a/src/Bundle/ChillMainBundle/Workflow/Counter/WorkflowByUserCounter.php +++ b/src/Bundle/ChillMainBundle/Workflow/Counter/WorkflowByUserCounter.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\MainBundle\Workflow\Counter; use Chill\MainBundle\Entity\User; +use Chill\MainBundle\Entity\UserGroup; use Chill\MainBundle\Entity\Workflow\EntityWorkflow; use Chill\MainBundle\Repository\Workflow\EntityWorkflowStepRepository; use Chill\MainBundle\Templating\UI\NotificationCounterInterface; @@ -82,6 +83,18 @@ final readonly class WorkflowByUserCounter implements NotificationCounterInterfa foreach ($step->getDestUser() as $user) { $keys[] = self::generateCacheKeyWorkflowByUser($user); } + foreach ($step->getDestUserGroups()->reduce( + function (array $accumulator, UserGroup $userGroup) { + foreach ($userGroup->getUsers() as $user) { + $accumulator[] = $user; + } + + return $accumulator; + }, + [] + ) as $user) { + $keys[] = self::generateCacheKeyWorkflowByUser($user); + } if ([] !== $keys) { $this->cacheItemPool->deleteItems($keys);