src/Entity/Terminal.php line 74
<?phpnamespace App\Entity;use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;use ApiPlatform\Metadata\ApiFilter;use ApiPlatform\Metadata\ApiResource;use ApiPlatform\Metadata\Get;use ApiPlatform\Metadata\GetCollection;use ApiPlatform\Metadata\Patch;use ApiPlatform\Metadata\Post;use App\Dto\TerminalCommandDto;use App\Dto\TerminalPingDto;use App\Entity\Traits\CreatedAtTrait;use App\Repository\TerminalRepository;use App\State\TerminalCommandProcessor;use App\State\TerminalCreateProcessor;use App\State\TerminalPingProcessor;use Doctrine\Common\Collections\ArrayCollection;use Doctrine\Common\Collections\Collection;use Doctrine\ORM\Mapping as ORM;use Symfony\Bridge\Doctrine\Types\UlidType;use Symfony\Component\Serializer\Annotation\Groups;use Symfony\Component\Uid\Ulid;use Symfony\Component\Validator\Constraints\Length;use Symfony\Component\Validator\Constraints\NotBlank;#[ORM\HasLifecycleCallbacks]#[ORM\Entity(repositoryClass: TerminalRepository::class)]#[ORM\Index(columns: ['created_at'], name: 'idx_created_at')]#[ApiResource(operations: [new Get(uriTemplate: '/user/terminals/{id}',security: "is_granted('ROLE_CLIENT')",),new GetCollection(uriTemplate: '/user/terminals',security: "is_granted('ROLE_CLIENT')",),new Post(uriTemplate: '/user/terminals',denormalizationContext: ['groups' => 'Terminal:create'],security: "is_granted('ROLE_CLIENT')",validationContext: ['groups' => 'Terminal:create'],processor: TerminalCreateProcessor::class,),new Patch(uriTemplate: '/user/terminals/{id}',denormalizationContext: ['groups' => 'Terminal:update'],security: "is_granted('ROLE_CLIENT')",),new Patch(uriTemplate: '/user/terminals/ping/{id}',validationContext: ['groups' => 'Terminal:ping'],input: TerminalPingDto::class,processor: TerminalPingProcessor::class,),new Post(uriTemplate: '/user/terminals/command/{id}',status: 200,security: "is_granted('ROLE_CLIENT')",validationContext: ['groups' => 'Terminal:command'],input: TerminalCommandDto::class,processor: TerminalCommandProcessor::class,)],normalizationContext: ['groups' => ['Terminal:read']],order: ['createdAt' => 'ASC'],paginationClientItemsPerPage: true,paginationMaximumItemsPerPage: 50)]#[ApiFilter(SearchFilter::class, properties: ['hwid' => 'exact'])]class Terminal{use CreatedAtTrait;private const TIMEOUT = 6;#[ORM\Id]#[ORM\Column(type: UlidType::NAME, unique: true)]#[ORM\GeneratedValue(strategy: 'CUSTOM')]#[ORM\CustomIdGenerator(class: 'doctrine.ulid_generator')]#[Groups(['Terminal:read'])]private ?Ulid $id = null;#[ORM\Column(length: 128)]#[NotBlank]#[Length(min: 1, max: 128, groups: ['Default', 'Terminal:create'])]#[Groups(['Terminal:read', 'Terminal:update', 'Terminal:create'])]private ?string $name = null;#[ORM\ManyToMany(targetEntity: Client::class, inversedBy: 'terminals')]private Collection $clients;#[ORM\Column(nullable: true)]#[Groups(['Terminal:read'])]private ?\DateTimeImmutable $pingTerminalAt = null;#[ORM\Column(nullable: true)]#[Groups(['Terminal:read'])]private ?\DateTimeImmutable $pingAuraAt = null;#[ORM\Column]#[Groups(['Terminal:read'])]private ?bool $activated = true;#[ORM\Column(length: 32)]#[Groups(['Terminal:create'])]#[Length(min: 32, max: 32, groups: ['Terminal:create'])]private ?string $hwid = null;#[ORM\Column(nullable: true)]#[Groups(['Terminal:read'])]private ?array $command = null;public function __construct(){$this->clients = new ArrayCollection();}public function getId(): ?Ulid{return $this->id;}public function getName(): ?string{return $this->name;}public function setName(string $name): self{$this->name = $name;return $this;}/*** @return Collection<int, Client>*/public function getClients(): Collection{return $this->clients;}public function addClient(Client $client): self{if (!$this->clients->contains($client)) {$this->clients->add($client);}return $this;}public function removeClient(Client $client): self{$this->clients->removeElement($client);return $this;}#[Groups(['Terminal:read'])]public function isTerminalOnline(): bool{return ((new \DateTime())->getTimestamp() - $this->getPingTerminalAt()?->getTimestamp()) <= self::TIMEOUT;}public function getPingTerminalAt(): ?\DateTimeImmutable{return $this->pingTerminalAt;}public function setPingTerminalAt(?\DateTimeImmutable $pingTerminalAt): self{$this->pingTerminalAt = $pingTerminalAt;return $this;}#[Groups(['Terminal:read'])]public function isAuraOnline(): bool{return ((new \DateTime())->getTimestamp() - $this->getPingAuraAt()?->getTimestamp()) <= self::TIMEOUT;}public function getPingAuraAt(): ?\DateTimeImmutable{return $this->pingAuraAt;}public function setPingAuraAt(?\DateTimeImmutable $pingAuraAt): self{$this->pingAuraAt = $pingAuraAt;return $this;}public function isActivated(): ?bool{return $this->activated;}public function setActivated(bool $activated): self{$this->activated = $activated;return $this;}public function getHwid(): ?string{return $this->hwid;}public function setHwid(string $hwid): self{$this->hwid = $hwid;return $this;}public function getCommand(): ?array{return $this->command;}public function setCommand(?array $command): self{$this->command = $command;return $this;}}