src/GlobalFav/Service/GlobalFav.php line 84

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\GlobalFav\Service;
  3. use App\GlobalFav\Object\FavItem;
  4. use DateTime;
  5. use Psr\Log\LoggerInterface;
  6. use Symfony\Component\HttpFoundation\Cookie;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. use Symfony\Component\HttpFoundation\Response;
  9. /**
  10.  * Stateful service!
  11.  */
  12. class GlobalFav
  13. {
  14.     private GlobalFavStoreRequester $storeRequester;
  15.     /**
  16.      * Runtime cache
  17.      *
  18.      * @var FavItem[]
  19.      */
  20.     protected ?array $list null;
  21.     public const FAV_USER_SESSION_KEY 'GLOBAL_FAV_USER_ID';
  22.     public int $cookieLifetime = (183 24 60 60);
  23.     private LoggerInterface $logger;
  24.     private RequestStack $requestStack;
  25.     public function __construct(
  26.         RequestStack $requestStack,
  27.         GlobalFavStoreRequester $storeRequester,
  28.         LoggerInterface $logger,
  29.     ) {
  30.         $this->storeRequester $storeRequester;
  31.         $this->logger $logger;
  32.         $this->requestStack $requestStack;
  33.     }
  34.     public function getUserId(): ?string
  35.     {
  36.         $request $this->requestStack->getCurrentRequest();
  37.         $session $request->getSession();
  38.         $userId $request->cookies->get(self::FAV_USER_SESSION_KEY);
  39.         if (!$userId) {
  40.             $userId $session->get(self::FAV_USER_SESSION_KEY);
  41.         }
  42.         return $userId;
  43.     }
  44.     public function getUserIdForCookieUpdate(): ?string
  45.     {
  46.         $request $this->requestStack->getCurrentRequest();
  47.         if (!$request) {
  48.             return null;
  49.         }
  50.         $session $request->getSession();
  51.         $userId $request->cookies->get(self::FAV_USER_SESSION_KEY);
  52.         // Если userId уже есть в куках, их не надо обновлять
  53.         if ($userId) {
  54.             return null;
  55.         }
  56.         // Если есть в сессии, но нет в куках - обновляем
  57.         $userId $session->get(self::FAV_USER_SESSION_KEY);
  58.         if ($userId) {
  59.             return $userId;
  60.         }
  61.         // Ваще нигде нет, ахтунг, надо обновить
  62.         return $this->refreshUser();
  63.     }
  64.     public function setUserId(string $userId): void
  65.     {
  66.         $request $this->requestStack->getCurrentRequest();
  67.         $session $request->getSession();
  68.         $session->set(self::FAV_USER_SESSION_KEY$userId);
  69.     }
  70.     /**
  71.      * @return FavItem[]
  72.      */
  73.     public function getFavList(): array
  74.     {
  75.         $userId $this->getUserId();
  76.         if (!$userId) {
  77.             return [];
  78.         }
  79.         if ($this->list === null) {
  80.             $this->list $this->storeRequester->getList($userId);
  81.         }
  82.         return $this->list;
  83.     }
  84.     public function add(FavItem $favItem): bool
  85.     {
  86.         if (!$this->getUserId()) {
  87.             $this->logger->notice('Global Fav: Trying to add favorite without userId');
  88.             return false;
  89.         }
  90.         return $this->storeRequester->add($this->getUserId(), $favItem);
  91.     }
  92.     public function remove(FavItem $favItem): bool
  93.     {
  94.         if (!$this->getUserId()) {
  95.             $this->logger->notice('Global Fav: Trying to remove favorite without userId');
  96.             return false;
  97.         }
  98.         return $this->storeRequester->remove($this->getUserId(), $favItem);
  99.     }
  100.     public function view(FavItem $favItem): bool
  101.     {
  102.         if (!$this->getUserId()) {
  103.             $this->logger->notice('Global Fav: Trying to view favorite without userId');
  104.             return false;
  105.         }
  106.         return $this->storeRequester->view($this->getUserId(), $favItem);
  107.     }
  108.     public function refreshUser(): ?string
  109.     {
  110.         $userId $this->storeRequester->createUser();
  111.         if ($userId) {
  112.             $this->setUserId($userId);
  113.         } else {
  114.             $this->logger->notice('Global Fav: Could not refresh user id');
  115.         }
  116.         return $userId ?: null;
  117.     }
  118.     public function updateCookie(Response $response): void
  119.     {
  120.         $userId $this->getUserIdForCookieUpdate();
  121.         if ($userId) {
  122.             $response->headers->setCookie(
  123.                 Cookie::create(
  124.                     self::FAV_USER_SESSION_KEY,
  125.                     $userId,
  126.                     (new DateTime('now'))->modify("+183 day")
  127.                 )
  128.             );
  129.         }
  130.     }
  131. }