<?php
namespace App\Entity;
use App\Utility\DateTimeUtility;
use App\Utility\GuidUtility;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
*
* @ORM\Table(
* name="onetime_login_tokens",
* uniqueConstraints={
*
* @ORM\UniqueConstraint(name="code_unique_idx", columns={"code"})
* }
* )
*/
class OnetimeLoginToken
{
/**
* @var string
*
* @ORM\GeneratedValue(strategy="CUSTOM")
*
* @ORM\CustomIdGenerator(class="App\Utility\DatabaseIdGenerator")
*
* @ORM\Column(name="id", type="guid")
*
* @ORM\Id
*/
protected $id;
public function setId(string $id): void
{
GuidUtility::validOrThrow($id);
$this->id = $id;
}
public function getId()
{
return $this->id;
}
/**
* @var DateTime
*
* @ORM\Column(name="created_at", type="datetime", nullable=false)
*/
protected $createdAt;
public function setCreatedAt(DateTime $createdAt): void
{
$this->createdAt = $createdAt;
}
public function getCreatedAt(): DateTime
{
return $this->createdAt;
}
/**
* @var DateTime
*
* @ORM\Column(name="redeemed_at", type="datetime", nullable=true)
*/
protected $redeemedAt;
public function setRedeemedAt(DateTime $redeemedAt): void
{
$this->redeemedAt = $redeemedAt;
}
public function getRedeemedAt()
{
return $this->redeemedAt;
}
/**
* @var DateTime
*
* @ORM\Column(name="valid_until", type="datetime", nullable=false)
*/
protected $validUntil;
public function setValidUntil(DateTime $validUntil): void
{
$this->validUntil = $validUntil;
}
public function getValidUntil(): DateTime
{
return $this->validUntil;
}
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="onetimeLoginTokens", cascade={"persist"})
*
* @ORM\JoinColumn(name="users_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
protected $user;
public function setUser(User $user): void
{
$this->user = $user;
}
public function getUser(): User
{
return $this->user;
}
/**
* @var string
*
* @ORM\Column(name="code", type="string", length=256, nullable=false)
*/
protected $code;
public function setCode(string $code): void
{
$this->code = $code;
}
public function getCode(): string
{
return $this->code;
}
/**
* @var bool
*
* @ORM\Column(name="is_redeemed", type="boolean", nullable=false)
*/
protected $isRedeemed;
public function setIsRedeemed(bool $isRedeemed): void
{
$this->isRedeemed = $isRedeemed;
}
public function isRedeemed(): bool
{
return $this->isRedeemed;
}
public function __construct(User $user, DateTime $validUntil)
{
$this->user = $user;
$this->validUntil = $validUntil;
$this->createdAt = DateTimeUtility::createDateTimeUtc();
$this->code = self::generateCode();
$this->setIsRedeemed(false);
}
protected static function generateCode()
{
return bin2hex(random_bytes(128));
}
}