src/EventSubscriber/ProfileSubscriber.php line 226

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