<?php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Entity\JobQueue;
use App\Service\EsCache;
use App\Entity\Container;
use App\Service\EsJobQueue;
use App\Entity\CommonComment;
use Doctrine\ORM\EntityManagerInterface;
use App\Event\CommonCommentPostUpdateEvent;
use App\Event\CommonCommentPostPersistEvent;
use App\Service\JobQueueAction\SendCommentEmailAction;
use App\Service\JobQueueAction\SendUserAssignEmailAction;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CommonCommentSubscriber implements EventSubscriberInterface
{
public function __construct(
private EsCache $esCache,
private EsJobQueue $esJobQueue,
private EntityManagerInterface $_em
) {
}
public static function getSubscribedEvents(): array
{
return [
CommonCommentPostPersistEvent::NAME => 'onCreate',
CommonCommentPostUpdateEvent::NAME => 'onUpdate',
];
}
public function onCreate(CommonCommentPostPersistEvent $event)
{
$this->createNotificationMailQueue($event);
// $this->createNotificationMailQueueForRelatedUsers($event);
}
public function onUpdate(CommonCommentPostUpdateEvent $event)
{
// $this->createNotificationMailQueue($event);
}
private function createNotificationMailQueue($event)
{
$object = $event->getObject();
$userIds = $object->getAssignUsers();
$sourceElementUsers = $object->getSourceElementUsers();
$userIds = $this->getUserIds($sourceElementUsers, $userIds);
if (is_array($userIds) && count($userIds) > 0) {
$container = $this->esCache->getContainer();
$container = $this->_em->getRepository(Container::class)
->find($container->getId());
$uIds = $ugIds = [];
foreach ($userIds as $d) {
if (isset($d['type']) && $d['type'] === 'group') {
$ugIds[] = $d['id'];
} else {
$uIds[] = $d['id'];
}
}
if (count($uIds) > 0) {
$payload = [
'userIds' => $uIds,
'type' => 'CommonComment',
'objId' => $object->getId()
];
$this->esJobQueue->create(
SendUserAssignEmailAction::NAME,
json_encode($payload),
JobQueue::PRIORITY_HIGH,
$container
);
}
if (count($ugIds) > 0) {
$offset = 0;
$limit = 100;
$found = true;
do {
$objs = $this->_em->getRepository(User::class)
->findByUserGroupIds($ugIds, $limit, $offset);
if (!$objs) {
$found = false;
break;
}
$uIds = [];
foreach ($objs as $o) {
$uIds[] = $o->getId();
}
if (count($uIds) > 0) {
$payload = [
'userIds' => $uIds,
'type' => 'CommonComment',
'objId' => $object->getId()
];
$this->esJobQueue->create(
SendUserAssignEmailAction::NAME,
json_encode($payload),
JobQueue::PRIORITY_HIGH,
$container
);
}
$offset += $limit;
} while($found);
}
}
}
private function getUserIds($sourceElementUsers, $userIds)
{
if (is_array($sourceElementUsers)) {
foreach ($sourceElementUsers as $ua) {
foreach ($ua as $user) {
foreach ($userIds as $k => $uid) {
if ($user->getId() === $uid['id']) {
if (isset($uid['type']) && $uid['type'] === 'group') {
continue;
}
unset($userIds[$k]);
}
}
}
}
}
return $userIds;
}
private function createNotificationMailQueueForRelatedUsers($event)
{
$object = $event->getObject();
if (
in_array(
$object->getSource(),
[
CommonComment::SOURCE_SESSION,
CommonComment::SOURCE_ELTASK,
CommonComment::SOURCE_DOCFILEBLOCK,
CommonComment::SOURCE_VIDEOGALLERY
]
)
) {
$container = $this->esCache->getContainer();
$container = $this->_em->getRepository(Container::class)
->find($container->getId());
$targetUsers = [];
$users = $object->getSourceElementUsers();
foreach ($users as $user) {
foreach ($user as $u) {
$targetUsers[$u->getId()] = $u->getId();
}
}
if (count($targetUsers) > 0) {
$payload = [
'userIds' => $targetUsers,
'commonCommentId' => $object->getId()
];
$this->esJobQueue->create(
SendCommentEmailAction::NAME,
json_encode($payload),
JobQueue::PRIORITY_HIGH,
$container
);
}
}
}
}