<?php
namespace App\Subscriber\Messenger;
use App\Dictionary\SessionVars;
use App\Security\ApiUser;
use App\Service\Client\User\MemberPropertyService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class ChatAppSettingsCookieSubscriber implements EventSubscriberInterface
{
/**
* @var TokenStorageInterface
*/
protected TokenStorageInterface $tokenStorage;
/**
* @var MemberPropertyService
*/
protected MemberPropertyService $propertyService;
/**
* @param TokenStorageInterface $tokenStorage
* @param MemberPropertyService $propertyService
*/
public function __construct(TokenStorageInterface $tokenStorage, MemberPropertyService $propertyService)
{
$this->tokenStorage = $tokenStorage;
$this->propertyService = $propertyService;
}
/**
* @return \array[]
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::RESPONSE => [
['setChatSettingsCookie', 0],
],
];
}
public function setChatSettingsCookie(ResponseEvent $event)
{
/** @var ApiUser $user */
$token = $this->tokenStorage->getToken();
if (null === $token || $event->isMainRequest() === false) {
return;
}
$user = $token->getUser();
if (!$user instanceof ApiUser) {
if ($event->getRequest()->cookies->has(SessionVars::COOKIE_USERTOKEN)) {
$event->getResponse()->headers->clearCookie(SessionVars::COOKIE_USERTOKEN);
}
if ($event->getRequest()->cookies->has(SessionVars::COOKIE_CHAT_APP_CONFIG)) {
$event->getResponse()->headers->clearCookie(SessionVars::COOKIE_CHAT_APP_CONFIG);
}
return;
}
$cookie = $this->getChatAppConfigCookie($event->getRequest());
$event->getResponse()->headers->setCookie($cookie);
}
/**
* @param Request $request
* @return Cookie
* @throws \Psr\Cache\InvalidArgumentException
*/
protected function getChatAppConfigCookie(Request $request): Cookie
{
$name = SessionVars::COOKIE_CHAT_APP_CONFIG;
/**
* @var $user ApiUser
*/
$user = $this->tokenStorage->getToken()->getUser();
$dataToEncode = array_merge(
$this->propertyService->getMessengerProperties($user->getMemberId()),
[
'myself' => [
'id' => $user->getMemberId(),
'username' => $user->getUsername(),
'sex' => $user->getSex(),
'isAmateur' => $user->hasRole('ROLE_AMATEUR'),
'isOperator' => $user->hasRole('ROLE_OPERATOR'),
'isAdmin' => $user->hasRole('ROLE_ADMIN'),
]
]
);
if($user->hasRole('ROLE_AMATEUR')) {
$dataToEncode['amateur'] = $this->propertyService->getAmateurProperties($user->getMemberId());
}
$cookieData = json_encode($dataToEncode);
return new Cookie($name, $cookieData, (time()+31536000), '/', null,
$request->isSecure(), false);
}
}