src/Entity/TikTokAuth.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Services\TikTok\Dto\TikTokAuthDto;
  4. use DateTime;
  5. use DateTimeImmutable;
  6. use Doctrine\ORM\Mapping\Column;
  7. use Doctrine\ORM\Mapping\Entity;
  8. use Doctrine\ORM\Mapping\Id;
  9. use Symfony\Component\Uid\Uuid;
  10. #[Entity]
  11. class TikTokAuth
  12. {
  13.     #[Id]
  14.     #[Column(type'uuid'uniquetrue)]
  15.     private Uuid $id;
  16.     #[Column(type'uuid'uniquetruenullabletrue)]
  17.     private ?Uuid $unionId null;
  18.     #[Column(type'string')]
  19.     private string $accessToken;
  20.     #[Column(type'string')]
  21.     private string $refreshToken;
  22.     // A6: plain DEFAULT, no `ON UPDATE CURRENT_TIMESTAMP`, so refreshed_at advances
  23.     // only when we explicitly set it on a SUCCESSFUL token exchange — not on every
  24.     // row write (a failure-flag write used to make a dead token look freshly refreshed).
  25.     #[Column(
  26.         type'datetime_immutable',
  27.         nullablefalse,
  28.         columnDefinition'TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL',
  29.     )]
  30.     private DateTimeImmutable $refreshedAt;
  31.     #[Column(
  32.         type'datetime_immutable',
  33.         nullabletrue,
  34.         columnDefinition'TIMESTAMP NULL',
  35.     )]
  36.     private ?DateTimeImmutable $refreshExpiresAt null;
  37.     // A2/A3: a failed refresh flags the token here instead of poisoning
  38.     // refreshExpiresAt (which must stay the true 365-day expiry). needsReconnect
  39.     // is what the proactive refresher (findTikTokAuthToUpdate) excludes, and what
  40.     // the creator's reconnect clears.
  41.     #[Column(type'boolean'options: ['default' => false])]
  42.     private bool $needsReconnect false;
  43.     #[Column(type'datetime_immutable'nullabletrue)]
  44.     private ?DateTimeImmutable $refreshFailedAt null;
  45.     // A5: when the 24h access token expires (= last issuance + expires_in). The
  46.     // lazy refresher keys off THIS, not a 1-hour timer on refreshedAt, so a
  47.     // still-valid access token isn't re-fetched on nearly every request.
  48.     #[Column(type'datetime_immutable'nullabletrue)]
  49.     private ?DateTimeImmutable $accessTokenExpiresAt null;
  50.     // One-off reconnect-email campaign (app:tiktok:reconnect-email): timestamp of when
  51.     // we last emailed this flagged account asking the owner to reconnect TikTok. Acts as
  52.     // a suppression marker so the batch never double-emails the same flagged account, and
  53.     // it is independent of needsReconnect (which the creator's reconnect clears).
  54.     #[Column(type'datetime_immutable'nullabletrue)]
  55.     private ?DateTimeImmutable $reconnectEmailSentAt null;
  56.     public function getId(): Uuid
  57.     {
  58.         return $this->id;
  59.     }
  60.     public function setId(Uuid $id): static
  61.     {
  62.         $this->id $id;
  63.         return $this;
  64.     }
  65.     public function setUnionId(Uuid $unionId): static
  66.     {
  67.         $this->unionId $unionId;
  68.         return $this;
  69.     }
  70.     public function getUnionId(): ?Uuid
  71.     {
  72.         return $this->unionId;
  73.     }
  74.     public function getAccessToken(): string
  75.     {
  76.         return $this->accessToken;
  77.     }
  78.     public function setAccessToken(string $accessToken): static
  79.     {
  80.         $this->accessToken $accessToken;
  81.         return $this;
  82.     }
  83.     public function getRefreshToken(): string
  84.     {
  85.         return $this->refreshToken;
  86.     }
  87.     public function setRefreshToken(string $refreshToken): static
  88.     {
  89.         $this->refreshToken $refreshToken;
  90.         return $this;
  91.     }
  92.     public function getRefreshedAt(): DateTimeImmutable
  93.     {
  94.         return $this->refreshedAt;
  95.     }
  96.     public function setRefreshedAt(DateTimeImmutable $refreshedAt): static
  97.     {
  98.         $this->refreshedAt $refreshedAt;
  99.         return $this;
  100.     }
  101.     public function setRefreshedAtNow(): static
  102.     {
  103.         $this->refreshedAt = new DateTimeImmutable;
  104.         return $this;
  105.     }
  106.     public function getRefreshExpiresAt(): ?DateTimeImmutable
  107.     {
  108.         return $this->refreshExpiresAt;
  109.     }
  110.     public function setRefreshExpiresAt(?DateTimeImmutable $refreshExpiresAt): static
  111.     {
  112.         $this->refreshExpiresAt $refreshExpiresAt;
  113.         return $this;
  114.     }
  115.     public function needsReconnect(): bool
  116.     {
  117.         return $this->needsReconnect;
  118.     }
  119.     public function setNeedsReconnect(bool $needsReconnect): static
  120.     {
  121.         $this->needsReconnect $needsReconnect;
  122.         return $this;
  123.     }
  124.     public function getRefreshFailedAt(): ?DateTimeImmutable
  125.     {
  126.         return $this->refreshFailedAt;
  127.     }
  128.     public function setRefreshFailedAt(?DateTimeImmutable $refreshFailedAt): static
  129.     {
  130.         $this->refreshFailedAt $refreshFailedAt;
  131.         return $this;
  132.     }
  133.     public function getAccessTokenExpiresAt(): ?DateTimeImmutable
  134.     {
  135.         return $this->accessTokenExpiresAt;
  136.     }
  137.     public function setAccessTokenExpiresAt(?DateTimeImmutable $accessTokenExpiresAt): static
  138.     {
  139.         $this->accessTokenExpiresAt $accessTokenExpiresAt;
  140.         return $this;
  141.     }
  142.     public function getReconnectEmailSentAt(): ?DateTimeImmutable
  143.     {
  144.         return $this->reconnectEmailSentAt;
  145.     }
  146.     public function setReconnectEmailSentAt(?DateTimeImmutable $reconnectEmailSentAt): static
  147.     {
  148.         $this->reconnectEmailSentAt $reconnectEmailSentAt;
  149.         return $this;
  150.     }
  151.     public function toDto(): TikTokAuthDto
  152.     {
  153.         return new TikTokAuthDto(
  154.             $this->getId(),
  155.             $this->getAccessToken(),
  156.             $this->getRefreshToken(),
  157.             $this->getRefreshedAt(),
  158.             $this->getRefreshExpiresAt(),
  159.             $this->getAccessTokenExpiresAt(),
  160.             $this->getUnionId(),
  161.         );
  162.     }
  163. }