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. * L'utilisateur dont l'identité est MASQUÉE dans cette conversation.
  105. *
  106. * ⚠️ UN IDENTIFIANT, PAS UN BOOLÉEN.
  107. *
  108. * `anonymous = 1` ne dirait pas QUI est masqué. En relisant le code
  109. * dans six mois, « masqué » sans sujet est une invitation à masquer
  110. * la mauvaise personne — c'est-à-dire à révéler l'autre. Ici, aucun
  111. * doute possible : c'est cet utilisateur-là, et lui seul.
  112. *
  113. * NULL = conversation normale.
  114. *
  115. * Posé quand un recruteur écrit depuis /cv/{anonRef}. Le candidat
  116. * peut le retirer lui-même (« me présenter »), et lui seul :
  117. * l'anonymat se lève par celui qu'il protège.
  118. *
  119. * @var int|null
  120. *
  121. * @ORM\Column(name="anonymous_user_id", type="integer", nullable=true, options={"comment":"Utilisateur masqué dans cette conversation"})
  122. */
  123. private $anonymousUserId;
  124. public function getAnonymousUserId(): ?int
  125. {
  126. return $this->anonymousUserId;
  127. }
  128. public function setAnonymousUserId(?int $anonymousUserId): self
  129. {
  130. $this->anonymousUserId = $anonymousUserId;
  131. return $this;
  132. }
  133. /** Cet utilisateur est-il masqué ici ? */
  134. public function masque(?int $userId): bool
  135. {
  136. return $this->anonymousUserId !== null
  137. && $userId !== null
  138. && (int) $this->anonymousUserId === (int) $userId;
  139. }
  140. /**
  141. * @ORM\PrePersist
  142. */
  143. public function setCreatedAtValue(): void {
  144. $this->setCreatedAt(new \DateTime("now"));
  145. $this->setUpdatedAt(new \DateTime("now"));
  146. $this->setLastMessageAt(new \DateTime("now"));
  147. }
  148. /**
  149. * @ORM\PreUpdate
  150. */
  151. public function setUpdatedAtValue(): void {
  152. $this->setUpdatedAt(new \DateTime("now"));
  153. }
  154. public function __toString() {
  155. return $this->title ?? 'Conversation #' . $this->id;
  156. }
  157. /**
  158. * Génère le hash de conversation entre 2 utilisateurs
  159. */
  160. public static function generateConversationHash(Users $user1, Users $user2): string
  161. {
  162. $id1 = $user1->getId();
  163. $id2 = $user2->getId();
  164. // Toujours mettre le plus petit ID en premier pour garantir l'unicité
  165. $minId = min($id1, $id2);
  166. $maxId = max($id1, $id2);
  167. return $minId . '_' . $maxId;
  168. }
  169. /**
  170. * Retourne l'autre utilisateur de la conversation
  171. */
  172. public function getOtherUser(Users $currentUser): ?Users
  173. {
  174. if ($this->userOne && $this->userOne->getId() === $currentUser->getId()) {
  175. return $this->userTwo;
  176. }
  177. return $this->userOne;
  178. }
  179. /**
  180. * Vérifie si un utilisateur fait partie de cette conversation
  181. */
  182. public function hasUser(Users $user): bool
  183. {
  184. return ($this->userOne && $this->userOne->getId() === $user->getId())
  185. || ($this->userTwo && $this->userTwo->getId() === $user->getId());
  186. }
  187. public function getId(): ?int
  188. {
  189. return $this->id;
  190. }
  191. public function getCreatedAt(): ?\DateTimeInterface
  192. {
  193. return $this->createdAt;
  194. }
  195. public function setCreatedAt(?\DateTimeInterface $createdAt): static
  196. {
  197. $this->createdAt = $createdAt;
  198. return $this;
  199. }
  200. public function getUpdatedAt(): ?\DateTimeInterface
  201. {
  202. return $this->updatedAt;
  203. }
  204. public function setUpdatedAt(?\DateTimeInterface $updatedAt): static
  205. {
  206. $this->updatedAt = $updatedAt;
  207. return $this;
  208. }
  209. public function getTitle(): ?string
  210. {
  211. return $this->title;
  212. }
  213. public function setTitle(?string $title): static
  214. {
  215. $this->title = $title;
  216. return $this;
  217. }
  218. public function getConversationHash(): ?string
  219. {
  220. return $this->conversationHash;
  221. }
  222. public function setConversationHash(string $conversationHash): static
  223. {
  224. $this->conversationHash = $conversationHash;
  225. return $this;
  226. }
  227. public function getLastMessageId(): ?int
  228. {
  229. return $this->lastMessageId;
  230. }
  231. public function setLastMessageId(?int $lastMessageId): static
  232. {
  233. $this->lastMessageId = $lastMessageId;
  234. return $this;
  235. }
  236. public function getLastMessageContent(): ?string
  237. {
  238. return $this->lastMessageContent;
  239. }
  240. public function setLastMessageContent(?string $lastMessageContent): static
  241. {
  242. $this->lastMessageContent = $lastMessageContent;
  243. return $this;
  244. }
  245. public function getLastMessageAt(): ?\DateTimeInterface
  246. {
  247. return $this->lastMessageAt;
  248. }
  249. public function setLastMessageAt(?\DateTimeInterface $lastMessageAt): static
  250. {
  251. $this->lastMessageAt = $lastMessageAt;
  252. return $this;
  253. }
  254. public function getUserOne(): ?Users
  255. {
  256. return $this->userOne;
  257. }
  258. public function setUserOne(?Users $userOne): static
  259. {
  260. $this->userOne = $userOne;
  261. return $this;
  262. }
  263. public function getUserTwo(): ?Users
  264. {
  265. return $this->userTwo;
  266. }
  267. public function setUserTwo(?Users $userTwo): static
  268. {
  269. $this->userTwo = $userTwo;
  270. return $this;
  271. }
  272. // ========================================
  273. // NOUVEAU — lastMessageSenderId
  274. // ========================================
  275. public function getLastMessageSenderId(): ?int
  276. {
  277. return $this->lastMessageSenderId;
  278. }
  279. public function setLastMessageSenderId(?int $lastMessageSenderId): static
  280. {
  281. $this->lastMessageSenderId = $lastMessageSenderId;
  282. return $this;
  283. }
  284. }