src/EventSubscriber/ProfileSubscriber.php line 190

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