src/App/EventSubscriber/App/SearchEventSubscriber.php line 132

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\App;
  3. use App\Entity\SearchEvent;
  4. use App\Entity\UsageEvent;
  5. use App\Entity\User;
  6. use App\Event\SearchFinishedEvent;
  7. use App\Event\SearchForRecurrentJobsFinishedEvent;
  8. use App\Event\SearchForRecurrentJobsStartedEvent;
  9. use App\Event\SearchForWantedJobsStartedEvent;
  10. use App\Event\SearchStartedEvent;
  11. use App\Service\ActivityMonitoringService;
  12. use App\Service\ConversionEventService;
  13. use App\Service\RecurrentJobsSearchService;
  14. use App\Service\SearchEventService;
  15. use App\Service\SearchService;
  16. use App\Service\UsageEventService;
  17. use Exception;
  18. use JanusHercules\DatawarehouseIntegration\Domain\Entity\BusinessEvent;
  19. use JanusHercules\DatawarehouseIntegration\Domain\Service\BusinessEventDomainService;
  20. use Psr\Log\LoggerInterface;
  21. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  22. use Throwable;
  23. class SearchEventSubscriber implements EventSubscriberInterface
  24. {
  25. private ActivityMonitoringService $activityMonitoringService;
  26. private LoggerInterface $logger;
  27. private ConversionEventService $conversionEventService;
  28. private SearchEventService $searchEventService;
  29. private UsageEventService $usageEventService;
  30. private BusinessEventDomainService $businessEventDomainService;
  31. private SearchService $searchService;
  32. public function __construct(
  33. ActivityMonitoringService $activityMonitoringService,
  34. LoggerInterface $logger,
  35. ConversionEventService $conversionEventService,
  36. SearchEventService $searchEventService,
  37. UsageEventService $usageEventService,
  38. BusinessEventDomainService $businessEventDomainService,
  39. SearchService $searchService
  40. ) {
  41. $this->activityMonitoringService = $activityMonitoringService;
  42. $this->logger = $logger;
  43. $this->conversionEventService = $conversionEventService;
  44. $this->searchEventService = $searchEventService;
  45. $this->usageEventService = $usageEventService;
  46. $this->businessEventDomainService = $businessEventDomainService;
  47. $this->searchService = $searchService;
  48. }
  49. public static function getSubscribedEvents()
  50. {
  51. return [
  52. SearchForRecurrentJobsStartedEvent::class => 'onSearchStarted',
  53. SearchForWantedJobsStartedEvent::class => 'onSearchStarted',
  54. SearchForRecurrentJobsFinishedEvent::class => 'onSearchFinished'
  55. ];
  56. }
  57. /** @throws Exception */
  58. public function onSearchStarted(SearchStartedEvent $event): void
  59. {
  60. /** @var User|null $user */
  61. $user = $event->getUser();
  62. $searchParams = $event->getSearchParameters();
  63. $request = $event->getRequest();
  64. get_class($event) === SearchForWantedJobsStartedEvent::class ? $searchType = SearchEvent::SEARCH_TYPE_WANTED_JOBS_SEARCH : $searchType = SearchEvent::SEARCH_TYPE_RECURRENT_JOBS_SEARCH;
  65. if ($event->getStartedByAHumanUser() === true) {
  66. $this->searchEventService->writeEvent($request, $user, $searchParams, $searchType);
  67. }
  68. if (!is_null($user) && $event->getStartedByAHumanUser() === true) {
  69. try {
  70. $this->activityMonitoringService->handleSearchStartedActivity(
  71. $user
  72. );
  73. } catch (Throwable $t) {
  74. // While this is important for us, it's not crucial for the user, which is why we ensure that a user
  75. // doesn't run into an error if we get an exception.
  76. $this->logger->warning(
  77. "Error while calling handleSearchStartedActivity: {$t->getMessage()}",
  78. ['exception' => $t]
  79. );
  80. }
  81. $this->searchService->logSearchRequestForCircuitBreaking($user);
  82. if ($user->isJobseeker()) {
  83. $this->conversionEventService->handleConversionGoalReached(
  84. ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
  85. 0,
  86. null,
  87. $user
  88. );
  89. $this->conversionEventService->handleConversionGoalReached(
  90. ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
  91. 10,
  92. null,
  93. $user
  94. );
  95. }
  96. if ($user->isJobofferer()) {
  97. $this->conversionEventService->handleConversionGoalReached(
  98. ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
  99. 1,
  100. null,
  101. $user
  102. );
  103. $this->conversionEventService->handleConversionGoalReached(
  104. ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
  105. 11,
  106. null,
  107. $user
  108. );
  109. }
  110. }
  111. }
  112. /** @throws Exception */
  113. public function onSearchFinished(SearchFinishedEvent $event)
  114. {
  115. $request = $event->getRequest();
  116. if (!$event->getShowAnonymousResults()) {
  117. if (!is_null($event->getUser())) {
  118. if (get_class($event) === SearchForRecurrentJobsFinishedEvent::class
  119. && $event->getUser()->isJobseeker()
  120. ) {
  121. $this->usageEventService->eventHasOccurredForUser($event->getUser(), UsageEvent::EVENT_TYPE_JOBSEEKER_HAS_USED_SEARCH_FOR_RECURRENT_JOBS);
  122. }
  123. }
  124. if ($event->getTotalNumberOfResults() < 5) {
  125. $this->businessEventDomainService->writeNewEvent(
  126. get_class($event) === SearchForRecurrentJobsFinishedEvent::class
  127. ? BusinessEvent::EVENT_TYPE_RECURRENTJOBSSEARCH_NOTENOUGHRESULTS
  128. : BusinessEvent::EVENT_TYPE_WANTEDJOBSSEARCH_NOTENOUGHRESULTS,
  129. $event->getUser(),
  130. null,
  131. null,
  132. json_encode([
  133. 'searchParams' => $event->getSearchParameters()->asArray(),
  134. 'requestUri' => $request->getRequestUri()
  135. ])
  136. );
  137. } else {
  138. $this->businessEventDomainService->writeNewEvent(
  139. get_class($event) === SearchForRecurrentJobsFinishedEvent::class
  140. ? BusinessEvent::EVENT_TYPE_RECURRENTJOBSSEARCH_ENOUGHRESULTS
  141. : BusinessEvent::EVENT_TYPE_WANTEDJOBSSEARCH_ENOUGHRESULTS,
  142. $event->getUser(),
  143. null,
  144. null,
  145. json_encode([
  146. 'searchParams' => $event->getSearchParameters()->asArray(),
  147. 'requestUri' => $event->getRequest()->getRequestUri()
  148. ])
  149. );
  150. }
  151. if ($event->getSearchParameters()->getFilterSearchterm() === RecurrentJobsSearchService::SEARCHTERM_ALL_JOBS && $event->getTotalNumberOfResults() < 100) {
  152. $this->businessEventDomainService->writeNewEvent(
  153. BusinessEvent::EVENT_TYPE_RECURRENT_JOBS_SEARCH_ALL_JOBS_NOT_ENOUGH_RESULTS,
  154. $event->getUser(),
  155. null,
  156. null,
  157. json_encode(
  158. [
  159. 'numberOfResults' => $event->getTotalNumberOfResults(),
  160. 'zipcode' => $event->getSearchParameters()->getFilterZipcode()
  161. ]
  162. )
  163. );
  164. }
  165. }
  166. if (!$event->getShowAnonymousResults()
  167. && $event->getTotalNumberOfResults() > 0
  168. && get_class($event) === SearchForRecurrentJobsFinishedEvent::class
  169. ) {
  170. $event->getContainsExternalJoboffers()
  171. ? $this->businessEventDomainService->writeNewEvent(BusinessEvent::EVENT_TYPE_RECURRENT_JOB_SEARCH_CONTAINS_JOBLIFT_RESULTS)
  172. : $this->businessEventDomainService->writeNewEvent(BusinessEvent::EVENT_TYPE_RECURRENT_JOB_SEARCH_DOES_NOT_CONTAIN_JOBLIFT_RESULTS);
  173. }
  174. }
  175. }