<?php
namespace App\EventSubscriber\App;
use App\Entity\SearchEvent;
use App\Entity\UsageEvent;
use App\Entity\User;
use App\Event\SearchFinishedEvent;
use App\Event\SearchForRecurrentJobsFinishedEvent;
use App\Event\SearchForRecurrentJobsStartedEvent;
use App\Event\SearchForWantedJobsStartedEvent;
use App\Event\SearchStartedEvent;
use App\Service\ActivityMonitoringService;
use App\Service\ConversionEventService;
use App\Service\RecurrentJobsSearchService;
use App\Service\SearchEventService;
use App\Service\SearchService;
use App\Service\UsageEventService;
use Exception;
use JanusHercules\DatawarehouseIntegration\Domain\Entity\BusinessEvent;
use JanusHercules\DatawarehouseIntegration\Domain\Service\BusinessEventDomainService;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Throwable;
class SearchEventSubscriber implements EventSubscriberInterface
{
private ActivityMonitoringService $activityMonitoringService;
private LoggerInterface $logger;
private ConversionEventService $conversionEventService;
private SearchEventService $searchEventService;
private UsageEventService $usageEventService;
private BusinessEventDomainService $businessEventDomainService;
private SearchService $searchService;
public function __construct(
ActivityMonitoringService $activityMonitoringService,
LoggerInterface $logger,
ConversionEventService $conversionEventService,
SearchEventService $searchEventService,
UsageEventService $usageEventService,
BusinessEventDomainService $businessEventDomainService,
SearchService $searchService
) {
$this->activityMonitoringService = $activityMonitoringService;
$this->logger = $logger;
$this->conversionEventService = $conversionEventService;
$this->searchEventService = $searchEventService;
$this->usageEventService = $usageEventService;
$this->businessEventDomainService = $businessEventDomainService;
$this->searchService = $searchService;
}
public static function getSubscribedEvents()
{
return [
SearchForRecurrentJobsStartedEvent::class => 'onSearchStarted',
SearchForWantedJobsStartedEvent::class => 'onSearchStarted',
SearchForRecurrentJobsFinishedEvent::class => 'onSearchFinished'
];
}
/** @throws Exception */
public function onSearchStarted(SearchStartedEvent $event): void
{
/** @var User|null $user */
$user = $event->getUser();
$searchParams = $event->getSearchParameters();
$request = $event->getRequest();
get_class($event) === SearchForWantedJobsStartedEvent::class ? $searchType = SearchEvent::SEARCH_TYPE_WANTED_JOBS_SEARCH : $searchType = SearchEvent::SEARCH_TYPE_RECURRENT_JOBS_SEARCH;
if ($event->getStartedByAHumanUser() === true) {
$this->searchEventService->writeEvent($request, $user, $searchParams, $searchType);
}
if (!is_null($user) && $event->getStartedByAHumanUser() === true) {
try {
$this->activityMonitoringService->handleSearchStartedActivity(
$user
);
} catch (Throwable $t) {
// While this is important for us, it's not crucial for the user, which is why we ensure that a user
// doesn't run into an error if we get an exception.
$this->logger->warning(
"Error while calling handleSearchStartedActivity: {$t->getMessage()}",
['exception' => $t]
);
}
$this->searchService->logSearchRequestForCircuitBreaking($user);
if ($user->isJobseeker()) {
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
0,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
10,
null,
$user
);
}
if ($user->isJobofferer()) {
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
1,
null,
$user
);
$this->conversionEventService->handleConversionGoalReached(
ConversionEventService::CAMPAIGN_ID_HOTEL_GASTRO_OEFFNET_WIEDER_MAILING_2020_05_06,
11,
null,
$user
);
}
}
}
/** @throws Exception */
public function onSearchFinished(SearchFinishedEvent $event)
{
$request = $event->getRequest();
if (!$event->getShowAnonymousResults()) {
if (!is_null($event->getUser())) {
if (get_class($event) === SearchForRecurrentJobsFinishedEvent::class
&& $event->getUser()->isJobseeker()
) {
$this->usageEventService->eventHasOccurredForUser($event->getUser(), UsageEvent::EVENT_TYPE_JOBSEEKER_HAS_USED_SEARCH_FOR_RECURRENT_JOBS);
}
}
if ($event->getTotalNumberOfResults() < 5) {
$this->businessEventDomainService->writeNewEvent(
get_class($event) === SearchForRecurrentJobsFinishedEvent::class
? BusinessEvent::EVENT_TYPE_RECURRENTJOBSSEARCH_NOTENOUGHRESULTS
: BusinessEvent::EVENT_TYPE_WANTEDJOBSSEARCH_NOTENOUGHRESULTS,
$event->getUser(),
null,
null,
json_encode([
'searchParams' => $event->getSearchParameters()->asArray(),
'requestUri' => $request->getRequestUri()
])
);
} else {
$this->businessEventDomainService->writeNewEvent(
get_class($event) === SearchForRecurrentJobsFinishedEvent::class
? BusinessEvent::EVENT_TYPE_RECURRENTJOBSSEARCH_ENOUGHRESULTS
: BusinessEvent::EVENT_TYPE_WANTEDJOBSSEARCH_ENOUGHRESULTS,
$event->getUser(),
null,
null,
json_encode([
'searchParams' => $event->getSearchParameters()->asArray(),
'requestUri' => $event->getRequest()->getRequestUri()
])
);
}
if ($event->getSearchParameters()->getFilterSearchterm() === RecurrentJobsSearchService::SEARCHTERM_ALL_JOBS && $event->getTotalNumberOfResults() < 100) {
$this->businessEventDomainService->writeNewEvent(
BusinessEvent::EVENT_TYPE_RECURRENT_JOBS_SEARCH_ALL_JOBS_NOT_ENOUGH_RESULTS,
$event->getUser(),
null,
null,
json_encode(
[
'numberOfResults' => $event->getTotalNumberOfResults(),
'zipcode' => $event->getSearchParameters()->getFilterZipcode()
]
)
);
}
}
if (!$event->getShowAnonymousResults()
&& $event->getTotalNumberOfResults() > 0
&& get_class($event) === SearchForRecurrentJobsFinishedEvent::class
) {
$event->getContainsExternalJoboffers()
? $this->businessEventDomainService->writeNewEvent(BusinessEvent::EVENT_TYPE_RECURRENT_JOB_SEARCH_CONTAINS_JOBLIFT_RESULTS)
: $this->businessEventDomainService->writeNewEvent(BusinessEvent::EVENT_TYPE_RECURRENT_JOB_SEARCH_DOES_NOT_CONTAIN_JOBLIFT_RESULTS);
}
}
}