<?php
namespace App\Entity\Abonnent;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'abonnenttoken')]
class Abonnenttoken
{
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'NONE')]
#[ORM\Column(name: 'token', type: 'string', length: 128, nullable: false)]
private string $token;
#[ORM\Column(name: 'create_at', type: 'datetime', nullable: false)]
private \DateTimeInterface $createAt;
/**
* @throws \Exception
*/
public function __construct(
#[ORM\ManyToOne(targetEntity: Abonnent::class, inversedBy:'tokens')]
private readonly Abonnent $abonnent,
#[ORM\Column(name: 'expire_at', type: 'datetime', nullable: false)]
private readonly \DateTimeInterface $expireAt
)
{
// Token bisher
// $this->token = sha1($this->abonnent->getUsername().':'.$this->abonnent->getId().':'.date('d-m-Y-H:i:s'));
// Token neu - es kam sporadisch zu einem Problem, wo zweimal versucht wurde dasselbe Token zu setzen
// [2024-10-30T12:57:00.551733+01:00] [109.115.154.98] [www.urnerwochenblatt.ch] [/abo/login] [???] [request.CRITICAL] [Uncaught PHP Exception Doctrine\DBAL\Exception\UniqueConstraintViolationException: "An exception occurred while executing a query: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '94b4b973877a2eec35601c5def1d10cf3d394925' for key 'abonnenttoken.PRIMARY'" at /home/www-data/www.urnerwochenblatt.ch/releases/20241023072727/vendor/doctrine/dbal/src/Driver/API/MySQL/ExceptionConverter.php line 62]
$this->token = bin2hex(random_bytes(20));
$this->createAt = new \DateTime('now');
}
public function getToken(): string
{
return $this->token;
}
public function getAbonnent(): Abonnent
{
return $this->abonnent;
}
public function getCreateAt(): \DateTimeInterface
{
return $this->createAt;
}
public function getExpireAt(): \DateTimeInterface
{
return $this->expireAt;
}
public function hasExpired(): bool
{
$now = new \DateTime();
return $this->expireAt < $now;
}
}