"remoteId <> ''"])] class Invite implements TrackUpdateInterface, TrackCreationInterface { use RemoteCalendarTrait; use TrackCreationTrait; use TrackUpdateTrait; final public const ACCEPTED = 'accepted'; final public const DECLINED = 'declined'; final public const PENDING = 'pending'; /** * all statuses in one const. */ final public const STATUSES = [ self::ACCEPTED, self::DECLINED, self::PENDING, self::TENTATIVELY_ACCEPTED, ]; final public const TENTATIVELY_ACCEPTED = 'tentative'; #[ORM\ManyToOne(targetEntity: Calendar::class, inversedBy: 'invites')] private ?Calendar $calendar = null; #[Serializer\Groups(groups: ['calendar:read', 'read'])] #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: \Doctrine\DBAL\Types\Types::INTEGER)] private ?int $id = null; #[Serializer\Groups(groups: ['calendar:read', 'read', 'docgen:read'])] #[ORM\Column(type: \Doctrine\DBAL\Types\Types::TEXT, nullable: false, options: ['default' => 'pending'])] private string $status = self::PENDING; #[Serializer\Groups(groups: ['calendar:read', 'read', 'docgen:read'])] #[ORM\ManyToOne(targetEntity: User::class)] #[ORM\JoinColumn(nullable: false)] private ?User $user = null; public function getCalendar(): ?Calendar { return $this->calendar; } public function getId(): ?int { return $this->id; } public function getStatus(): string { return $this->status; } public function getUser(): ?User { return $this->user; } /** * @internal use Calendar::addInvite instead */ public function setCalendar(?Calendar $calendar): void { $this->calendar = $calendar; } public function setStatus(string $status): self { $this->status = $status; return $this; } public function setUser(?User $user): self { if ($user instanceof User && $this->user instanceof User && $user !== $this->user) { throw new \LogicException('Not allowed to associate an invite to a different user'); } $this->user = $user; return $this; } }