<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
use App\Repository\TeamInvitationRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Uid\Uuid;
/**
* @ORM\Entity(repositoryClass=TeamInvitationRepository::class)
* @ORM\HasLifecycleCallbacks()
* @ApiResource(
* normalizationContext={"groups"={"team_invitation:read"}},
* collectionOperations={
* "post"={
* "security"="is_granted('ROLE_USER')",
* "controller"="App\Controller\Api\TeamInvitationController::create",
* "deserialize"=false
* }
* },
* itemOperations={
* "get"={
* "security"="is_granted('ROLE_USER')",
* "normalization_context"={"groups"={"team_invitation:read:public"}},
* "controller"="App\Controller\Api\TeamInvitationController::getByToken"
* }
* }
* )
* @ApiFilter(PropertyFilter::class, arguments={"parameterName"="fields", "overrideDefaultProperties"=true})
*/
class TeamInvitation
{
const EXPIRATION_HOURS = 24;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"team_invitation:read"})
*/
private $id;
/**
* @ORM\Column(type="string", length=64, unique=true)
* @Groups({"team_invitation:read", "team_invitation:read:public"})
*/
private $token;
/**
* @ORM\ManyToOne(targetEntity=Team::class)
* @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
* @Groups({"team_invitation:read", "team_invitation:read:public"})
*/
private $team;
/**
* @ORM\ManyToOne(targetEntity=User::class)
* @ORM\JoinColumn(nullable=false)
* @Groups({"team_invitation:read"})
*/
private $createdBy;
/**
* @ORM\Column(type="datetime")
* @Groups({"team_invitation:read", "team_invitation:read:public"})
*/
private $expiresAt;
/**
* @ORM\Column(type="datetime")
* @Groups({"team_invitation:read"})
*/
private $createdAt;
/**
* @ORM\PrePersist
*/
public function onPrePersist(): void
{
$this->token = Uuid::v4()->toBase58();
$this->createdAt = new \DateTime();
$this->expiresAt = (new \DateTime())->modify('+'.self::EXPIRATION_HOURS.' hours');
}
public function isValid(): bool
{
if (new \DateTime() > $this->expiresAt) {
return false;
}
if (!$this->team || !$this->team->isActive()) {
return false;
}
$teamplay = $this->team->getTeamplay();
if (!$teamplay || !$teamplay->isActive() || !$teamplay->isInProgress()) {
return false;
}
return true;
}
// Getters / Setters
public function getId(): ?int { return $this->id; }
public function getToken(): ?string { return $this->token; }
public function getTeam(): ?Team { return $this->team; }
public function setTeam(?Team $team): self { $this->team = $team; return $this; }
public function getCreatedBy(): ?User { return $this->createdBy; }
public function setCreatedBy(?User $user): self { $this->createdBy = $user; return $this; }
public function getExpiresAt(): ?\DateTimeInterface { return $this->expiresAt; }
public function getCreatedAt(): ?\DateTimeInterface { return $this->createdAt; }
}