src/Entity/Sujet.php line 67

  1. <?php
  2. namespace App\Entity;
  3. use ApiPlatform\Doctrine\Orm\Filter\BooleanFilter;
  4. use ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
  5. use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
  6. use ApiPlatform\Metadata\ApiFilter;
  7. use ApiPlatform\Metadata\ApiResource;
  8. use ApiPlatform\Metadata\GetCollection;
  9. use ApiPlatform\Metadata\Get;
  10. use ApiPlatform\Metadata\Post;
  11. use ApiPlatform\Metadata\Put;
  12. use App\Controller\Api\Controller\Course\Forum\ForumSubjects;
  13. use App\Controller\Api\Controller\Course\Forum\PostSubjectController;
  14. use App\Controller\Api\Controller\Course\Forum\SujetResoluController;
  15. use App\Repository\SujetRepository;
  16. use DateTimeImmutable;
  17. use Doctrine\Common\Collections\ArrayCollection;
  18. use Doctrine\Common\Collections\Collection;
  19. use Doctrine\DBAL\Types\Types;
  20. use Doctrine\ORM\Mapping as ORM;
  21. use Symfony\Component\Serializer\Annotation\Groups;
  22. use Symfony\Component\Validator\Constraints as Assert;
  23. #[ORM\Entity(repositoryClassSujetRepository::class)]
  24. #[ApiResource(
  25.     operations: [
  26.         new GetCollection(),
  27.         new GetCollection(
  28.             uriTemplate'/forum/{id}/subjects',
  29.             controllerForumSubjects::class,
  30.             openapiContext: [
  31.                 'description' => "Cette route permet de récuperer la liste des sujets d'un forum donné en foction de son id"
  32.             ]
  33.         ),
  34.         new Get(),
  35.         new Post(
  36.             uriTemplate'/sujet/{id}/new',
  37.             controllerPostSubjectController::class,
  38.             openapiContext: [
  39.                 'security' => [['bearerAuth' => []]],
  40.                 'description' => "Cette route permet de créer un sujet dans le forum. On precise l'id du forum dans l'url"
  41.             ]
  42.         ),
  43.         new Put(
  44.             uriTemplate'/sujet/{id}/mark-solved',
  45.             controllerSujetResoluController::class,
  46.             openapiContext: [
  47.                 'security' => [['bearerAuth' => []]],
  48.                 'description' => "Cette route permet de marquer qu'un sujet est resolu. l'id en paramètre est l'id du message permettant de resoudre le problème"
  49.             ]
  50.         )
  51.     ],
  52.     normalizationContext: ['groups' => ['read:sujet:collection']],
  53.     denormalizationContext: ['groups' => ['post:sujet:item']]
  54. )]
  55. #[
  56.     ApiFilter(SearchFilter::class, properties: [
  57.         'forum' => 'exact',
  58.         'forum.cours' => 'exact',
  59.     ]),
  60.     ApiFilter(OrderFilter::class, properties: ['createdAt']),
  61.     ApiFilter(BooleanFilter::class, properties: ['isSolved'])
  62. ]
  63. class Sujet
  64. {
  65.     #[ORM\Id]
  66.     #[ORM\GeneratedValue]
  67.     #[ORM\Column]
  68.     #[Groups(['read:sujet:collection'])]
  69.     private ?int $id null;
  70.     #[ORM\OneToMany(mappedBy'sujet'targetEntityForumMessage::class, cascade: ['persist''remove'], orphanRemovaltrue)]
  71.     #[Groups(['read:sujet:item'])]
  72.     private Collection $forumMessages;
  73.     #[ORM\ManyToOne(inversedBy'sujets')]
  74.     #[ORM\JoinColumn(nullablefalse)]
  75.     #[Groups(['read:sujet:collection'])]
  76.     private ?Membre $membre null;
  77.     #[ORM\ManyToOne(inversedBy'sujets')]
  78.     #[ORM\JoinColumn(nullablefalse)]
  79.     private ?Forum $forum null;
  80.     #[ORM\Column(typeTypes::TEXT)]
  81.     #[Assert\NotBlank(message"Ne peut être vide !")]
  82.     #[Assert\NotNull(message"Ne peut être nul !")]
  83.     #[Groups(['read:sujet:collection''post:sujet:item'])]
  84.     private ?string $content null;
  85.     #[ORM\Column]
  86.     #[Groups(['read:sujet:collection''put:sujet:item'])]
  87.     private ?bool $isSolved null;
  88.     #[ORM\Column]
  89.     #[Groups(['read:sujet:collection'])]
  90.     private ?\DateTimeImmutable $createdAt null;
  91.     #[ORM\Column(length255nullabletrue)]
  92.     #[Groups(['read:sujet:collection'])]
  93.     private ?string $reference null;
  94.     public function __construct()
  95.     {
  96.         $this->forumMessages = new ArrayCollection();
  97.         $this->isSolved false;
  98.         $this->createdAt = new DateTimeImmutable();
  99.     }
  100.     public function getId(): ?int
  101.     {
  102.         return $this->id;
  103.     }
  104.     /**
  105.      * @return Collection<int, ForumMessage>
  106.      */
  107.     public function getForumMessages(): Collection
  108.     {
  109.         return $this->forumMessages;
  110.     }
  111.     public function addForumMessage(ForumMessage $forumMessage): self
  112.     {
  113.         if (!$this->forumMessages->contains($forumMessage)) {
  114.             $this->forumMessages->add($forumMessage);
  115.             $forumMessage->setSujet($this);
  116.         }
  117.         return $this;
  118.     }
  119.     public function removeForumMessage(ForumMessage $forumMessage): self
  120.     {
  121.         if ($this->forumMessages->removeElement($forumMessage)) {
  122.             // set the owning side to null (unless already changed)
  123.             if ($forumMessage->getSujet() === $this) {
  124.                 $forumMessage->setSujet(null);
  125.             }
  126.         }
  127.         return $this;
  128.     }
  129.     public function getMembre(): ?Membre
  130.     {
  131.         return $this->membre;
  132.     }
  133.     public function setMembre(?Membre $membre): self
  134.     {
  135.         $this->membre $membre;
  136.         return $this;
  137.     }
  138.     public function getForum(): ?Forum
  139.     {
  140.         return $this->forum;
  141.     }
  142.     public function setForum(?Forum $forum): self
  143.     {
  144.         $this->forum $forum;
  145.         return $this;
  146.     }
  147.     public function getContent(): ?string
  148.     {
  149.         return $this->content;
  150.     }
  151.     public function setContent(string $content): self
  152.     {
  153.         $this->content $content;
  154.         return $this;
  155.     }
  156.     public function isIsSolved(): ?bool
  157.     {
  158.         return $this->isSolved;
  159.     }
  160.     public function setIsSolved(bool $isSolved): self
  161.     {
  162.         $this->isSolved $isSolved;
  163.         return $this;
  164.     }
  165.     public function getCreatedAt(): ?\DateTimeImmutable
  166.     {
  167.         return $this->createdAt;
  168.     }
  169.     public function setCreatedAt(\DateTimeImmutable $createdAt): self
  170.     {
  171.         $this->createdAt $createdAt;
  172.         return $this;
  173.     }
  174.     public function getReference(): ?string
  175.     {
  176.         return $this->reference;
  177.     }
  178.     public function setReference(?string $reference): self
  179.     {
  180.         $this->reference $reference;
  181.         return $this;
  182.     }
  183. }