Proposition de design & architecture pour la messagerie en temps réel
Suppression du bouton Publier dans le header · Ajout de l'onglet Messages
Accessible depuis l'onglet Messages ou l'icône dans le header
2 nouvelles tables MySQL · Aucun impact sur les tables existantes
| id | BIGINT UNSIGNED | PK, AUTO_INCREMENT |
| user1_id | INT UNSIGNED | FK → users(id) |
| user2_id | INT UNSIGNED | FK → users(id) |
| created_at | DATETIME | DEFAULT NOW() |
| last_message_at | DATETIME | pour tri inbox |
| UNIQUE KEY (user1_id, user2_id) INDEX (last_message_at DESC) | ||
| id | BIGINT UNSIGNED | PK, AUTO_INCREMENT |
| conversation_id | BIGINT UNSIGNED | FK → conversations(id) |
| sender_id | INT UNSIGNED | FK → users(id) |
| content | TEXT | max 2000 cars |
| fail_ref_id | BIGINT UNSIGNED | FK nullable → fails(id) |
| read_at | DATETIME | NULL = non lu |
| created_at | DATETIME | DEFAULT NOW() |
| INDEX (conversation_id, created_at) INDEX (sender_id) | ||
user1_id < user2_id contrainte d'ordre → garantit l'unicité d'une conversation entre 2 utilisateurs
Socket.io côté backend · Service Angular côté frontend
4 phases · De la migration SQL à l'UI finale
Créer les 2 tables (conversations, messages). Supprimer le bouton "Publier" du header home. Ajouter l'onglet "Messages" dans la tab bar avec le badge unread.
Routes /api/messages (conversations + messages + unread count). Controllers + vérifications d'autorisation. Tests des endpoints.
Intégration Socket.io dans le serveur Express existant. Authentification JWT dans le handshake. Rooms par conversation. Événements : send_message, typing, read.
ChatService (socket.io-client). MessagesPage (liste inbox). ConversationPage (fil de messages + input). Badge unread global dans TabsPage. Toast notification.