<?php
namespace App\EventSubscriber;
use App\Controller\Api\UpdateVersionCheckedControllerInterface;
use App\Entity\UpdateVersion;
use App\Exception\OutdatedItemsVersionException;
use App\Service\NotificationService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class UpdateVersionSubscriber implements EventSubscriberInterface
{
private $notificationService;
private $em;
public function __construct(NotificationService $notificationService, EntityManagerInterface $entityManager)
{
$this->notificationService = $notificationService;
$this->em = $entityManager;
}
public function onKernelController(ControllerEvent $event)
{
$controller = $event->getController();
if (is_array($controller)) {
$controller = $controller[0];
}
if ($controller instanceof UpdateVersionCheckedControllerInterface) {
if(!$event->getRequest()->headers->has('X-Items-Version')){
return;
}
$appItemsVersion = filter_var($event->getRequest()->headers->get('X-Items-Version'), FILTER_SANITIZE_NUMBER_INT);
$systemItemsVersion = $this->em->getRepository(UpdateVersion::class)->findOneBy([
'type' => UpdateVersion::TYPE_ITEM_MODELS
]);
if(!$systemItemsVersion){
return;
}
if($appItemsVersion != $systemItemsVersion->getVersion()){
throw new OutdatedItemsVersionException('Items version is out of date. Download current version.', $systemItemsVersion->getVersion());
}
return;
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => 'onKernelController'
];
}
}