<?php
/*
* Author: Dominik Piekarski <code@dompie.de>
* Created at: 2020/10/01 16:23
*/
declare(strict_types=1);
namespace App\Subscriber\Search;
use App\Event\User\AccountStatusChangeEvent;
use App\Event\User\AmateurUpdateEvent;
use App\Event\User\AmateurUpgradeCompleteEvent;
use App\Event\User\LoginCreatedEvent;
use App\Event\User\LogoutEvent;
use App\Service\Search\MemberSearchService;
use Elasticsearch\Common\Exceptions\Missing404Exception;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MemberSearchSubscriber implements EventSubscriberInterface
{
protected MemberSearchService $amateurSearch;
protected bool $enabled = false;
protected LoggerInterface $logger;
public function __construct(MemberSearchService $amateurSearch, LoggerInterface $appLogger)
{
$this->amateurSearch = $amateurSearch;
$this->enabled = (bool) (getenv($_ENV['REALTIME_MEMBER_SEARCH']) ?? false);
$this->logger = $appLogger;
}
public function enable(): void
{
$this->enabled = true;
}
public static function getSubscribedEvents(): array
{
return [
AmateurUpdateEvent::class => [['onAmateurUpdateIndex', 0]],
AmateurUpgradeCompleteEvent::class => [['onNewAmateurUpdateIndex', 0]],
AccountStatusChangeEvent::class => [['onAccountStatusChangeUpdateIndex', 0]],
LoginCreatedEvent::class => [['onLoginUpdateIndex', 0]],
LogoutEvent::class => [['onLogoutUpdateIndex', 0]],
];
}
public function onAmateurUpdateIndex(AmateurUpdateEvent $event)
{
if (false === $event->getEntity()->getIsAmateur()) {
return;
}
$this->amateurSearch->updateOrInsert($event->getEntity());
}
public function onLoginUpdateIndex(LoginCreatedEvent $event): void
{
if (!$this->enabled) {
return;
}
$account = $event->getLogin()->getAccount();
if (null === $account || null === $account->getMember()) {
return;
}
$this->amateurSearch->updateOrInsert($account->getMember());
}
public function onLogoutUpdateIndex(LogoutEvent $event): void
{
if (!$this->enabled) {
return;
}
$member = $event->getAccount()->getMember();
if (null === $member) {
return;
}
$this->amateurSearch->updateOrInsert($member);
}
public function onNewAmateurUpdateIndex(AmateurUpgradeCompleteEvent $event): void
{
if (!$this->enabled) {
return;
}
if (null === $event->getAmateurUpgrade()->getAccount() || !$event->getAmateurUpgrade()->getAccount()->hasMember()) {
return;
}
$this->amateurSearch->updateOrInsert($event->getAmateurUpgrade()->getAccount()->getMember(), true);
}
public function onAccountStatusChangeUpdateIndex(AccountStatusChangeEvent $event): void
{
if (!$this->enabled) {
return;
}
$member = $event->getAccount()->getMember();
if (!$member) {
return;
}
try {
if ($event->gotBlocked()) {
$this->amateurSearch->removeById($member->getId(), true);
}
if ($event->gotReenabled()) {
$this->amateurSearch->updateOrInsert($member);
}
} catch (Missing404Exception $e) {
$this->logger->error($e->getMessage().PHP_EOL.$e->getTraceAsString());
}
}
}