<?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;
}
}