<?php
namespace App\Entity;
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Put;
use App\Controller\Action\DiscussionListController;
use App\Controller\Action\DiscussionPostController;
use App\Controller\Action\MessagePostController;
use App\Repository\MessageRepository;
use App\State\MessageGetColletionProcessor;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Serializer\Annotation\Groups;
#[ORM\Entity(repositoryClass: MessageRepository::class)]
#[ApiResource(
operations: [
new Put(),
new Post(
uriTemplate: 'messages/new_message',
controller: MessagePostController::class,
read: false,
write: false,
name: '_api_/messages/new_message'
),
new GetCollection(),
],
normalizationContext: ['groups' => ['message.get','discussion.get']],
denormalizationContext: ['groups' => ['message.write']]
)]
#[ApiFilter(
SearchFilter::class,
properties: [
'discussion' => 'exact',
'discussion.user' => 'exact',
]
)]
class Message
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: "integer")]
#[Groups(['message.write','message.get'])]
private int $id;
#[ORM\ManyToOne(targetEntity: "Discussion")]
#[Groups(['message.write','message.get', 'discussion.get'])]
private Discussion $discussion;
#[ORM\ManyToOne(targetEntity: "User")]
#[Groups(['message.write','message.get'])]
private User $sender;
#[ORM\Column(type: "text")]
#[Groups(['message.write','message.get'])]
private string $messageText;
#[ORM\Column(type: "datetime")]
#[Groups(['message.write','message.get'])]
private \DateTimeInterface $createdAt;
#[ORM\OneToMany(mappedBy: 'message', targetEntity: MessageFile::class)]
#[Groups(['message.write','message.get'])]
private Collection $messageFiles;
#[ORM\Column]
#[Groups(['message.write','message.get'])]
private ?bool $isHotlineReaded = false;
public function __construct()
{
$this->createdAt = new \DateTimeImmutable();
$this->messageFiles = new ArrayCollection();
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @return Discussion
*/
public function getDiscussion(): Discussion
{
return $this->discussion;
}
/**
* @param Discussion $discussion
*/
public function setDiscussion(Discussion $discussion): void
{
$this->discussion = $discussion;
}
/**
* @return User
*/
public function getSender(): User
{
return $this->sender;
}
/**
* @param User $sender
*/
public function setSender(User $sender): void
{
$this->sender = $sender;
}
/**
* @return string
*/
public function getMessageText(): string
{
return $this->messageText;
}
/**
* @param string $messageText
*/
public function setMessageText(string $messageText): void
{
$this->messageText = $messageText;
}
/**
* @return \DateTimeInterface
*/
public function getCreatedAt(): \DateTimeInterface
{
return $this->createdAt;
}
/**
* @param \DateTimeInterface $createdAt
*/
public function setCreatedAt(\DateTimeInterface $createdAt): void
{
$this->createdAt = $createdAt;
}
/**
* @return Collection<int, MessageFile>
*/
public function getMessageFiles(): Collection
{
return $this->messageFiles;
}
public function addMessageFile(MessageFile $messageFile): self
{
if (!$this->messageFiles->contains($messageFile)) {
$this->messageFiles->add($messageFile);
$messageFile->setMessage($this);
}
return $this;
}
public function removeMessageFile(MessageFile $messageFile): self
{
if ($this->messageFiles->removeElement($messageFile)) {
// set the owning side to null (unless already changed)
if ($messageFile->getMessage() === $this) {
$messageFile->setMessage(null);
}
}
return $this;
}
public function isHotlineReaded(): ?bool
{
return $this->isHotlineReaded;
}
public function setIsHotlineReaded(bool $isHotlineReaded): self
{
$this->isHotlineReaded = $isHotlineReaded;
return $this;
}
}