src/EventSubscriber/ProfileSubscriber.php line 110

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Email\Transactional\ProfileApprovalApprovedEmail;
  4. use App\Email\Transactional\ProfileApprovalRejectedEmail;
  5. use App\Email\Transactional\ProfileModerationPassedEmail;
  6. use App\Email\Transactional\ProfileModerationRejectedEmail;
  7. use App\Entity\Profile\Profile;
  8. use App\Entity\Sales\SidebarPlacementType;
  9. use App\Event\Profile\ConfirmationRequest\ProfileApprovalApproved;
  10. use App\Event\Profile\ConfirmationRequest\ProfileApprovalRejected;
  11. use App\Event\Profile\ConfirmationRequest\ProfileModerationRejected;
  12. use App\Event\Profile\ConfirmationRequest\ProfileModerationPassed;
  13. use App\Event\Profile\FileProcessingTaskWasCompleted;
  14. use App\Event\Profile\ProfileCommentWasAdded;
  15. use App\Event\Profile\ProfileDataChanged;
  16. use App\Event\Profile\ProfileModeratedDataChanged;
  17. use App\Event\Profile\ProfileWasCreated;
  18. use App\Event\Profile\ProfileWasDeleted;
  19. use App\Event\Profile\ProfileWasHidden;
  20. use App\Event\Profile\ProfileViewEvent;
  21. use App\Event\Profile\ProfilesShownEvent;
  22. use App\Event\Profile\ProfileWasPlacedOnAdBoard;
  23. use App\Event\Profile\ProfileWasPlacedOnTop;
  24. use App\Event\Profile\ProfileWasProlongedOnAdBoard;
  25. use App\Event\Profile\ProfileWasRemovedFromAdBoard;
  26. use App\Event\Profile\ProfileWasRemovedFromHidden;
  27. use App\Event\Profile\ProfileWasRestored;
  28. use App\Event\Profile\ProfileApprovalWasRevoked;
  29. use App\Mautic\Marketing\MauticContactActivityUpdater;
  30. use App\Mautic\Marketing\MauticContactSynchronizer;
  31. use App\Service\BonusEnrollmentService;
  32. use App\Service\EsListenersDisable;
  33. use App\Service\IpAddressService;
  34. use App\Service\ProfileAdBoardLogger;
  35. use App\Service\ProfileCtrService;
  36. use App\Service\Mailer;
  37. use App\Service\ModerationService;
  38. use App\Service\ProfileAdBoard;
  39. use App\Service\Sidebar;
  40. use App\Service\SupportMessageService;
  41. use FOS\ElasticaBundle\Persister\ObjectPersisterInterface;
  42. use FOS\ElasticaBundle\Persister\PersisterRegistry;
  43. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  44. class ProfileSubscriber implements EventSubscriberInterface
  45. {
  46.     private ObjectPersisterInterface $recommendationsPersister;
  47.     private ObjectPersisterInterface $descriptionPersister;
  48.     private ObjectPersisterInterface $keySearchPersister;
  49.     public function __construct(
  50.         private Mailer $mailer,
  51.         private ModerationService $moderationService,
  52.         private Sidebar $sidebar,
  53.         private ProfileAdBoard $profileAdBoard,
  54.         private IpAddressService $ipAddressService,
  55.         private ProfileCtrService $profileCtrService,
  56.         PersisterRegistry $persisterRegistry,
  57.         private EsListenersDisable $esListenersDisable,
  58.         private BonusEnrollmentService $bonusEnrollmentService,
  59.         private ProfileAdBoardLogger $adBoardLogger,
  60.         private MauticContactSynchronizer $mauticContactSynchronizer,
  61.         private SupportMessageService $supportMessageService,
  62.         private MauticContactActivityUpdater $mauticContactActivityUpdater,
  63.     )
  64.     {
  65.         $this->recommendationsPersister = $persisterRegistry->getPersister('recommendations', 'profile');
  66.         $this->descriptionPersister = $persisterRegistry->getPersister('description', 'profile');
  67.         $this->keySearchPersister = $persisterRegistry->getPersister('key_search', 'profile');
  68.     }
  69.     public static function getSubscribedEvents(): array
  70.     {
  71.         return [
  72.             ProfileWasCreated::NAME => 'onProfileWasCreated',
  73.             ProfileDataChanged::NAME => 'onProfileDataChanged',
  74.             ProfileWasDeleted::NAME => 'onPProfileWasDeleted',
  75.             ProfileWasRestored::NAME => 'onProfileWasRestored',
  76.             ProfileModeratedDataChanged::NAME => 'requestModeration',
  77.             ProfileWasPlacedOnAdBoard::NAME => [
  78.                 ['onProfilePlacedOnAdBoard', 0],
  79.                 ['addSidebarPlacement', 10],
  80.                 ['removePlacementHiding', 20],
  81.             ],
  82.             ProfileWasRemovedFromAdBoard::NAME => [
  83.                 ['deleteSidebarPlacement', 0],
  84.                 ['onProfileRemovedFromAdBoard', 10],
  85.             ],
  86.             ProfileWasProlongedOnAdBoard::NAME => 'prolongSidebarPlacement',
  87.             ProfileWasPlacedOnTop::NAME => 'onProfilePlacedOnTop',
  88.             ProfileWasHidden::NAME => 'onProfileWasHidden',
  89.             ProfileWasRemovedFromHidden::NAME => 'onProfileWasRemovedFromHidden',
  90.             ProfileModerationPassed::NAME => 'onProfileModerationPassed',
  91.             ProfileModerationRejected::NAME => 'onProfileModerationRejected',
  92.             ProfileApprovalApproved::NAME => [
  93.                 ['onProfileApprovalApproved', 0],
  94.                 ['enrollApprovalBonus', 10],
  95.             ],
  96.             ProfileApprovalRejected::NAME => 'onProfileApprovalRejected',
  97.             ProfileApprovalWasRevoked::NAME => 'onProfileWasUnApproved',
  98.             ProfileCommentWasAdded::NAME => 'checkIpAddressCommentBanNeeded',
  99.             ProfilesShownEvent::NAME => 'onProfilesShown',
  100.             ProfileViewEvent::NAME => 'onProfileView',
  101.             FileProcessingTaskWasCompleted::class => 'onProfileFileProcessed',
  102.         ];
  103.     }
  104.     public function onProfileWasCreated(ProfileWasCreated $profileEvent): void
  105.     {
  106.         $this->profileAdBoard->setProfileToDefaultPlacementState($profileEvent->getProfile());
  107.         $this->notifyPostUpdateListener($profileEvent->getProfile());
  108.     }
  109.     public function onProfileDataChanged(ProfileDataChanged $profileDataChanged): void
  110.     {
  111.         $profileDataChanged->getProfile()->setMauticStale30dSentAt(null);
  112.         $this->notifyPostUpdateListener($profileDataChanged->getProfile());
  113.         $this->adBoardLogger->logAfterAdBoardAction($profileDataChanged->getProfile(), 'changed', null);
  114.     }
  115.     public function onPProfileWasDeleted(ProfileWasDeleted $profileWasDeleted): void
  116.     {
  117.         $this->notifyPostUpdateListener($profileWasDeleted->getProfile());
  118.     }
  119.     public function onProfileWasRestored(ProfileWasRestored $profileWasRestored): void
  120.     {
  121.         $this->notifyPostUpdateListener($profileWasRestored->getProfile());
  122.         $this->adBoardLogger->logAfterAdBoardAction($profileWasRestored->getProfile(), 'restored', null);
  123.     }
  124.     public function requestModeration(ProfileModeratedDataChanged $profileModeratedDataChanged): void
  125.     {
  126. //        $this->moderationService->requestModeration($profileModeratedDataChanged->getProfile());
  127.     }
  128.     public function onProfilePlacedOnAdBoard(ProfileWasPlacedOnAdBoard $profileWasPlacedOnAdBoardEvent): void
  129.     {
  130.         /** @var Profile $profile */
  131.         $profile = $profileWasPlacedOnAdBoardEvent->getProfile();
  132.         if(false == $profile->isModerationPassed())
  133.             $this->moderationService->requestModeration($profile);
  134. //        $profile->setAdBoardPlacement($profileWasPlacedOnAdBoardEvent->getPlacement());
  135.         if (!$profileWasPlacedOnAdBoardEvent->getPlacement()->getType()->isFree() && null !== $profile->getOwner()) {
  136.             $this->mauticContactActivityUpdater->updateLastPaidPlacement($profile->getOwner(), $profileWasPlacedOnAdBoardEvent->getPlacement()->getPlacedAt());
  137.         }
  138.         $this->notifyPostUpdateListener($profile);
  139.         $this->adBoardLogger->logAfterAdBoardAction($profileWasPlacedOnAdBoardEvent->getProfile(), 'place', true);
  140.     }
  141.     public function addSidebarPlacement(ProfileWasPlacedOnAdBoard $profileWasPlacedOnAdBoardEvent): void
  142.     {
  143.         $placement = $profileWasPlacedOnAdBoardEvent->getPlacement();
  144.         $placementType = $placement->getType();
  145.         if($placementType->isVip() || $placementType->isUltraVip()) {
  146.             $this->sidebar->doPlaceProfileOnSidebar(
  147.                 $profileWasPlacedOnAdBoardEvent->getProfile(),
  148.                 new SidebarPlacementType($placementType->getValue()),
  149.                 $placement->getPlacementPrice(),
  150.                 $placement->getPlacedAt(),
  151.                 $placement->getPlacedUntil()
  152.             );
  153.         }
  154.     }
  155.     public function deleteSidebarPlacement(ProfileWasRemovedFromAdBoard $profileWasPlacedOnAdBoardEvent): void
  156.     {
  157.         $this->sidebar->deleteProfileFromSidebar($profileWasPlacedOnAdBoardEvent->getProfile());
  158.         $this->notifyPostUpdateListener($profileWasPlacedOnAdBoardEvent->getProfile());
  159.     }
  160.     public function prolongSidebarPlacement(ProfileWasProlongedOnAdBoard $profileWasPlacedOnAdBoardEvent): void
  161.     {
  162.         $this->sidebar->prolongProfilePlacement($profileWasPlacedOnAdBoardEvent->getProfile(), $profileWasPlacedOnAdBoardEvent->getUntil());
  163.     }
  164.     public function onProfileRemovedFromAdBoard(ProfileWasRemovedFromAdBoard $profileWasRemovedFromAdBoard): void
  165.     {
  166.         $this->adBoardLogger->logAfterAdBoardAction($profileWasRemovedFromAdBoard->getProfile(), 'remove', false);
  167.         $this->notifyPostUpdateListener($profileWasRemovedFromAdBoard->getProfile());
  168.     }
  169.     public function onProfilePlacedOnTop(ProfileWasPlacedOnTop $profileWasPlacedOnTop): void
  170.     {
  171.         if (null !== $profileWasPlacedOnTop->getProfile()->getOwner()) {
  172.             $this->mauticContactActivityUpdater->updateLastPaidPlacement(
  173.                 $profileWasPlacedOnTop->getProfile()->getOwner(),
  174.                 $profileWasPlacedOnTop->getPlacement()->getPlacedAt()
  175.             );
  176.         }
  177.         $this->notifyPostUpdateListener($profileWasPlacedOnTop->getProfile());
  178.     }
  179.     public function onProfileWasHidden(ProfileWasHidden $profileWasHidden): void
  180.     {
  181.         $this->adBoardLogger->logAfterAdBoardAction($profileWasHidden->getProfile(), 'hide', false);
  182.         $this->notifyPostUpdateListener($profileWasHidden->getProfile());
  183.     }
  184.     public function onProfileWasRemovedFromHidden(ProfileWasRemovedFromHidden $profileWasRemovedFromHidden): void
  185.     {
  186.         $this->adBoardLogger->logAfterAdBoardAction($profileWasRemovedFromHidden->getProfile(), 'unhide', null);
  187.         $this->notifyPostUpdateListener($profileWasRemovedFromHidden->getProfile());
  188.     }
  189.     public function onProfileModerationPassed(ProfileModerationPassed $moderationPassed): void
  190.     {
  191.         $message = $this->mailer->send(new ProfileModerationPassedEmail($moderationPassed->getProfile()));
  192.         $this->supportMessageService->sendSupportMessageAndReturn(
  193.             $moderationPassed->getProfile()->getOwner(),
  194.             'Модерация',
  195.             $this->mailer->getSupportMessageBody($message),
  196.             notifyByEmail: false
  197.         );
  198.         $this->notifyPostUpdateListener($moderationPassed->getProfile());
  199.     }
  200.     public function onProfileModerationRejected(ProfileModerationRejected $profileModerationRejected): void
  201.     {
  202.         $message = $this->mailer->send(new ProfileModerationRejectedEmail($profileModerationRejected->getProfile(), $profileModerationRejected->getReason(), $profileModerationRejected->getFix()));
  203.         $this->supportMessageService->sendSupportMessageAndReturn(
  204.             $profileModerationRejected->getProfile()->getOwner(),
  205.             'Модерация',
  206.             $this->mailer->getSupportMessageBody($message),
  207.             notifyByEmail: false
  208.         );
  209.         $this->notifyPostUpdateListener($profileModerationRejected->getProfile());
  210.     }
  211.     public function onProfileApprovalApproved(ProfileApprovalApproved $profileApprovalApproved): void
  212.     {
  213.         $message = $this->mailer->send(new ProfileApprovalApprovedEmail($profileApprovalApproved->getProfile()));
  214.         $this->supportMessageService->sendSupportMessageAndReturn(
  215.             $profileApprovalApproved->getProfile()->getOwner(),
  216.             'Модерация',
  217.             $this->mailer->getSupportMessageBody($message),
  218.             notifyByEmail: false
  219.         );
  220.         $this->notifyPostUpdateListener($profileApprovalApproved->getProfile());
  221.     }
  222.     public function enrollApprovalBonus(ProfileApprovalApproved $profileApprovalApproved): void
  223.     {
  224.         $this->bonusEnrollmentService->enrollApprovalBonus($profileApprovalApproved->getProfile());
  225.     }
  226.     public function onProfileApprovalRejected(ProfileApprovalRejected $profileApprovalRejected): void
  227.     {
  228.         $message = $this->mailer->send(new ProfileApprovalRejectedEmail($profileApprovalRejected->getProfile()));
  229.         $this->supportMessageService->sendSupportMessageAndReturn(
  230.             $profileApprovalRejected->getProfile()->getOwner(),
  231.             'Модерация',
  232.             $this->mailer->getSupportMessageBody($message),
  233.             notifyByEmail: false
  234.         );
  235.         $this->notifyPostUpdateListener($profileApprovalRejected->getProfile());
  236.     }
  237.     public function onProfileWasUnApproved(ProfileApprovalWasRevoked $profileApprovalRejected): void
  238.     {
  239.         if(null !== $profileApprovalRejected->getProfile()->getAdBoardPlacement() && true === $profileApprovalRejected->getProfile()->getAdBoardPlacement()->getType()->isFree()) {
  240.             $this->profileAdBoard->setProfileToDefaultPlacementState($profileApprovalRejected->getProfile());
  241.         }
  242.         $this->mauticContactSynchronizer->syncProfileOwner($profileApprovalRejected->getProfile());
  243.     }
  244.     public function removePlacementHiding(ProfileWasPlacedOnAdBoard $profileWasPlacedOnAdBoardEvent): void
  245.     {
  246. //        $this->profileAdBoard->deleteProfileHiding($profileWasPlacedOnAdBoardEvent->getProfile());
  247.         $this->adBoardLogger->logAfterAdBoardAction($profileWasPlacedOnAdBoardEvent->getProfile(), 'unhide2', true);
  248.     }
  249.     /**
  250.      * Костыль чтобы сработал слушатель сущности Profile на событие postUpdate и занес в elasticsearch изменения в случае
  251.      * добавления/удаления adBoardPlacement, т.к. само по себе изменение свойства Profile::adBoardPlacement - не производит
  252.      * событие postUpdate
  253.      */
  254.     protected function notifyPostUpdateListener(Profile $profile)
  255.     {
  256.         $this->mauticContactSynchronizer->syncProfileOwner($profile);
  257.         if(true == $this->esListenersDisable->isDisabled())
  258.             return;
  259.         $this->recommendationsPersister->replaceOne($profile);
  260.         $this->descriptionPersister->replaceOne($profile);
  261.         $this->keySearchPersister->replaceOne($profile);
  262. //        $date = $profile->getUpdatedAt() ?? CarbonImmutable::now();
  263. //        $date = $date->setTime($date->format('H'), $date->format('i'), $date->format('s'), $date->format('u') + 1);
  264. //        $profile->setUpdatedAt($date);
  265.     }
  266.     public function checkIpAddressCommentBanNeeded(ProfileCommentWasAdded $profileCommentWasAddedEvent): void
  267.     {
  268.         $this->ipAddressService->checkDailyCommentBanNeeded();
  269.     }
  270.     public function onProfilesShown(ProfilesShownEvent $event): void
  271.     {
  272.         $this->profileCtrService->addProfileShows($event->getProfileIds());
  273.     }
  274.     public function onProfileView(ProfileViewEvent $event): void
  275.     {
  276.         $this->profileCtrService->addProfileVisit($event->getProfileId());
  277.     }
  278.     public function onProfileFileProcessed(FileProcessingTaskWasCompleted $event): void
  279.     {
  280.         $this->moderationService->profileFileProcessingFinished($event->getProfile());
  281.     }
  282. }