src/EventSubscriber/AudienceSubscriber.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Audience;
  4. use App\Entity\User;
  5. use App\Events\AudienceEvent;
  6. use App\Repository\UserRepository;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. class AudienceSubscriber implements EventSubscriberInterface
  10. {
  11.     private EntityManagerInterface $em;
  12.     private UserRepository $userRepository;
  13.     public function __construct(
  14.         EntityManagerInterface $em,
  15.         UserRepository         $userRepository
  16.     ) {
  17.         $this->em $em;
  18.         $this->userRepository $userRepository;
  19.     }
  20.     public static function getSubscribedEvents(): array
  21.     {
  22.         return [
  23.             AudienceEvent::class => 'onUpdate'
  24.         ];
  25.     }
  26.     public function onUpdate(AudienceEvent $event): void
  27.     {
  28.         $audience $event->getAudience();
  29.         if ($audience->getType() === Audience::TYPE_PUBLIC || $audience->getStatus() !== Audience::STATUS_PUBLISHED) {
  30.             return;
  31.         }
  32.         $audience->setIsGenerating(true);
  33.         foreach ($audience->getUsers() as $user) {
  34.             $audience->removeUser($user);
  35.         }
  36.         $this->em->persist($audience);
  37.         $this->em->flush();
  38.         $filter_categories $audience->getFilterCategories()->map(function ($el) {
  39.             return $el->getId();
  40.         })->getValues();
  41.         $filter_roles $audience->getFilterRoles()->map(function ($el) {
  42.             return $el->getId();
  43.         })->getValues();
  44.         $filter_tags $audience->getFilterTags()->map(function ($el) {
  45.             return $el->getId();
  46.         })->getValues();
  47.         $filter_users $audience->getFilterUsers()->map(function ($el) {
  48.             return $el->getId();
  49.         })->getValues();
  50.         $filter_workgroups $audience->getFilterWorkgroups()->map(function ($el) {
  51.             return $el->getId();
  52.         })->getValues();
  53.         $filter_workplaces $audience->getFilterWorkplaces()->map(function ($el) {
  54.             return $el->getId();
  55.         })->getValues();
  56.         $filter_events $audience->getFilterEvents()->map(function ($el) {
  57.             return $el->getId();
  58.         })->getValues();
  59.         $filters $audience->getFilters();
  60.         $users $this->userRepository->findAudienceBy(
  61.             [
  62.                 'headquarter' => $audience->getHeadquarter(),
  63.                 'status' => User::STATUS_PUBLISHED
  64.             ],
  65.             [
  66.                 'filter_categories' => $filter_categories ?? [],
  67.                 'filter_roles' => $filter_roles ?? [],
  68.                 'filter_tags' => $filter_tags ?? [],
  69.                 'filter_users' => $filter_users ?? [],
  70.                 'filter_workgroups' => $filter_workgroups ?? [],
  71.                 'filter_workplaces' => $filter_workplaces ?? [],
  72.                 'filter_gender' => $filters['gender'] ?? false,
  73.                 'filter_events' => $filter_events ?? [],
  74.             ]
  75.         );
  76.         foreach ($users as $user) {
  77.             $audience->addUser($user);
  78.         }
  79.         $audience->setIsGenerating(false);
  80.         $this->em->persist($audience);
  81.         $this->em->flush();
  82.     }
  83. }