<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
use App\Repository\MessageRepository;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=MessageRepository::class)
* @ApiResource(
* input="App\Dto\MessageInput",
* denormalizationContext={
* "groups"={"message:write"}
* },
* normalizationContext={
* "groups"={"message:read"}
* },
* collectionOperations={
* "get"={"security"="is_granted('ROLE_ADMIN')"},
* "post_contact"={
* "security"="is_granted('ROLE_USER')",
* "path"="/message_contacts",
* "method"="POST",
* "controller"="App\Controller\Api\MessageController::postContact"
* }
* },
* itemOperations={
* "get"={"security"="is_granted('ROLE_ADMIN')"}
* }
* )
* @ApiFilter(SearchFilter::class, properties={"user.code":"partial", "status", "subject"})
* @ApiFilter(DateFilter::class, properties={"createdAt"})
* @ApiFilter(OrderFilter::class, properties={"id", "user.code", "user.client.company", "subject", "createdAt", "status"})
* @ApiFilter(PropertyFilter::class,
* arguments={
* "parameterName"="fields",
* "overrideDefaultProperties"=true
* }
* )
*/
class Message
{
const UNREAD = 'unread';
const READ = 'read';
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"message:read"})
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"message:read", "message:write"})
*/
private $subject;
/**
* @ORM\Column(type="text")
* @Groups({"message:read", "message:write"})
*/
private $content;
/**
* @ORM\ManyToOne(targetEntity=TvUser::class, inversedBy="messages")
* @ORM\JoinColumn(nullable=true)
*/
private $tvUser;
/**
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="messages")
* @ORM\JoinColumn(nullable=true)
* @Assert\NotNull
* @Groups({"message:read"})
*/
private $user;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Gedmo\Timestampable(on="create")
* @Groups({"message:read"})
*/
private $createdAt;
/**
* @ORM\Column(type="string", length=255)
* @Groups({"message:read"})
*/
private $status = self::UNREAD;
/**
* @var null|string
*/
public $recipients = null;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\Email
* @Groups({"message:read", "message:write"})
*/
private $email;
public function getId(): ?int
{
return $this->id;
}
public function getSubject(): ?string
{
return $this->subject;
}
public function setSubject(string $subject): self
{
$this->subject = $subject;
return $this;
}
public function getContent(): ?string
{
return $this->content;
}
public function setContent(string $content): self
{
$this->content = $content;
return $this;
}
public function getTvUser(): ?TvUser
{
return $this->tvUser;
}
public function setTvUser(?TvUser $tvUser): self
{
$this->tvUser = $tvUser;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(string $status): self
{
$this->status = $status;
return $this;
}
/**
* @return string[]
*/
public function getStatuses(): array
{
return [
self::UNREAD,
self::READ,
];
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
return $this;
}
}