src/App/Subscriber/MembershipTrackSubscriber.php line 74

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\Subscriber;
  3. use App\Entity\User;
  4. use App\Event\Recurring\MembershipAdd;
  5. use App\Event\Recurring\MembershipAttempt;
  6. use App\Event\Recurring\MembershipCancel;
  7. use App\Event\Recurring\MembershipRebill;
  8. use App\RabbitMq\Handler\MembershipStatsHandler;
  9. use App\RabbitMq\TasksPool;
  10. use RuntimeException;
  11. use Symfony\Component\Console\ConsoleEvents;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpKernel\KernelEvents;
  14. use Symfony\Component\Validator\Exception\UnexpectedTypeException;
  15. class MembershipTrackSubscriber implements EventSubscriberInterface
  16. {
  17.     private TasksPool $tasksPool;
  18.     private bool $dirty false;
  19.     public function __construct(TasksPool $tasksPool)
  20.     {
  21.         $this->tasksPool $tasksPool;
  22.     }
  23.     public function onMembershipAttempt(MembershipAttempt $event): void
  24.     {
  25.         $user $event->getUser();
  26.         if (!$user instanceof User) {
  27.             throw new UnexpectedTypeException($userUser::class);
  28.         }
  29.         $this->handle($userMembershipStatsHandler::ATTEMPT);
  30.     }
  31.     public function onMembershipAdd(MembershipAdd $event): void
  32.     {
  33.         $user $event->getUser();
  34.         if (!$user instanceof User) {
  35.             throw new UnexpectedTypeException($userUser::class);
  36.         }
  37.         $this->handle($userMembershipStatsHandler::ADD);
  38.     }
  39.     public function onMembershipRebill(MembershipRebill $event): void
  40.     {
  41.         $user $event->getUser();
  42.         if (!$user instanceof User) {
  43.             throw new UnexpectedTypeException($userUser::class);
  44.         }
  45.         $this->handle($userMembershipStatsHandler::REBILL);
  46.     }
  47.     public function onMembershipCancel(MembershipCancel $event): void
  48.     {
  49.         $user $event->getUser();
  50.         if (!$user instanceof User) {
  51.             throw new UnexpectedTypeException($userUser::class);
  52.         }
  53.         $this->handle($userMembershipStatsHandler::CANCEL);
  54.     }
  55.     public function sendPool(): void
  56.     {
  57.         if (!$this->dirty) {
  58.             return;
  59.         }
  60.         $this->tasksPool->send();
  61.     }
  62.     private function handle(User $userstring $operation): void
  63.     {
  64.         if (!in_array($operation, [MembershipStatsHandler::ATTEMPTMembershipStatsHandler::ADDMembershipStatsHandler::REBILLMembershipStatsHandler::CANCEL], true)) {
  65.             throw new RuntimeException('Unknown operation given. ' $operation);
  66.         }
  67.         if (null === $user->getId()) {
  68.             throw new UnexpectedTypeException($user->getId(), 'int');
  69.         }
  70.         $this->dirty true;
  71.         $this->tasksPool->addTask(
  72.             MembershipStatsHandler::class,
  73.             'handle',
  74.             User::class,
  75.             $user->getId(),
  76.             [$operation]
  77.         );
  78.     }
  79.     /**
  80.      * @return array<string, array<int|string, array<int|string, int|string>|int|string>|string>
  81.      */
  82.     public static function getSubscribedEvents(): array
  83.     {
  84.         $events = [
  85.             MembershipAttempt::class => 'onMembershipAttempt',
  86.             MembershipAdd::class => 'onMembershipAdd',
  87.             MembershipRebill::class => 'onMembershipRebill',
  88.             MembershipCancel::class => 'onMembershipCancel',
  89.         ];
  90.         if (class_exists(KernelEvents::class)) {
  91.             $events[KernelEvents::TERMINATE] = 'sendPool';
  92.         }
  93.         if (class_exists(ConsoleEvents::class)) {
  94.             $events[ConsoleEvents::TERMINATE] = 'sendPool';
  95.         }
  96.         return $events;
  97.     }
  98. }