[ 'security' => "is_granted('ROLE_USER')", // the get collection is also filtered by MessageExtension.php ], 'post' => [ //'security' => "is_granted('ROLE_USER')", /*'messenger' => true, 'output' => false, 'status' => 202,*/ 'security_post_denormalize' => "is_granted('CREATE', object)", // 'deserialize' => false, // 'controller' => Create::class, // 'openapi_context' => [ // 'requestBody' => [ // 'content' => [ // 'multipart/form-data' => [ // 'schema' => [ // 'type' => 'object', // 'properties' => [ // 'title' => [ // 'type' => 'string', // ], // 'content' => [ // 'type' => 'string', // ], // ], // ], // ], // ], // ], // ], ], ], itemOperations: [ 'get' => [ 'security' => "is_granted('VIEW', object)", ], 'put' => [ 'security' => "is_granted('EDIT', object)", ], 'delete' => [ 'security' => "is_granted('DELETE', object)", ], ], attributes: [ 'security' => "is_granted('ROLE_USER')", ], denormalizationContext: [ 'groups' => ['message:write'], ], normalizationContext: [ 'groups' => ['message:read'], ], )] #[ApiFilter(OrderFilter::class, properties: ['title', 'sendDate'])] #[ApiFilter(SearchFilter::class, properties: [ 'msgType' => 'exact', 'status' => 'exact', 'sender' => 'exact', 'receivers.receiver' => 'exact', 'receivers.tags.tag' => 'exact', ])] class Message { public const MESSAGE_TYPE_INBOX = 1; public const MESSAGE_TYPE_OUTBOX = 2; public const MESSAGE_TYPE_PROMOTED = 3; public const MESSAGE_TYPE_WALL = 4; public const MESSAGE_TYPE_GROUP = 5; public const MESSAGE_TYPE_INVITATION = 6; public const MESSAGE_TYPE_CONVERSATION = 7; // status public const MESSAGE_STATUS_DELETED = 3; public const MESSAGE_STATUS_DRAFT = 4; public const MESSAGE_STATUS_INVITATION_PENDING = 5; public const MESSAGE_STATUS_INVITATION_ACCEPTED = 6; public const MESSAGE_STATUS_INVITATION_DENIED = 7; public const MESSAGE_STATUS_PROMOTED = 13; /** * @ORM\Column(name="id", type="bigint") * @ORM\Id * @ORM\GeneratedValue() */ #[ApiProperty(identifier: true)] #[Groups(['message:read'])] protected ?int $id = null; /** * @ORM\ManyToOne(targetEntity="User", inversedBy="sentMessages") * @ORM\JoinColumn(name="user_sender_id", referencedColumnName="id", nullable=false) */ #[Assert\NotBlank] #[Groups(['message:read', 'message:write'])] protected User $sender; /** * @var Collection|MessageRelUser[] * * @ORM\OneToMany(targetEntity="MessageRelUser", mappedBy="message", cascade={"persist", "remove"}) */ #[Assert\Valid] #[Groups(['message:read', 'message:write'])] #[ApiSubresource] protected array | null | Collection $receivers; /** * @var Collection|MessageRelUser[] */ #[Groups(['message:read', 'message:write'])] protected array | null | Collection $receiversTo; /** * @var Collection|MessageRelUser[] */ #[Groups(['message:read', 'message:write'])] protected array | null | Collection $receiversCc; /** * @ORM\Column(name="msg_type", type="smallint", nullable=false) */ #[Assert\NotBlank] // @todo use enums with PHP 8.1 /*#[Assert\Choice([ self::MESSAGE_TYPE_INBOX, self::MESSAGE_TYPE_OUTBOX, self::MESSAGE_TYPE_PROMOTED, ])]*/ /*#[ApiProperty(attributes: [ 'openapi_context' => [ 'type' => 'int', 'enum' => [self::MESSAGE_TYPE_INBOX, self::MESSAGE_TYPE_OUTBOX], ], ])]*/ #[Groups(['message:read', 'message:write'])] protected int $msgType; /** * @ORM\Column(name="status", type="smallint", nullable=false) */ #[Assert\NotBlank] #[Groups(['message:read', 'message:write'])] protected int $status; /** * @ORM\Column(name="send_date", type="datetime", nullable=false) */ #[Groups(['message:read'])] protected DateTime $sendDate; /** * @ORM\Column(name="title", type="string", length=255, nullable=false) */ #[Assert\NotBlank] #[Groups(['message:read', 'message:write'])] protected string $title; /** * @ORM\Column(name="content", type="text", nullable=false) */ #[Assert\NotBlank] #[Groups(['message:read', 'message:write'])] protected string $content; #[Groups(['message:read', 'message:write'])] protected ?MessageRelUser $firstReceiver; /** * @ORM\ManyToOne(targetEntity="Chamilo\CourseBundle\Entity\CGroup") * @ORM\JoinColumn(name="group_id", referencedColumnName="iid", nullable=true, onDelete="CASCADE") */ protected ?CGroup $group = null; /** * @var Collection|Message[] * @ORM\OneToMany(targetEntity="Message", mappedBy="parent") */ protected Collection $children; /** * @ORM\ManyToOne(targetEntity="Message", inversedBy="children") * @ORM\JoinColumn(name="parent_id", referencedColumnName="id") */ protected ?Message $parent = null; /** * @Gedmo\Timestampable(on="update") * @ORM\Column(name="update_date", type="datetime", nullable=true) */ protected ?DateTime $updateDate; /** * @ORM\Column(name="votes", type="integer", nullable=true) */ protected ?int $votes; /** * @var Collection|MessageAttachment[] * * @ORM\OneToMany(targetEntity="MessageAttachment", mappedBy="message") */ protected Collection $attachments; /** * @var Collection|MessageFeedback[] * * @ORM\OneToMany(targetEntity="MessageFeedback", mappedBy="message", orphanRemoval=true) */ protected Collection $likes; public function __construct() { $this->sendDate = new DateTime('now'); $this->updateDate = $this->sendDate; $this->msgType = self::MESSAGE_TYPE_INBOX; $this->content = ''; $this->attachments = new ArrayCollection(); $this->children = new ArrayCollection(); $this->likes = new ArrayCollection(); $this->receivers = new ArrayCollection(); $this->receiversCc = new ArrayCollection(); $this->receiversTo = new ArrayCollection(); $this->votes = 0; $this->status = 0; } /** * @return null|Collection|MessageRelUser[] */ public function getReceivers() { return $this->receivers; } /** * @return null|Collection|MessageRelUser[] */ public function getReceiversTo() { return $this->getReceivers()->filter(function (MessageRelUser $messageRelUser) { return MessageRelUser::TYPE_TO === $messageRelUser->getReceiverType(); }); } /** * @return MessageRelUser[] */ public function getReceiversCc() { $list = []; foreach ($this->receivers as $receiver) { if (MessageRelUser::TYPE_CC === $receiver->getReceiverType()) { $list[] = $receiver; } } /* $result = $this->receivers->filter(function (MessageRelUser $messageRelUser) { error_log((string)$messageRelUser->getId()); return MessageRelUser::TYPE_CC === $messageRelUser->getReceiverType(); }); */ return $list; } public function getFirstReceiver(): ?MessageRelUser { if ($this->receivers->count() > 0) { return $this->receivers->first(); } return null; } public function hasReceiver(User $receiver) { if ($this->receivers->count()) { $criteria = Criteria::create()->where( Criteria::expr()->eq('receiver', $receiver), )->andWhere( Criteria::expr()->eq('message', $this), ); return $this->receivers->matching($criteria)->count() > 0; } return false; } public function addReceiver(User $receiver, int $receiverType = MessageRelUser::TYPE_TO): self { $messageRelUser = (new MessageRelUser()) ->setReceiver($receiver) ->setReceiverType($receiverType) ->setMessage($this) ; if (!$this->receivers->contains($messageRelUser)) { $this->receivers->add($messageRelUser); } return $this; } /** * @param Collection|MessageRelUser $receivers */ public function setReceivers($receivers): self { /** @var MessageRelUser $receiver */ foreach ($receivers as $receiver) { $receiver->setMessage($this); } $this->receivers = $receivers; return $this; } public function setSender(User $sender): self { $this->sender = $sender; return $this; } public function getSender(): User { return $this->sender; } public function setMsgType(int $msgType): self { $this->msgType = $msgType; return $this; } public function getMsgType(): int { return $this->msgType; } public function setSendDate(DateTime $sendDate): self { $this->sendDate = $sendDate; return $this; } /** * Get sendDate. * * @return DateTime */ public function getSendDate() { return $this->sendDate; } public function setTitle(string $title): self { $this->title = $title; return $this; } public function getTitle(): string { return $this->title; } public function setContent(string $content): self { $this->content = $content; return $this; } public function getContent(): string { return $this->content; } public function setUpdateDate(DateTime $updateDate): self { $this->updateDate = $updateDate; return $this; } /** * Get updateDate. * * @return DateTime */ public function getUpdateDate() { return $this->updateDate; } /** * Get id. * * @return int */ public function getId() { return $this->id; } public function setVotes(int $votes): self { $this->votes = $votes; return $this; } public function getVotes(): int { return $this->votes; } /** * Get attachments. * * @return Collection|MessageAttachment[] */ public function getAttachments() { return $this->attachments; } public function addAttachment(MessageAttachment $attachment): self { $this->attachments->add($attachment); $attachment->setMessage($this); return $this; } public function getParent(): ?self { return $this->parent; } /** * @return Collection|Message[] */ public function getChildren() { return $this->children; } public function addChild(self $child): self { $this->children[] = $child; $child->setParent($this); return $this; } public function setParent(self $parent = null): self { $this->parent = $parent; return $this; } /** * @return MessageFeedback[]|Collection */ public function getLikes() { return $this->likes; } public function getGroup(): ?CGroup { return $this->group; } public function setGroup(?CGroup $group): self { // $this->msgType = self::MESSAGE_TYPE_GROUP; $this->group = $group; return $this; } public function getStatus(): int { return $this->status; } public function setStatus(int $status): self { $this->status = $status; return $this; } }