src/Subscriber/UserGroups/UserGroupMembershipSubscriber.php line 98

Open in your IDE?
  1. <?php
  2. namespace App\Subscriber\UserGroups;
  3. use App\Dictionary\UserGroupJoinMode;
  4. use App\Event\UserGroups\GroupJoinedEvent;
  5. use App\Event\UserGroups\GroupScoreUpdateEvent;
  6. use App\Event\UserGroups\JoinGroupEvent;
  7. use App\Event\UserGroups\LeaveGroupEvent;
  8. use App\Service\UserGroups\GroupMemberService;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  12. class UserGroupMembershipSubscriber implements EventSubscriberInterface
  13. {
  14.     /**
  15.      * @var GroupMemberService
  16.      */
  17.     protected $service;
  18.     /**
  19.      * @var EventDispatcherInterface
  20.      */
  21.     protected $dispatcher;
  22.     /**
  23.      * @var EntityManagerInterface
  24.      */
  25.     protected $entityManager;
  26.     /**
  27.      * UserGroupMembershipSubscriber constructor.
  28.      */
  29.     public function __construct(GroupMemberService $serviceEventDispatcherInterface $dispatcherEntityManagerInterface $entityManager)
  30.     {
  31.         $this->dispatcher $dispatcher;
  32.         $this->service $service;
  33.         $this->entityManager $entityManager;
  34.     }
  35.     protected function getDispatcher(): EventDispatcherInterface
  36.     {
  37.         return $this->dispatcher;
  38.     }
  39.     public static function getSubscribedEvents(): array
  40.     {
  41.         return [
  42.             JoinGroupEvent::class => [
  43.                 ['onGroupJoin'0],
  44.             ],
  45.             GroupJoinedEvent::class => [
  46.                 ['onGroupJoinedUpdateMemberCount'90],
  47.             ],
  48.             LeaveGroupEvent::class => [
  49.                 ['onGroupLeaveBanAlso'0],
  50.                 ['onGroupLeaveUpdateMemberCount'0],
  51.                 ['onGroupLeaveUpdateScore'0],
  52.             ],
  53.         ];
  54.     }
  55.     /**
  56.      * @throws \App\Exception\UserGroup\BannedFromGroupException
  57.      * @throws \Doctrine\ORM\ORMException
  58.      * @throws \Doctrine\ORM\OptimisticLockException
  59.      */
  60.     public function onGroupJoin(JoinGroupEvent $event): bool
  61.     {
  62.         $group $event->getGroup();
  63.         $member $event->getMember();
  64.         if (!$event->isModerator()) {
  65.             // Moderator-Joins skippen den InviteCheck
  66.             $invite $this->service->loadInvite($member$group);
  67.             if (!$invite && UserGroupJoinMode::INVITE == $group->getJoinMode()) {
  68.                 return false;
  69.             } elseif ($invite) {
  70.                 $this->service->deleteEntity($invite->getId());
  71.             }
  72.         }
  73.         $result $this->service->joinGroup($member$group$event->isModerator());
  74.         if ($result) {
  75.             $event = new GroupScoreUpdateEvent($group$event->getScore());
  76.             $this->getDispatcher()->dispatch($event);
  77.         }
  78.         return true;
  79.     }
  80.     /**
  81.      * @throws \Doctrine\ORM\ORMException
  82.      * @throws \Doctrine\ORM\OptimisticLockException
  83.      */
  84.     public function onGroupLeaveBanAlso(LeaveGroupEvent $event)
  85.     {
  86.         if (!$event->banAlso()) {
  87.             return;
  88.         }
  89.         $group $event->getGroup();
  90.         $member $event->getGroupMember()->getMember();
  91.         $operator $event->getOperator();
  92.         $this->service->banMemberFromUserGroup($group$member$operator);
  93.     }
  94.     public function onGroupLeaveUpdateScore(LeaveGroupEvent $event)
  95.     {
  96.         $group $event->getGroup();
  97.         $event = new GroupScoreUpdateEvent($group$event->getScore());
  98.         $this->getDispatcher()->dispatch($event);
  99.     }
  100.     public function onGroupLeaveUpdateMemberCount(LeaveGroupEvent $event)
  101.     {
  102.         $group $event->getGroup();
  103.         $stat $group->getUserGroupStat();
  104.         $stat->setMemberCount($stat->getMemberCount() - 1);
  105.         $this->entityManager->persist($stat);
  106.         $this->entityManager->flush();
  107.     }
  108.     public function onGroupJoinedUpdateMemberCount(GroupJoinedEvent $event)
  109.     {
  110.         $group $event->getGroup();
  111.         $stat $group->getUserGroupStat();
  112.         $stat->setMemberCount($stat->getMemberCount() + 1);
  113.         $this->entityManager->persist($stat);
  114.         $this->entityManager->flush();
  115.     }
  116. }