<?php
namespace App\EventSubscriber;
use App\Entity\Audience;
use App\Entity\User;
use App\Events\AudienceEvent;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class AudienceSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $em;
private UserRepository $userRepository;
public function __construct(
EntityManagerInterface $em,
UserRepository $userRepository
) {
$this->em = $em;
$this->userRepository = $userRepository;
}
public static function getSubscribedEvents(): array
{
return [
AudienceEvent::class => 'onUpdate'
];
}
public function onUpdate(AudienceEvent $event): void
{
$audience = $event->getAudience();
if ($audience->getType() === Audience::TYPE_PUBLIC || $audience->getStatus() !== Audience::STATUS_PUBLISHED) {
return;
}
$audience->setIsGenerating(true);
foreach ($audience->getUsers() as $user) {
$audience->removeUser($user);
}
$this->em->persist($audience);
$this->em->flush();
$filter_categories = $audience->getFilterCategories()->map(function ($el) {
return $el->getId();
})->getValues();
$filter_roles = $audience->getFilterRoles()->map(function ($el) {
return $el->getId();
})->getValues();
$filter_tags = $audience->getFilterTags()->map(function ($el) {
return $el->getId();
})->getValues();
$filter_users = $audience->getFilterUsers()->map(function ($el) {
return $el->getId();
})->getValues();
$filter_workgroups = $audience->getFilterWorkgroups()->map(function ($el) {
return $el->getId();
})->getValues();
$filter_workplaces = $audience->getFilterWorkplaces()->map(function ($el) {
return $el->getId();
})->getValues();
$filter_events = $audience->getFilterEvents()->map(function ($el) {
return $el->getId();
})->getValues();
$filters = $audience->getFilters();
$users = $this->userRepository->findAudienceBy(
[
'headquarter' => $audience->getHeadquarter(),
'status' => User::STATUS_PUBLISHED
],
[
'filter_categories' => $filter_categories ?? [],
'filter_roles' => $filter_roles ?? [],
'filter_tags' => $filter_tags ?? [],
'filter_users' => $filter_users ?? [],
'filter_workgroups' => $filter_workgroups ?? [],
'filter_workplaces' => $filter_workplaces ?? [],
'filter_gender' => $filters['gender'] ?? false,
'filter_events' => $filter_events ?? [],
]
);
foreach ($users as $user) {
$audience->addUser($user);
}
$audience->setIsGenerating(false);
$this->em->persist($audience);
$this->em->flush();
}
}