src/Aqarmap/Bundle/UserBundle/EventListener/UserInterestSubscribeListener.php line 100

  1. <?php
  2. namespace Aqarmap\Bundle\UserBundle\EventListener;
  3. use Aqarmap\Bundle\BuyerAlertsBundle\Service\BuyerAlertsManager;
  4. use Aqarmap\Bundle\FeatureToggleBundle\Service\FeatureToggleManager;
  5. use Aqarmap\Bundle\ListingBundle\Event\LeadEvent;
  6. use Aqarmap\Bundle\ListingBundle\Service\LeadService;
  7. use Aqarmap\Bundle\UserBundle\Event\userInterestEvent;
  8. use Aqarmap\Bundle\UserBundle\Services\Contracts\UserInterestBuilderInterface;
  9. use Aqarmap\Bundle\UserBundle\Services\UserInterestManager;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Psr\Log\LoggerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. class UserInterestSubscribeListener implements EventSubscriberInterface
  14. {
  15. /**
  16. * @var EntityManagerInterface
  17. */
  18. protected $em;
  19. /**
  20. * @var FeatureToggleManager
  21. */
  22. protected $featureToggleManager;
  23. /**
  24. * @var LeadService
  25. */
  26. protected $leadService;
  27. /**
  28. * @var UserInterestManager
  29. */
  30. protected $userInterestManager;
  31. /**
  32. * @var UserInterestBuilderInterface
  33. */
  34. protected $userInterestBuilder;
  35. /**
  36. * @var LoggerInterface
  37. */
  38. protected $logger;
  39. public function __construct(
  40. EntityManagerInterface $em,
  41. UserInterestManager $userInterestManager,
  42. FeatureToggleManager $featureToggleManager,
  43. LeadService $leadService,
  44. UserInterestBuilderInterface $userInterestBuilder,
  45. LoggerInterface $logger,
  46. private readonly BuyerAlertsManager $buyerAlertsManager,
  47. ) {
  48. $this->em = $em;
  49. $this->userInterestManager = $userInterestManager;
  50. $this->featureToggleManager = $featureToggleManager;
  51. $this->leadService = $leadService;
  52. $this->userInterestBuilder = $userInterestBuilder;
  53. $this->logger = $logger;
  54. }
  55. public function onAddInteraction(userInterestEvent $event): void
  56. {
  57. $userInterest = $event->getUserInterest();
  58. $this->em->persist($userInterest);
  59. $this->em->flush($userInterest);
  60. }
  61. public function onAddLead(LeadEvent $event): void
  62. {
  63. $listing = $event->getListing();
  64. if ($this->featureToggleManager->isEnabled('web.client.served.count')) {
  65. $this->leadService->publishUpdatingClientServedCount($listing->getUser()->getId());
  66. }
  67. try {
  68. $this->buyerAlertsManager->addNewRecentSearch(
  69. $event->getUser(),
  70. $listing->getLocation(),
  71. $listing->getSection(),
  72. $listing->getPropertyType(),
  73. $listing->getPrice(),
  74. null,
  75. $listing->getArea(),
  76. null
  77. );
  78. } catch (\Exception $e) {
  79. $this->logger->error('Search Listener: '.$e->getMessage());
  80. }
  81. }
  82. public function onCreateInterest(userInterestEvent $event): void
  83. {
  84. $userInterestManager = $this->userInterestManager;
  85. /** @var \Aqarmap\Bundle\ListingBundle\Entity\LocationRepository $locationRepo */
  86. $locationRepo = $this->em->getRepository(\Aqarmap\Bundle\ListingBundle\Entity\Location::class);
  87. if (!$event->getUserInterest()->getLocation()->getSearchable()
  88. ) {
  89. $location = null;
  90. $locations = $locationRepo->getPath($event->getUserInterest()->getLocation());
  91. arsort($locations);
  92. foreach ($locations as $treeLocation) {
  93. if ($treeLocation->getSearchable()) {
  94. $location = $treeLocation;
  95. break;
  96. }
  97. }
  98. if ($location) {
  99. if ($location != $event->getUserInterest()->getLocation()) {
  100. $userInterestManager->addNew(
  101. $event->getUserInterest()->getUser(),
  102. $location,
  103. $event->getUserInterest()->getSection(),
  104. $event->getUserInterest()->getPropertyType(),
  105. $event->getUserInterest()->getMaxPrice(),
  106. $event->getUserInterest()->getMinPrice(),
  107. true,
  108. false
  109. )
  110. ->commit();
  111. }
  112. }
  113. }
  114. }
  115. public static function getSubscribedEvents(): array
  116. {
  117. return [
  118. 'aqarmap.listing.message_submitted' => 'onAddLead',
  119. 'aqarmap.listing.call_requested' => 'onAddLead',
  120. 'aqarmap.listing.show_seller_number' => 'onAddLead',
  121. 'aqarmap.interest.create_non_searchable' => 'onCreateInterest',
  122. ];
  123. }
  124. }