<?php
namespace App\EventSubscriber;
use App\Entity\Profile\Profile;
use App\Entity\Sales\SidebarPlacementType;
use App\Event\Profile\ConfirmationRequest\ProfileApprovalApproved;
use App\Event\Profile\ConfirmationRequest\ProfileApprovalRejected;
use App\Event\Profile\ConfirmationRequest\ProfileModerationRejected;
use App\Event\Profile\ConfirmationRequest\ProfileModerationPassed;
use App\Event\Profile\FileProcessingTaskWasCompleted;
use App\Event\Profile\ProfileCommentWasAdded;
use App\Event\Profile\ProfileDataChanged;
use App\Event\Profile\ProfileModeratedDataChanged;
use App\Event\Profile\ProfileWasCreated;
use App\Event\Profile\ProfileWasDeleted;
use App\Event\Profile\ProfileWasHidden;
use App\Event\Profile\ProfileViewEvent;
use App\Event\Profile\ProfilesShownEvent;
use App\Event\Profile\ProfileWasPlacedOnAdBoard;
use App\Event\Profile\ProfileWasPlacedOnTop;
use App\Event\Profile\ProfileWasProlongedOnAdBoard;
use App\Event\Profile\ProfileWasRemovedFromAdBoard;
use App\Event\Profile\ProfileWasRemovedFromHidden;
use App\Event\Profile\ProfileWasRestored;
use App\Event\Profile\ProfileApprovalWasRevoked;
use App\Service\BonusEnrollmentService;
use App\Service\EsListenersDisable;
use App\Service\IpAddressService;
use App\Service\ProfileAdBoardLogger;
use App\Service\ProfileCtrService;
use App\Service\Mailer;
use App\Service\ModerationService;
use App\Service\ProfileAdBoard;
use App\Service\Sidebar;
use FOS\ElasticaBundle\Persister\ObjectPersisterInterface;
use FOS\ElasticaBundle\Persister\PersisterRegistry;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ProfileSubscriber implements EventSubscriberInterface
{
private ObjectPersisterInterface $recommendationsPersister;
private ObjectPersisterInterface $descriptionPersister;
private ObjectPersisterInterface $keySearchPersister;
public function __construct(
private Mailer $mailer,
private ModerationService $moderationService,
private Sidebar $sidebar,
private ProfileAdBoard $profileAdBoard,
private IpAddressService $ipAddressService,
private ProfileCtrService $profileCtrService,
PersisterRegistry $persisterRegistry,
private EsListenersDisable $esListenersDisable,
private BonusEnrollmentService $bonusEnrollmentService,
private ProfileAdBoardLogger $adBoardLogger,
)
{
$this->recommendationsPersister = $persisterRegistry->getPersister('recommendations', 'profile');
$this->descriptionPersister = $persisterRegistry->getPersister('description', 'profile');
$this->keySearchPersister = $persisterRegistry->getPersister('key_search', 'profile');
}
public static function getSubscribedEvents(): array
{
return [
ProfileWasCreated::NAME => 'onProfileWasCreated',
ProfileDataChanged::NAME => 'onProfileDataChanged',
ProfileWasDeleted::NAME => 'onPProfileWasDeleted',
ProfileWasRestored::NAME => 'onProfileWasRestored',
ProfileModeratedDataChanged::NAME => 'requestModeration',
ProfileWasPlacedOnAdBoard::NAME => [
['onProfilePlacedOnAdBoard', 0],
['addSidebarPlacement', 10],
['removePlacementHiding', 20],
],
ProfileWasRemovedFromAdBoard::NAME => [
['deleteSidebarPlacement', 0],
['onProfileRemovedFromAdBoard', 10],
],
ProfileWasProlongedOnAdBoard::NAME => 'prolongSidebarPlacement',
ProfileWasPlacedOnTop::NAME => 'onProfilePlacedOnTop',
ProfileWasHidden::NAME => 'onProfileWasHidden',
ProfileWasRemovedFromHidden::NAME => 'onProfileWasRemovedFromHidden',
ProfileModerationPassed::NAME => 'onProfileModerationPassed',
ProfileModerationRejected::NAME => 'onProfileModerationRejected',
ProfileApprovalApproved::NAME => [
['onProfileApprovalApproved', 0],
['enrollApprovalBonus', 10],
],
ProfileApprovalRejected::NAME => 'onProfileApprovalRejected',
ProfileApprovalWasRevoked::NAME => 'onProfileWasUnApproved',
ProfileCommentWasAdded::NAME => 'checkIpAddressCommentBanNeeded',
ProfilesShownEvent::NAME => 'onProfilesShown',
ProfileViewEvent::NAME => 'onProfileView',
FileProcessingTaskWasCompleted::class => 'onProfileFileProcessed',
];
}
public function onProfileWasCreated(ProfileWasCreated $profileEvent): void
{
$this->profileAdBoard->setProfileToDefaultPlacementState($profileEvent->getProfile());
$this->notifyPostUpdateListener($profileEvent->getProfile());
}
public function onProfileDataChanged(ProfileDataChanged $profileDataChanged): void
{
$this->notifyPostUpdateListener($profileDataChanged->getProfile());
$this->adBoardLogger->logAfterAdBoardAction($profileDataChanged->getProfile(), 'changed', null);
}
public function onPProfileWasDeleted(ProfileWasDeleted $profileWasDeleted): void
{
$this->notifyPostUpdateListener($profileWasDeleted->getProfile());
}
public function onProfileWasRestored(ProfileWasRestored $profileWasRestored): void
{
$this->notifyPostUpdateListener($profileWasRestored->getProfile());
$this->adBoardLogger->logAfterAdBoardAction($profileWasRestored->getProfile(), 'restored', null);
}
public function requestModeration(ProfileModeratedDataChanged $profileModeratedDataChanged): void
{
// $this->moderationService->requestModeration($profileModeratedDataChanged->getProfile());
}
public function onProfilePlacedOnAdBoard(ProfileWasPlacedOnAdBoard $profileWasPlacedOnAdBoardEvent): void
{
/** @var Profile $profile */
$profile = $profileWasPlacedOnAdBoardEvent->getProfile();
if(false == $profile->isModerationPassed())
$this->moderationService->requestModeration($profile);
// $profile->setAdBoardPlacement($profileWasPlacedOnAdBoardEvent->getPlacement());
$this->notifyPostUpdateListener($profile);
$this->adBoardLogger->logAfterAdBoardAction($profileWasPlacedOnAdBoardEvent->getProfile(), 'place', true);
}
public function addSidebarPlacement(ProfileWasPlacedOnAdBoard $profileWasPlacedOnAdBoardEvent): void
{
$placement = $profileWasPlacedOnAdBoardEvent->getPlacement();
$placementType = $placement->getType();
if($placementType->isVip() || $placementType->isUltraVip()) {
$this->sidebar->doPlaceProfileOnSidebar(
$profileWasPlacedOnAdBoardEvent->getProfile(),
new SidebarPlacementType($placementType->getValue()),
$placement->getPlacementPrice(),
$placement->getPlacedAt(),
$placement->getPlacedUntil()
);
}
}
public function deleteSidebarPlacement(ProfileWasRemovedFromAdBoard $profileWasPlacedOnAdBoardEvent): void
{
$this->sidebar->deleteProfileFromSidebar($profileWasPlacedOnAdBoardEvent->getProfile());
$this->notifyPostUpdateListener($profileWasPlacedOnAdBoardEvent->getProfile());
}
public function prolongSidebarPlacement(ProfileWasProlongedOnAdBoard $profileWasPlacedOnAdBoardEvent): void
{
$this->sidebar->prolongProfilePlacement($profileWasPlacedOnAdBoardEvent->getProfile(), $profileWasPlacedOnAdBoardEvent->getUntil());
}
public function onProfileRemovedFromAdBoard(ProfileWasRemovedFromAdBoard $profileWasRemovedFromAdBoard): void
{
$this->adBoardLogger->logAfterAdBoardAction($profileWasRemovedFromAdBoard->getProfile(), 'remove', false);
$this->notifyPostUpdateListener($profileWasRemovedFromAdBoard->getProfile());
}
public function onProfilePlacedOnTop(ProfileWasPlacedOnTop $profileWasPlacedOnTop): void
{
$this->notifyPostUpdateListener($profileWasPlacedOnTop->getProfile());
}
public function onProfileWasHidden(ProfileWasHidden $profileWasHidden): void
{
$this->adBoardLogger->logAfterAdBoardAction($profileWasHidden->getProfile(), 'hide', false);
$this->notifyPostUpdateListener($profileWasHidden->getProfile());
}
public function onProfileWasRemovedFromHidden(ProfileWasRemovedFromHidden $profileWasRemovedFromHidden): void
{
$this->adBoardLogger->logAfterAdBoardAction($profileWasRemovedFromHidden->getProfile(), 'unhide', null);
$this->notifyPostUpdateListener($profileWasRemovedFromHidden->getProfile());
}
public function onProfileModerationPassed(ProfileModerationPassed $moderationPassed): void
{
$this->mailer->sendProfileModerationPassedMessage($moderationPassed->getProfile());
$this->notifyPostUpdateListener($moderationPassed->getProfile());
}
public function onProfileModerationRejected(ProfileModerationRejected $profileModerationRejected): void
{
$this->mailer->sendProfileModerationRejectedMessage($profileModerationRejected->getProfile(), $profileModerationRejected->getReason(), $profileModerationRejected->getFix());
$this->notifyPostUpdateListener($profileModerationRejected->getProfile());
}
public function onProfileApprovalApproved(ProfileApprovalApproved $profileApprovalApproved): void
{
$this->mailer->sendProfilePhotoApproveApprovedMessage($profileApprovalApproved->getProfile());
$this->notifyPostUpdateListener($profileApprovalApproved->getProfile());
}
public function enrollApprovalBonus(ProfileApprovalApproved $profileApprovalApproved): void
{
$this->bonusEnrollmentService->enrollApprovalBonus($profileApprovalApproved->getProfile());
}
public function onProfileApprovalRejected(ProfileApprovalRejected $profileApprovalRejected): void
{
$this->mailer->sendProfilePhotoApproveRejectedMessage($profileApprovalRejected->getProfile());
$this->notifyPostUpdateListener($profileApprovalRejected->getProfile());
}
public function onProfileWasUnApproved(ProfileApprovalWasRevoked $profileApprovalRejected): void
{
if(null !== $profileApprovalRejected->getProfile()->getAdBoardPlacement() && true === $profileApprovalRejected->getProfile()->getAdBoardPlacement()->getType()->isFree()) {
$this->profileAdBoard->setProfileToDefaultPlacementState($profileApprovalRejected->getProfile());
}
}
public function removePlacementHiding(ProfileWasPlacedOnAdBoard $profileWasPlacedOnAdBoardEvent): void
{
// $this->profileAdBoard->deleteProfileHiding($profileWasPlacedOnAdBoardEvent->getProfile());
$this->adBoardLogger->logAfterAdBoardAction($profileWasPlacedOnAdBoardEvent->getProfile(), 'unhide2', true);
}
/**
* Костыль чтобы сработал слушатель сущности Profile на событие postUpdate и занес в elasticsearch изменения в случае
* добавления/удаления adBoardPlacement, т.к. само по себе изменение свойства Profile::adBoardPlacement - не производит
* событие postUpdate
*/
protected function notifyPostUpdateListener(Profile $profile)
{
if(true == $this->esListenersDisable->isDisabled())
return;
$this->recommendationsPersister->replaceOne($profile);
$this->descriptionPersister->replaceOne($profile);
$this->keySearchPersister->replaceOne($profile);
// $date = $profile->getUpdatedAt() ?? CarbonImmutable::now();
// $date = $date->setTime($date->format('H'), $date->format('i'), $date->format('s'), $date->format('u') + 1);
// $profile->setUpdatedAt($date);
}
public function checkIpAddressCommentBanNeeded(ProfileCommentWasAdded $profileCommentWasAddedEvent): void
{
$this->ipAddressService->checkDailyCommentBanNeeded();
}
public function onProfilesShown(ProfilesShownEvent $event): void
{
$this->profileCtrService->addProfileShows($event->getProfileIds());
}
public function onProfileView(ProfileViewEvent $event): void
{
$this->profileCtrService->addProfileVisit($event->getProfileId());
}
public function onProfileFileProcessed(FileProcessingTaskWasCompleted $event): void
{
$this->moderationService->profileFileProcessingFinished($event->getProfile());
}
}