src/Entity/Messenger/Groups.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Messenger;
  3. use App\Entity\Core\Users;
  4. use Doctrine\DBAL\Types\Types;
  5. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  6. use Symfony\Component\Validator\Constraints as Assert;
  7. use Doctrine\ORM\Mapping as ORM;
  8. /**
  9.  * Groups
  10.  *
  11.  * @ORM\Table("messenger_groups")
  12.  * @ORM\Entity(repositoryClass="App\Repository\Messenger\GroupsRepository")
  13.  * @ORM\HasLifecycleCallbacks()
  14.  */
  15. class Groups
  16. {
  17.     /**
  18.      * @var integer
  19.      *
  20.      * @ORM\Column(name="id", type="integer")
  21.      * @ORM\Id
  22.      * @ORM\GeneratedValue(strategy="AUTO")
  23.      */
  24.     protected $id;
  25.     /**
  26.      * @var string
  27.      *
  28.      * @ORM\Column(name="created_at", type="datetime", nullable=true)
  29.      */
  30.     private $createdAt;
  31.     /**
  32.      * @var string
  33.      *
  34.      * @ORM\Column(name="updated_at", type="datetime", nullable=true)
  35.      */
  36.     private $updatedAt;
  37.     /**
  38.      * @var string
  39.      *
  40.      * @ORM\Column(name="title", type="text", nullable=true)
  41.      */
  42.     private $title;
  43.     /**
  44.      * Premier utilisateur de la conversation
  45.      *
  46.      * @ORM\ManyToOne(targetEntity="App\Entity\Core\Users")
  47.      * @ORM\JoinColumns({
  48.      *   @ORM\JoinColumn(name="user_one_id", referencedColumnName="id", nullable=false)
  49.      * })
  50.      */
  51.     protected $userOne;
  52.     /**
  53.      * Deuxième utilisateur de la conversation
  54.      *
  55.      * @ORM\ManyToOne(targetEntity="App\Entity\Core\Users")
  56.      * @ORM\JoinColumns({
  57.      *   @ORM\JoinColumn(name="user_two_id", referencedColumnName="id", nullable=false)
  58.      * })
  59.      */
  60.     protected $userTwo;
  61.     /**
  62.      * Hash unique pour identifier la conversation entre 2 utilisateurs
  63.      * Format: min(userId1,userId2)_max(userId1,userId2)
  64.      *
  65.      * @var string
  66.      *
  67.      * @ORM\Column(name="conversation_hash", type="string", length=100, unique=true, nullable=false)
  68.      */
  69.     private $conversationHash;
  70.     /**
  71.      * ID du dernier message pour optimisation
  72.      *
  73.      * @var integer
  74.      *
  75.      * @ORM\Column(name="last_message_id", type="integer", nullable=true)
  76.      */
  77.     private $lastMessageId;
  78.     /**
  79.      * Contenu du dernier message (pour affichage rapide)
  80.      *
  81.      * @var string
  82.      *
  83.      * @ORM\Column(name="last_message_content", type="text", nullable=true)
  84.      */
  85.     private $lastMessageContent;
  86.     /**
  87.      * Date du dernier message (pour tri)
  88.      *
  89.      * @var string
  90.      *
  91.      * @ORM\Column(name="last_message_at", type="datetime", nullable=true)
  92.      */
  93.     private $lastMessageAt;
  94.     /**
  95.      * ID de l'expéditeur du dernier message
  96.      * Permet de savoir côté frontend si le dernier message vient de moi ou de l'autre
  97.      *
  98.      * @var integer|null
  99.      *
  100.      * @ORM\Column(name="last_message_sender_id", type="integer", nullable=true)
  101.      */
  102.     private $lastMessageSenderId;
  103.     /**
  104.      * @ORM\PrePersist
  105.      */
  106.     public function setCreatedAtValue(): void {
  107.         $this->setCreatedAt(new \DateTime("now"));
  108.         $this->setUpdatedAt(new \DateTime("now"));
  109.         $this->setLastMessageAt(new \DateTime("now"));
  110.     }
  111.     /**
  112.      * @ORM\PreUpdate
  113.      */
  114.     public function setUpdatedAtValue(): void {
  115.         $this->setUpdatedAt(new \DateTime("now"));
  116.     }
  117.     public function __toString() {
  118.         return $this->title ?? 'Conversation #' $this->id;
  119.     }
  120.     /**
  121.      * Génère le hash de conversation entre 2 utilisateurs
  122.      */
  123.     public static function generateConversationHash(Users $user1Users $user2): string
  124.     {
  125.         $id1 $user1->getId();
  126.         $id2 $user2->getId();
  127.         // Toujours mettre le plus petit ID en premier pour garantir l'unicité
  128.         $minId min($id1$id2);
  129.         $maxId max($id1$id2);
  130.         return $minId '_' $maxId;
  131.     }
  132.     /**
  133.      * Retourne l'autre utilisateur de la conversation
  134.      */
  135.     public function getOtherUser(Users $currentUser): ?Users
  136.     {
  137.         if ($this->userOne && $this->userOne->getId() === $currentUser->getId()) {
  138.             return $this->userTwo;
  139.         }
  140.         return $this->userOne;
  141.     }
  142.     /**
  143.      * Vérifie si un utilisateur fait partie de cette conversation
  144.      */
  145.     public function hasUser(Users $user): bool
  146.     {
  147.         return ($this->userOne && $this->userOne->getId() === $user->getId())
  148.             || ($this->userTwo && $this->userTwo->getId() === $user->getId());
  149.     }
  150.     public function getId(): ?int
  151.     {
  152.         return $this->id;
  153.     }
  154.     public function getCreatedAt(): ?\DateTimeInterface
  155.     {
  156.         return $this->createdAt;
  157.     }
  158.     public function setCreatedAt(?\DateTimeInterface $createdAt): static
  159.     {
  160.         $this->createdAt $createdAt;
  161.         return $this;
  162.     }
  163.     public function getUpdatedAt(): ?\DateTimeInterface
  164.     {
  165.         return $this->updatedAt;
  166.     }
  167.     public function setUpdatedAt(?\DateTimeInterface $updatedAt): static
  168.     {
  169.         $this->updatedAt $updatedAt;
  170.         return $this;
  171.     }
  172.     public function getTitle(): ?string
  173.     {
  174.         return $this->title;
  175.     }
  176.     public function setTitle(?string $title): static
  177.     {
  178.         $this->title $title;
  179.         return $this;
  180.     }
  181.     public function getConversationHash(): ?string
  182.     {
  183.         return $this->conversationHash;
  184.     }
  185.     public function setConversationHash(string $conversationHash): static
  186.     {
  187.         $this->conversationHash $conversationHash;
  188.         return $this;
  189.     }
  190.     public function getLastMessageId(): ?int
  191.     {
  192.         return $this->lastMessageId;
  193.     }
  194.     public function setLastMessageId(?int $lastMessageId): static
  195.     {
  196.         $this->lastMessageId $lastMessageId;
  197.         return $this;
  198.     }
  199.     public function getLastMessageContent(): ?string
  200.     {
  201.         return $this->lastMessageContent;
  202.     }
  203.     public function setLastMessageContent(?string $lastMessageContent): static
  204.     {
  205.         $this->lastMessageContent $lastMessageContent;
  206.         return $this;
  207.     }
  208.     public function getLastMessageAt(): ?\DateTimeInterface
  209.     {
  210.         return $this->lastMessageAt;
  211.     }
  212.     public function setLastMessageAt(?\DateTimeInterface $lastMessageAt): static
  213.     {
  214.         $this->lastMessageAt $lastMessageAt;
  215.         return $this;
  216.     }
  217.     public function getUserOne(): ?Users
  218.     {
  219.         return $this->userOne;
  220.     }
  221.     public function setUserOne(?Users $userOne): static
  222.     {
  223.         $this->userOne $userOne;
  224.         return $this;
  225.     }
  226.     public function getUserTwo(): ?Users
  227.     {
  228.         return $this->userTwo;
  229.     }
  230.     public function setUserTwo(?Users $userTwo): static
  231.     {
  232.         $this->userTwo $userTwo;
  233.         return $this;
  234.     }
  235.     // ========================================
  236.     // NOUVEAU — lastMessageSenderId
  237.     // ========================================
  238.     public function getLastMessageSenderId(): ?int
  239.     {
  240.         return $this->lastMessageSenderId;
  241.     }
  242.     public function setLastMessageSenderId(?int $lastMessageSenderId): static
  243.     {
  244.         $this->lastMessageSenderId $lastMessageSenderId;
  245.         return $this;
  246.     }
  247. }