src/EventSubscriber/ProfileSubscriber.php line 286

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