<?php
namespace App\EventSubscriber;
use App\Entity\JobQueue;
use App\Service\EsJobQueue;
use App\Handler\ContainerHandler;
use App\Event\ContainerPreRemoveEvent;
use App\Event\ContainerPreUpdateEvent;
use App\Event\ContainerPrePersistEvent;
use App\Event\ContainerPostPersistEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Cache\TagAwareCacheInterface;
use App\Service\JobQueueAction\CloneContainerAction;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ContainerSubscriber implements EventSubscriberInterface
{
public function __construct(
private EntityManagerInterface $_em,
private ContainerHandler $containerHandler,
private TagAwareCacheInterface $esComCache,
private EsJobQueue $esJobQueue,
) {
}
public static function getSubscribedEvents(): array
{
return [
ContainerPrePersistEvent::NAME => 'preCreate',
ContainerPostPersistEvent::NAME => 'onCreate',
ContainerPreUpdateEvent::NAME => 'onUpdate',
ContainerPreRemoveEvent::NAME => 'onPreRemove'
];
}
public function preCreate(ContainerPrePersistEvent $event)
{
$object = $event->getObject();
if ($object->getCloneId() < 1) {
$object = $this->containerHandler->createDefaultNavigation($object);
$object = $this->containerHandler->createDefaultUserStaticFields($object);
}
$event->setObject($object);
}
public function onCreate(ContainerPostPersistEvent $event)
{
$object = $event->getObject();
$oldId = $object->getOldId();
if ($oldId < 1) {
$this->containerHandler->createDefaultLanguage($object);
// $this->containerHandler->createDefaultEmailTemplate($object);
} else {
$this->containerHandler->copyLanguage($object, $oldId);
$this->containerHandler->copyBackground($object, $oldId);
$this->containerHandler->copyEmailTemplate($object, $oldId);
// $this->containerHandler->copyInfoPage($object, $oldId);
$object->removeAllUserGroups();
}
$this->containerHandler->createContainerUserGroup($object);
$this->containerHandler->attachSuperAdminToContainer($object);
if ($object->getClient()->getIsCommunitySharingEnable()) {
$this->containerHandler->assignUserGroupAllUser($object);
}
if ($oldId > 0) {
$this->esJobQueue->create(
CloneContainerAction::NAME,
json_encode([
'containerId' => $object->getId()
]),
JobQueue::PRIORITY_LOW,
$object
);
}
}
public function onUpdate(ContainerPreUpdateEvent $event)
{
$object = $event->getObject();
//$this->esComCache->invalidateTags(['ES_CONTAINER_'.$object->getId(), 'ES_MY_CONTAINER_'.$object->getId()]);
$this->esComCache->invalidateTags(['ES_CONTAINER', 'ES_MY_CONTAINER', 'ES_CLIENT_CID']);
}
public function onPreRemove(ContainerPreRemoveEvent $event)
{
$object = $event->getObject();
$userGroups = $object->getUserGroups();
if ($userGroups) {
foreach ($userGroups as $userGroup) {
if ($userGroup->getIsGenerated()) {
$this->_em->remove($userGroup);
}
}
$this->_em->flush();
}
}
}