<?phpnamespace App\Entity;use App\Repository\AccessTokenRepository;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\HttpFoundation\Cookie;/** * @ORM\Entity(repositoryClass=AccessTokenRepository::class) */class AccessToken{ const TOKEN_EXPIRATION_MINUTES = 5; /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="datetime") */ private $createdAt; /** * @ORM\ManyToOne(targetEntity=Device::class, inversedBy="accessTokens") */ private $device; /** * @ORM\Column(type="string", length=255, unique=true) */ private $token; /** * @ORM\Column(type="boolean", nullable=true) */ private $revoked; /** * @ORM\OneToOne(targetEntity=RefreshToken::class, cascade={"persist", "remove"}) */ private $refreshToken; /** * @ORM\ManyToOne(targetEntity=User::class) * @ORM\JoinColumn(nullable=false) */ private $user; public function __construct() { $this->createdAt = new \DateTime(); } public function getId(): ?int { return $this->id; } public function getCreatedAt(): ?\DateTimeInterface { return $this->createdAt; } public function setCreatedAt(\DateTimeInterface $createdAt): self { $this->createdAt = $createdAt; return $this; } public function getDevice(): ?Device { return $this->device; } public function setDevice(?Device $device): self { $this->device = $device; return $this; } public function getToken(): ?string { return $this->token; } public function setToken(string $token): self { $this->token = $token; return $this; } public function getExpiresAt(): ?\DateTimeInterface { if ($this->getCreatedAt()) { $expiresAt = clone $this->getCreatedAt(); $expiresAt->modify('+' . self::TOKEN_EXPIRATION_MINUTES . ' minutes'); return $expiresAt; } return null; } public function isExpired(): bool { $expiresAt = $this->getExpiresAt(); if ($expiresAt) { return new \DateTime() > $expiresAt; } return false; } public function isRevoked(): ?bool { return $this->revoked; } public function setRevoked(?bool $revoked): self { $this->revoked = $revoked; return $this; } public function isAlive(): bool { return !$this->isExpired() && !$this->isRevoked(); } public function getRefreshToken(): ?RefreshToken { return $this->refreshToken; } public function setRefreshToken(?RefreshToken $refreshToken): self { $this->refreshToken = $refreshToken; return $this; } public function getUser(): ?User { return $this->user; } public function setUser(?User $user): self { $this->user = $user; return $this; } public function isRefreshable(): bool { return $this->getRefreshToken() && $this->getRefreshToken()->isAlive(); } public function createCookie() { return Cookie::create('access_token') ->withValue($this->getToken()) ->withHttpOnly(true) ->withSecure($_ENV["APP_ENV"] == "prod") // true in production with HTTPS //todo redo ->withSameSite('Lax') ->withPath('/1bc3f6fdaea8f6ae35') ->withExpires((new \DateTime())->modify('+365 days')) ; }}