src/Entity/Chat/Conversation.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Chat;
  3. use App\Entity\Account\User;
  4. use App\Entity\Channel\Channel;
  5. use App\Repository\Chat\ConversationRepository;
  6. use Doctrine\Common\Collections\ArrayCollection;
  7. use Doctrine\Common\Collections\Collection;
  8. use Doctrine\ORM\Mapping as ORM;
  9. use Doctrine\ORM\Mapping\DiscriminatorColumn;
  10. use Doctrine\ORM\Mapping\DiscriminatorMap;
  11. use Doctrine\ORM\Mapping\InheritanceType;
  12. use DrosalysWeb\ObjectExtensions\Blame\Model\BlameInterface;
  13. use DrosalysWeb\ObjectExtensions\Blame\Model\BlameTrait;
  14. use DrosalysWeb\ObjectExtensions\Timestamp\Model\TimestampInterface;
  15. use DrosalysWeb\ObjectExtensions\Timestamp\Model\TimestampTrait;
  16. use Symfony\Component\Validator\Constraints as Assert;
  17. use Symfony\Component\Serializer\Annotation as Serial;
  18. #[ORM\Entity(repositoryClassConversationRepository::class)]
  19. #[ORM\Table(name'chat_conversations')]
  20. #[InheritanceType('JOINED')]
  21. #[DiscriminatorColumn(name'dtype'type'string')]
  22. #[DiscriminatorMap([
  23.     'conversation' => Conversation::class,
  24.     'service_conversation' => ServiceConversation::class,
  25.     'canal' => Canal::class,
  26.     'temporary_canal' => TemporaryCanal::class
  27. ])]
  28. class Conversation implements TimestampInterfaceBlameInterface
  29. {
  30.     use TimestampTrait;
  31.     use BlameTrait;
  32.     #[ORM\Id]
  33.     #[ORM\GeneratedValue]
  34.     #[ORM\Column(type'integer')]
  35.     #[Serial\Groups(groups: ['Conversation''Identifier'])]
  36.     private ?int $id null;
  37.     #[ORM\ManyToOne(targetEntityChannel::class)]
  38.     #[ORM\JoinColumn(nullablefalseonDelete'CASCADE')]
  39.     private ?Channel $channel null;
  40.     #[ORM\Column(type'integer')]
  41.     #[
  42.         Assert\NotBlank(message'entity.tchat.canal.type.NotBlank'),
  43.         Assert\Type(
  44.             type"integer"
  45.         )
  46.     ]
  47.     #[Serial\Groups(groups: ['Conversation''PostCanal''Identifier'])]
  48.     private ?int $type null;
  49.     #[ORM\OneToMany(mappedBy'conversation'targetEntityConversationUser::class, cascade: ['persist''remove'], orphanRemovaltrue)]
  50.     #[Serial\Groups(['PostCanal'])]
  51.     private ?Collection $conversationUsers;
  52.     #[ORM\OneToMany(mappedBy'conversation'targetEntityMessage::class, cascade: ['persist''remove'], fetch'EXTRA_LAZY'orphanRemovaltrue)]
  53.     private ?Collection $messages;
  54.     public function __construct()
  55.     {
  56.         $this->conversationUsers = new ArrayCollection();
  57.         $this->messages = new ArrayCollection();
  58.     }
  59.     public function hasConversationUser(User $user): bool
  60.     {
  61.         $userAlreadyIn $this->getConversationUsers()->filter(function(ConversationUser $conversationUser) use ($user) {
  62.             return $conversationUser->getUser()->getId() === $user->getId();
  63.         })->first();
  64.         return $userAlreadyIn !== false;
  65.     }
  66.     #[Serial\Groups(groups: ['Conversation'])]
  67.     public function getCountConversationUsers(): int
  68.     {
  69.         return $this->conversationUsers->count();
  70.     }
  71.     public function getId(): ?int
  72.     {
  73.         return $this->id;
  74.     }
  75.     public function getType(): ?int
  76.     {
  77.         return $this->type;
  78.     }
  79.     public function setType(int $type): self
  80.     {
  81.         $this->type $type;
  82.         return $this;
  83.     }
  84.     /**
  85.      * @return Collection<int, ConversationUser>
  86.      */
  87.     public function getConversationUsers(): Collection
  88.     {
  89.         return $this->conversationUsers;
  90.     }
  91.     public function getConversationUserIds(): array
  92.     {
  93.         return array_map(function(ConversationUser $conversationUser) {
  94.             return $conversationUser->getUser()->getId();
  95.         }, $this->conversationUsers->toArray());
  96.     }
  97.     public function addConversationUser(ConversationUser $conversationUser): self
  98.     {
  99.         if (!$this->conversationUsers->contains($conversationUser)) {
  100.             $this->conversationUsers[] = $conversationUser;
  101.             $conversationUser->setConversation($this);
  102.         }
  103.         return $this;
  104.     }
  105.     public function removeConversationUser(ConversationUser $conversationUser): self
  106.     {
  107.         if ($this->conversationUsers->removeElement($conversationUser)) {
  108.             // set the owning side to null (unless already changed)
  109.             if ($conversationUser->getConversation() === $this) {
  110.                 $conversationUser->setConversation(null);
  111.             }
  112.         }
  113.         return $this;
  114.     }
  115.     public function getConversationUserByUser(User $user): ?ConversationUser
  116.     {
  117.         $conversationUsersToRemove $this->conversationUsers->filter(function(ConversationUser $conversationUser) use ($user) {
  118.             return $conversationUser->getUser()->getId() === $user->getId();
  119.         })->first();
  120.         if ($conversationUsersToRemove) {
  121.             return $conversationUsersToRemove;
  122.         }
  123.         return null;
  124.     }
  125.     public function getMessages(): ?Collection
  126.     {
  127.         return $this->messages;
  128.     }
  129.     public function setMessages(?Collection $messages): Conversation
  130.     {
  131.         $this->messages $messages;
  132.         return $this;
  133.     }
  134.     public function getChannel(): ?Channel
  135.     {
  136.         return $this->channel;
  137.     }
  138.     public function setChannel(?Channel $channel): Conversation
  139.     {
  140.         $this->channel $channel;
  141.         return $this;
  142.     }
  143. }