src/Entity/Terminal.php line 74

  1. <?php
  2. namespace App\Entity;
  3. use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
  4. use ApiPlatform\Metadata\ApiFilter;
  5. use ApiPlatform\Metadata\ApiResource;
  6. use ApiPlatform\Metadata\Get;
  7. use ApiPlatform\Metadata\GetCollection;
  8. use ApiPlatform\Metadata\Patch;
  9. use ApiPlatform\Metadata\Post;
  10. use App\Dto\TerminalCommandDto;
  11. use App\Dto\TerminalPingDto;
  12. use App\Entity\Traits\CreatedAtTrait;
  13. use App\Repository\TerminalRepository;
  14. use App\State\TerminalCommandProcessor;
  15. use App\State\TerminalCreateProcessor;
  16. use App\State\TerminalPingProcessor;
  17. use Doctrine\Common\Collections\ArrayCollection;
  18. use Doctrine\Common\Collections\Collection;
  19. use Doctrine\ORM\Mapping as ORM;
  20. use Symfony\Bridge\Doctrine\Types\UlidType;
  21. use Symfony\Component\Serializer\Annotation\Groups;
  22. use Symfony\Component\Uid\Ulid;
  23. use Symfony\Component\Validator\Constraints\Length;
  24. use Symfony\Component\Validator\Constraints\NotBlank;
  25. #[ORM\HasLifecycleCallbacks]
  26. #[ORM\Entity(repositoryClassTerminalRepository::class)]
  27. #[ORM\Index(columns: ['created_at'], name'idx_created_at')]
  28. #[ApiResource(
  29.     operations: [
  30.         new Get(
  31.             uriTemplate'/user/terminals/{id}',
  32.             security"is_granted('ROLE_CLIENT')",
  33.         ),
  34.         new GetCollection(
  35.             uriTemplate'/user/terminals',
  36.             security"is_granted('ROLE_CLIENT')",
  37.         ),
  38.         new Post(
  39.             uriTemplate'/user/terminals',
  40.             denormalizationContext: ['groups' => 'Terminal:create'],
  41.             security"is_granted('ROLE_CLIENT')",
  42.             validationContext: ['groups' => 'Terminal:create'],
  43.             processorTerminalCreateProcessor::class,
  44.         ),
  45.         new Patch(
  46.             uriTemplate'/user/terminals/{id}',
  47.             denormalizationContext: ['groups' => 'Terminal:update'],
  48.             security"is_granted('ROLE_CLIENT')",
  49.         ),
  50.         new Patch(
  51.             uriTemplate'/user/terminals/ping/{id}',
  52.             validationContext: ['groups' => 'Terminal:ping'],
  53.             inputTerminalPingDto::class,
  54.             processorTerminalPingProcessor::class,
  55.         ),
  56.         new Post(
  57.             uriTemplate'/user/terminals/command/{id}',
  58.             status200,
  59.             security"is_granted('ROLE_CLIENT')",
  60.             validationContext: ['groups' => 'Terminal:command'],
  61.             inputTerminalCommandDto::class,
  62.             processorTerminalCommandProcessor::class,
  63.         )
  64.     ],
  65.     normalizationContext: ['groups' => ['Terminal:read']],
  66.     order: ['createdAt' => 'ASC'],
  67.     paginationClientItemsPerPagetrue,
  68.     paginationMaximumItemsPerPage50
  69. )]
  70. #[ApiFilter(SearchFilter::class, properties: ['hwid' => 'exact'])]
  71. class Terminal
  72. {
  73.     use CreatedAtTrait;
  74.     private const TIMEOUT 6;
  75.     #[ORM\Id]
  76.     #[ORM\Column(typeUlidType::NAMEuniquetrue)]
  77.     #[ORM\GeneratedValue(strategy'CUSTOM')]
  78.     #[ORM\CustomIdGenerator(class: 'doctrine.ulid_generator')]
  79.     #[Groups(['Terminal:read'])]
  80.     private ?Ulid $id null;
  81.     #[ORM\Column(length128)]
  82.     #[NotBlank]
  83.     #[Length(min1max128groups: ['Default''Terminal:create'])]
  84.     #[Groups(['Terminal:read''Terminal:update''Terminal:create'])]
  85.     private ?string $name null;
  86.     #[ORM\ManyToMany(targetEntityClient::class, inversedBy'terminals')]
  87.     private Collection $clients;
  88.     #[ORM\Column(nullabletrue)]
  89.     #[Groups(['Terminal:read'])]
  90.     private ?\DateTimeImmutable $pingTerminalAt null;
  91.     #[ORM\Column(nullabletrue)]
  92.     #[Groups(['Terminal:read'])]
  93.     private ?\DateTimeImmutable $pingAuraAt null;
  94.     #[ORM\Column]
  95.     #[Groups(['Terminal:read'])]
  96.     private ?bool $activated true;
  97.     #[ORM\Column(length32)]
  98.     #[Groups(['Terminal:create'])]
  99.     #[Length(min32max32groups: ['Terminal:create'])]
  100.     private ?string $hwid null;
  101.     #[ORM\Column(nullabletrue)]
  102.     #[Groups(['Terminal:read'])]
  103.     private ?array $command null;
  104.     public function __construct()
  105.     {
  106.         $this->clients = new ArrayCollection();
  107.     }
  108.     public function getId(): ?Ulid
  109.     {
  110.         return $this->id;
  111.     }
  112.     public function getName(): ?string
  113.     {
  114.         return $this->name;
  115.     }
  116.     public function setName(string $name): self
  117.     {
  118.         $this->name $name;
  119.         return $this;
  120.     }
  121.     /**
  122.      * @return Collection<int, Client>
  123.      */
  124.     public function getClients(): Collection
  125.     {
  126.         return $this->clients;
  127.     }
  128.     public function addClient(Client $client): self
  129.     {
  130.         if (!$this->clients->contains($client)) {
  131.             $this->clients->add($client);
  132.         }
  133.         return $this;
  134.     }
  135.     public function removeClient(Client $client): self
  136.     {
  137.         $this->clients->removeElement($client);
  138.         return $this;
  139.     }
  140.     #[Groups(['Terminal:read'])]
  141.     public function isTerminalOnline(): bool
  142.     {
  143.         return ((new \DateTime())->getTimestamp() - $this->getPingTerminalAt()?->getTimestamp()) <= self::TIMEOUT;
  144.     }
  145.     public function getPingTerminalAt(): ?\DateTimeImmutable
  146.     {
  147.         return $this->pingTerminalAt;
  148.     }
  149.     public function setPingTerminalAt(?\DateTimeImmutable $pingTerminalAt): self
  150.     {
  151.         $this->pingTerminalAt $pingTerminalAt;
  152.         return $this;
  153.     }
  154.     #[Groups(['Terminal:read'])]
  155.     public function isAuraOnline(): bool
  156.     {
  157.         return ((new \DateTime())->getTimestamp() - $this->getPingAuraAt()?->getTimestamp()) <= self::TIMEOUT;
  158.     }
  159.     public function getPingAuraAt(): ?\DateTimeImmutable
  160.     {
  161.         return $this->pingAuraAt;
  162.     }
  163.     public function setPingAuraAt(?\DateTimeImmutable $pingAuraAt): self
  164.     {
  165.         $this->pingAuraAt $pingAuraAt;
  166.         return $this;
  167.     }
  168.     public function isActivated(): ?bool
  169.     {
  170.         return $this->activated;
  171.     }
  172.     public function setActivated(bool $activated): self
  173.     {
  174.         $this->activated $activated;
  175.         return $this;
  176.     }
  177.     public function getHwid(): ?string
  178.     {
  179.         return $this->hwid;
  180.     }
  181.     public function setHwid(string $hwid): self
  182.     {
  183.         $this->hwid $hwid;
  184.         return $this;
  185.     }
  186.     public function getCommand(): ?array
  187.     {
  188.         return $this->command;
  189.     }
  190.     public function setCommand(?array $command): self
  191.     {
  192.         $this->command $command;
  193.         return $this;
  194.     }
  195. }