src/Entity/Token.php line 29

  1. <?php
  2. namespace App\Entity;
  3. use App\Repository\TokenRepository;
  4. use App\Security\Model\BelongUser;
  5. use App\Validator\Constraints as AssertApp;
  6. use Doctrine\ORM\Mapping as ORM;
  7. use Gedmo\Blameable\Traits\BlameableEntity;
  8. use Gedmo\Timestampable\Traits\TimestampableEntity;
  9. use Symfony\Component\Serializer\Annotation\Groups;
  10. use Symfony\Component\Validator\Constraints as Assert;
  11. use ApiPlatform\Metadata\ApiResource;
  12. use ApiPlatform\Metadata\Post;
  13. use App\Controller\Api\Auth\TokenController;
  14. use DateTime;
  15. #[ORM\Entity(TokenRepository::class)]
  16. #[ORM\Table(name'`Token`')]
  17. #[ApiResource(
  18.     operations: [
  19.         new Post(
  20.             uriTemplate'/login',
  21.             routeName'app_api_token_login',
  22.             controllerTokenController::class,
  23.             normalizationContext: ['groups' => ['token_get''token_get_login']]
  24.         )
  25.     ]
  26. )]
  27. class Token implements BelongUser{
  28.     use BlameableEntity;
  29.     use TimestampableEntity;
  30.     #[ORM\Id()]
  31.     #[Groups([
  32.         'token_get',
  33.         'user_get_me'
  34.     ])]
  35.     #[ORM\Column(type'string'length128)]
  36.     private ?string $id;
  37.     #[ORM\OneToOne(inversedBy'token'targetEntityRefreshToken::class, cascade: [ 'persist' ], fetch'EAGER')]
  38.     #[ORM\JoinColumn(nullabletrue)]
  39.     #[Groups([
  40.         'token_get',
  41.         'user_get_me',
  42.     ])]
  43.     private ?RefreshToken $refreshToken;
  44.     #[ORM\Column(type"integer")]
  45.     #[Groups([
  46.         'token_get',
  47.         'user_get_me',
  48.     ])]
  49.     private ?int $createTime;
  50.     #[ORM\Column(type"integer"nullabletrue)]
  51.     #[Groups([
  52.         'token_get',
  53.         'user_get_me',
  54.     ])]
  55.     #[AssertApp\IfNotEmpty([
  56.         new Assert\Range(
  57.             min60,
  58.             groups: [ 'token_post' ],
  59.             minMessage'Un token doit ĂȘtre valide au minimum 60 secondes'
  60.         )
  61.     ], groups: [ "token_post" ])]
  62.     private ?int $lifetime;
  63.     #[ORM\ManyToOne(targetEntityUser::class, inversedBy'tokens')]
  64.     #[ORM\JoinColumn(nullabletrue)]
  65.     #[Groups([
  66.         'token_get_login',
  67.     ])]
  68.     private ?User $user;
  69.     #[ORM\Column(type'string'nullabletrue)]
  70.     #[Groups([
  71.         'token_get',
  72.         'user_get_me',
  73.     ])]
  74.     #[Assert\NotNull(groups: [ 'token_post' ])]
  75.     #[Assert\NotBlank(groups: [ 'token_post' ])]
  76.     private ?string $name;
  77.     public function __construct(
  78.         ?User $user null,
  79.         ?int $lifetime null,
  80.         ?int $refreshLifetime null,
  81.         string $name null)
  82.     {
  83.         $this->id           'TOKEN_'.bin2hex(random_bytes(20));
  84.         $this->createdAt = new DateTime();
  85.         $this->updatedAt = new DateTime();
  86.         $this->refreshToken $refreshLifetime !== null ? new RefreshToken($user$refreshLifetime) : null;
  87.         $this->user         $user;
  88.         $this->createTime   time();
  89.         $this->lifetime     $lifetime;
  90.         $this->name         $name;
  91.         if ($user) {
  92.             $user->addToken($this);
  93.         }
  94.     }
  95.     public function getId(): string {
  96.         return $this->id;
  97.     }
  98.     public function getRefreshToken(): ?RefreshToken {
  99.         return $this->refreshToken;
  100.     }
  101.     public function getCreateTime(): int {
  102.         return $this->createTime;
  103.     }
  104.     public function getLifetime(): ?int {
  105.         return $this->lifetime;
  106.     }
  107.     public function getName(): ?string {
  108.         return $this->name;
  109.     }
  110.     public function getUser(): User {
  111.         return $this->user;
  112.     }
  113.     public function isValid(): bool {
  114.         return $this->getLifetime() === null || ($this->getCreateTime() + $this->getLifetime() - (new \DateTime())->getTimestamp()) > 0;
  115.     }
  116. }