<?php
namespace App\EventListener;
use App\Atd\Domain\Datastore\Redis\DataScoreUpdateDto;
use App\Atd\Domain\Datastore\Redis\DataScoreUpdateDtoFactory;
use App\Atd\Utilities\CalendarToDataScoreDtoAdapter;
use App\enum\Events;
use App\Event\CacheDataEvent;
use App\Atd\Domain\Datastore\Redis\Service\RedisDatastoreService;
use App\Service\ProviderFactoryService;
use App\Atd\Domain\Datastore\Redis\DataScoreDto;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Throwable;
class RedisUploadSubscriber implements EventSubscriberInterface
{
use CalendarToDataScoreDtoAdapter;
public function __construct(
private ProviderFactoryService $providerFactory,
private RedisDatastoreService $redisDatastoreService,
private LoggerInterface $logger
){}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
Events::CACHE_DATA_TRIGGER => 'onCacheUpdateTriggered'
];
}
/**
* @param CacheDataEvent $event
* @return void
* @throws Throwable
*/
public function onCacheUpdateTriggered(CacheDataEvent $event): void
{
try {
$storageKey = $event->getStorageKey();
$maxScore = $event->getMaxScore();
$minScore = $event->getMinScore();
$dataScoreDto = $this->getDataScoreDto(
$event->getData()
);
$dataScoreUpdateDto = new DataScoreUpdateDto([
'storageKey' => $storageKey->getKey(),
'maxScore' => $maxScore,
'minScore' => $minScore,
'dataScoreCollection' => $dataScoreDto
]);
$this->redisDatastoreService->eventUpdate(
$dataScoreUpdateDto
);
} catch (Throwable $e) {
$this->logger->error($e->getMessage());
throw $e;
}
}
/**
* @param array $setData
* @return array
*/
private function getDataScoreDto(array $setData): array
{
return $this->adaptCalendarToDataScoreDto($setData);
}
}