<?php
namespace App\Entity\Chat;
use App\Repository\Chat\MessageRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Drosalys\Bundle\ApiBundle\Serializer\Attributes\IdGroups;
use DrosalysWeb\ObjectExtensions\Blame\Model\BlameInterface;
use DrosalysWeb\ObjectExtensions\Blame\Model\BlameTrait;
use Symfony\Component\Serializer\Annotation as Serial;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use DrosalysWeb\ObjectExtensions\Timestamp\Model\TimestampInterface;
use DrosalysWeb\ObjectExtensions\Timestamp\Model\TimestampTrait;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass: MessageRepository::class)]
#[ORM\Table(name: 'chat_messages')]
#[ORM\InheritanceType('JOINED')]
#[
ORM\DiscriminatorMap(
[
'file-message' => FileMessage::class,
'message' => Message::class
]),
Serial\DiscriminatorMap(
typeProperty: 'dtype',
mapping: [
'file-message' => FileMessage::class,
'message' => Message::class
]
)
]
class Message implements TimestampInterface, BlameInterface
{
use BlameTrait;
use TimestampTrait;
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
#[Serial\Groups(groups: ['Message', 'Delete_Message', 'ChatNotification', 'Api'])]
private ?int $id = null;
#[ORM\Column(type: 'text', nullable: true)]
#[Serial\Groups(['PostMessage', 'Message', 'ChatNotification', 'PutMessage', 'Api'])]
#[
Assert\NotBlank(
message: 'entity.tchat.message.content.NotBlank',
groups: ['PostMessage', 'PutMessage']
),
Assert\Length(
min: 2,
max: 5000,
minMessage: 'entity.tchat.message.content.min',
maxMessage: 'entity.tchat.message.content.max',
groups: ['PostMessage', 'PutMessage']
)
]
private ?string $content = null;
#[Serial\Groups(['Message', 'ChatNotification', 'Api'])]
protected $createdBy = null;
#[Serial\Groups(['Message', 'Delete_Message', 'Api'])]
protected $createdAt = null;
#[ORM\Column(type: 'array', nullable: true)]
#[Serial\Groups(groups: ['Message', 'PostMessage', 'PutMessage'])]
private array $tags = [];
#[ORM\ManyToOne(targetEntity: Conversation::class, inversedBy: 'messages')]
#[IdGroups(groups: ['Message'])]
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
private ?Conversation $conversation = null;
#[ORM\OneToMany(mappedBy: 'message', targetEntity: ChatNotification::class, cascade: ['persist', 'remove'], fetch: 'EXTRA_LAZY', orphanRemoval: true)]
private ?Collection $chatNotifications = null;
#[ORM\Column(type: 'integer')]
#[
Assert\NotBlank(message: 'entity.tchat.message.messageType.NotBlank'),
Assert\Type(
type: "integer"
)
]
#[Serial\Groups(groups: ['Message', 'PostMessage', 'PostFileMessage'])]
private ?int $messageType = 0;
#[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'messageChildren')]
#[ORM\JoinColumn(nullable: true, onDelete: 'CASCADE')]
private ?Message $messageParent = null;
#[ORM\OneToMany(mappedBy: 'messageParent', targetEntity: self::class, cascade: ['persist', 'remove'])]
#[Serial\Groups(groups: ['Message', 'Api'])]
private ?Collection $messageChildren;
#[ORM\Column(type: 'string', nullable: true)]
#[Serial\Groups(groups: ['Message', 'PostMessage', 'PostFileMessage'])]
private ?string $pendingPostId = null;
#[ORM\Column(type: 'boolean', nullable: false)]
#[
Assert\NotNull(groups: ['TogglePinMessage']),
Assert\Type(type: 'boolean', groups: ['TogglePinMessage'])
]
#[Serial\Groups(groups: ['Message', 'TogglePinMessage'])]
private bool $pinned = false;
public function __construct()
{
$this->messageChildren = new ArrayCollection();
$this->chatNotifications = new ArrayCollection();
}
public function getFile(): ?File
{
return null;
}
public function getFileMessageType(): ?int
{
return null;
}
public function getId(): ?int
{
return $this->id;
}
public function getContent(): ?string
{
return $this->content;
}
public function setContent(string $content): self
{
$this->content = $content;
return $this;
}
public function getTags(): ?array
{
return $this->tags;
}
public function setTags(?array $tags): self
{
$this->tags = $tags;
return $this;
}
public function getMessageType(): ?int
{
return $this->messageType;
}
public function setMessageType(int $messageType): self
{
$this->messageType = $messageType;
return $this;
}
public function getMessageParent(): ?self
{
return $this->messageParent;
}
public function setMessageParent(?self $messageParent): self
{
$this->messageParent = $messageParent;
return $this;
}
/**
* @return Collection<int, self>
*/
public function getMessageChildren(): Collection
{
return $this->messageChildren;
}
public function addMessageChild(self $messageChild): self
{
if (!$this->messageChildren->contains($messageChild)) {
$this->messageChildren[] = $messageChild;
$messageChild->setMessageParent($this);
}
return $this;
}
public function removeMessageChild(self $messageChild): self
{
if ($this->messageChildren->removeElement($messageChild)) {
// set the owning side to null (unless already changed)
if ($messageChild->getMessageParent() === $this) {
$messageChild->setMessageParent(null);
}
}
return $this;
}
public function getChatNotifications(): ?Collection
{
return $this->chatNotifications;
}
public function setChatNotifications(?Collection $chatNotifications): Message
{
$this->chatNotifications = $chatNotifications;
return $this;
}
public function getConversation(): ?Conversation
{
return $this->conversation;
}
public function setConversation(?Conversation $conversation): Message
{
$this->conversation = $conversation;
return $this;
}
public function getPendingPostId(): ?string
{
return $this->pendingPostId;
}
public function setPendingPostId(?string $pendingPostId): Message
{
$this->pendingPostId = $pendingPostId;
return $this;
}
public function isPinned(): bool
{
return $this->pinned;
}
public function setPinned(bool $pinned): Message
{
$this->pinned = $pinned;
return $this;
}
}