<?php
namespace App\Entity;
use App\Utility\DateTimeUtility;
use App\Utility\GuidUtility;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Exception;
/**
* @ORM\Entity()
*
* @ORM\Table(
* name="firebase_tokens"
* )
*/
class FirebaseToken
{
public const ORIGIN_ID_MOBILE_APP_MAIN = 0;
/**
* @throws Exception
*/
public function __construct(string $currentToken, int $originId, ?User $user = null, ?string $apiKeyId = null)
{
$this->currentToken = $currentToken;
$this->originId = $originId;
$this->user = $user;
$this->apiKeyId = $apiKeyId;
$this->previousTokens = [];
$this->createdAt = DateTimeUtility::createDateTimeUtc();
$this->updatedAt = null;
$this->refreshedAt = null;
}
public function refreshToken(string $newCurrentToken, ?string $apiKeyId = null): void
{
$this->previousTokens[] = $this->currentToken;
$this->currentToken = $newCurrentToken;
$this->apiKeyId = $apiKeyId;
$this->refreshedAt = DateTimeUtility::createDateTimeUtc();
}
/**
* @ORM\GeneratedValue(strategy="CUSTOM")
*
* @ORM\CustomIdGenerator(class="App\Utility\DatabaseIdGenerator")
*
* @ORM\Column(name="id", type="guid")
*
* @ORM\Id
*/
private string $id;
public function setId(string $id)
{
GuidUtility::validOrThrow($id);
$this->id = $id;
}
public function getId(): string
{
return $this->id;
}
/**
* @ORM\Column(name="current_token", type="text", unique=true)
*/
private string $currentToken;
public function getCurrentToken(): string
{
return $this->currentToken;
}
/**
* @ORM\Column(name="previous_tokens", type="array", nullable=false)
*/
private array $previousTokens;
/**
* @return array|int[]
*/
public function getPreviousTokens(): array
{
if (!is_array($this->previousTokens)) {
return [];
}
return array_values($this->previousTokens);
}
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="firebaseTokens", cascade={"persist"})
*
* @ORM\JoinColumn(name="users_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
*/
private User $user;
public function setUser(?User $user): void
{
$this->user = $user;
}
public function getUser(): ?User
{
return $this->user;
}
/**
* @ORM\Column(name="api_key_id", type="text", nullable=true)
*/
private string $apiKeyId;
public function setApiKeyId(?string $apiKeyId): void
{
$this->apiKeyId = $apiKeyId;
}
/**
* @ORM\Column(name="origin_id", type="smallint", nullable=false)
*/
private int $originId;
/**
* @ORM\Column(name="created_at", type="datetime", nullable=false)
*/
private DateTime $createdAt;
public function setCreatedAt(DateTime $createdAt): void
{
$this->createdAt = $createdAt;
}
public function getCreatedAt(): DateTime
{
return $this->createdAt;
}
/**
* @ORM\Column(name="updated_at", type="datetime", nullable=true)
*/
private ?DateTime $updatedAt;
public function setUpdatedAt(DateTime $updatedAt): void
{
$this->updatedAt = $updatedAt;
}
public function getUpdatedAt(): ?DateTime
{
return $this->updatedAt;
}
/**
* @ORM\Column(name="refreshed_at", type="datetime", nullable=true)
*/
private ?DateTime $refreshedAt;
}