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 $user1, Users $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. }