<?php 
 
namespace 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\Post; 
use App\Controller\Action\DiscussionListController; 
use App\Controller\Action\DiscussionPostController; 
use App\Repository\DiscussionRepository; 
use App\State\DiscussionPostProcessor; 
use Doctrine\Common\Collections\Collection; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Serializer\Annotation\Groups; 
 
#[ORM\Entity(repositoryClass: DiscussionRepository::class)] 
#[ApiResource( 
    operations: [ 
        new Get(), 
        new GetCollection(), 
        new Post(), 
        new Post( 
            uriTemplate: 'discussions/new_discussion', 
            controller: DiscussionPostController::class, 
            name: '_api_/discussions/new_discussion', 
        ), 
        new GetCollection( 
            uriTemplate: 'discussion/list', 
            controller: DiscussionListController::class, 
            read: false, 
            write: false, 
            name: '_api_/discussion/list' 
        ) 
    ], 
    normalizationContext: ['groups' => ['discussion.get']], 
    denormalizationContext: ['groups' => ['discussion.write']] 
)] 
#[ApiFilter( 
    SearchFilter::class, 
    properties: [ 
        'type' => 'exact', 
        'site' => 'exact', 
    ] 
)] 
class Discussion 
{ 
    #[ORM\Id] 
    #[ORM\GeneratedValue] 
    #[ORM\Column] 
    #[Groups(['discussion.write','discussion.get'])] 
    private ?int $id = null; 
 
    #[ORM\Column(type: "text", nullable: true)] 
    #[Groups(['discussion.write','discussion.get'])] 
    private ?string $topic = null; 
 
    #[ORM\Column(type: "datetime", nullable: true)] 
    #[Groups(['discussion.write','discussion.get'])] 
    private \DateTimeInterface $createdAt; 
 
    #[ORM\ManyToOne(inversedBy: 'discussions')] 
    #[Groups(['discussion.write','discussion.get'])] 
    private ?User $user = null; 
 
    #[ORM\ManyToOne(inversedBy: 'discussions')] 
    private ?Document $document = null; 
 
    #[ORM\OneToMany(mappedBy: 'discussion', targetEntity: Message::class)] 
    private Collection $messages; 
 
    #[ORM\ManyToOne] 
    #[ORM\JoinColumn(nullable: false)] 
    #[Groups(['discussion.get'])] 
    private ?Site $site = null; 
 
    #[ORM\Column(type: "string", length: 255, nullable: true)] 
    #[Groups(['discussion.write','discussion.get'])] 
    private ?string $type = null; 
 
    #[ORM\Column(nullable: true)] 
    #[Groups(['discussion.write','discussion.get'])] 
    private ?\DateTimeImmutable $updatedAt = null; 
 
    public function __construct() 
    { 
        $this->createdAt = new \DateTime(); 
    } 
 
    /** 
     * @return int|null 
     */ 
    public function getId(): ?int 
    { 
        return $this->id; 
    } 
 
    /** 
     * @param int|null $id 
     */ 
    public function setId(?int $id): void 
    { 
        $this->id = $id; 
    } 
 
    /** 
     * @return string|null 
     */ 
    public function getTopic(): ?string 
    { 
        return $this->topic; 
    } 
 
    /** 
     * @param string $topic 
     */ 
    public function setTopic(?string $topic): void 
    { 
        $this->topic = $topic; 
    } 
 
    /** 
     * @return \DateTimeInterface 
     */ 
    public function getCreatedAt(): \DateTimeInterface 
    { 
        return $this->createdAt; 
    } 
 
    /** 
     * @param \DateTimeInterface $createdAt 
     */ 
    public function setCreatedAt(\DateTimeInterface $createdAt): void 
    { 
        $this->createdAt = $createdAt; 
    } 
 
    public function getUser(): ?User 
    { 
        return $this->user; 
    } 
 
    public function setUser(?User $user): self 
    { 
        $this->user = $user; 
 
        return $this; 
    } 
 
    public function getDocument(): ?Document 
    { 
        return $this->document; 
    } 
 
    public function setDocument(?Document $document): self 
    { 
        $this->document = $document; 
 
        return $this; 
    } 
 
    /** 
     * @return Collection<int, Discussion> 
     */ 
    public function getMessages(): Collection 
    { 
        return $this->messages; 
    } 
 
    public function addMessage(Message $message): self 
    { 
        if (!$this->messages->contains($message)) { 
            $this->messages->add($message); 
        } 
 
        return $this; 
    } 
 
    public function removeMessage(Message $message): self 
    { 
        $this->messages->removeElement($message); 
 
        return $this; 
    } 
 
    public function getSite(): ?Site 
    { 
        return $this->site; 
    } 
 
    public function setSite(?Site $site): self 
    { 
        $this->site = $site; 
 
        return $this; 
    } 
 
    /** 
     * @return string|null 
     */ 
    public function getType(): ?string 
    { 
        return $this->type; 
    } 
 
    /** 
     * @param string|null $type 
     */ 
    public function setType(?string $type): void 
    { 
        $this->type = $type; 
    } 
 
    public function getUpdatedAt(): ?\DateTimeImmutable 
    { 
        return $this->updatedAt; 
    } 
 
    public function setUpdatedAt(?\DateTimeImmutable $updatedAt): self 
    { 
        $this->updatedAt = $updatedAt; 
 
        return $this; 
    } 
 
}