feat(backend): Ajout complet des fonctionnalités Chat, Social, Story et Notifications

Implémentation complète de toutes les fonctionnalités backend :

## Nouvelles Fonctionnalités

### Chat (Messagerie Instantanée)
- Entities : Conversation, Message
- DTOs : ConversationResponseDTO, MessageResponseDTO, SendMessageRequestDTO
- Resources : MessageResource (endpoints REST)
- Services : MessageService (logique métier)
- Repositories : ConversationRepository, MessageRepository
- WebSocket : ChatWebSocket (temps réel)

### Social (Publications Sociales)
- Entities : SocialPost, SocialComment, SocialLike
- DTOs : SocialPostResponseDTO, CreateSocialPostRequestDTO
- Resources : SocialPostResource
- Services : SocialPostService
- Repositories : SocialPostRepository

### Story (Stories temporaires)
- Entities : Story, StoryView
- DTOs : StoryResponseDTO, CreateStoryRequestDTO
- Resources : StoryResource
- Services : StoryService
- Repositories : StoryRepository

### Notifications (Temps Réel)
- Entities : Notification
- DTOs : NotificationResponseDTO
- Resources : NotificationResource
- Services : NotificationService, PresenceService
- Repositories : NotificationRepository
- WebSocket : NotificationWebSocket (temps réel)

## Améliorations

### Users & Friendship
- Mise à jour UserResponseDTO avec nouveaux champs
- Amélioration FriendshipResource avec séparation demandes envoyées/reçues
- FriendSuggestionResponseDTO pour suggestions d'amis
- Optimisations dans UsersService et FriendshipService

### Events
- Améliorations EventsResource et EventService
- Optimisations EventsRepository

### Configuration
- Mise à jour application.properties
- Configuration docker-compose.yml
- Dockerfile pour développement

## Fichiers Modifiés
- .dockerignore, .gitignore
- README.md
- docker-compose.yml
- Configuration Maven wrapper
This commit is contained in:
dahoud
2026-01-10 10:39:58 +00:00
parent fd67140961
commit 093d04c224
60 changed files with 14652 additions and 220 deletions

View File

@@ -0,0 +1,122 @@
package com.lions.dev.service;
import com.lions.dev.entity.users.Users;
import com.lions.dev.repository.UsersRepository;
import com.lions.dev.websocket.NotificationWebSocket;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import java.time.LocalDateTime;
import java.util.*;
/**
* Service pour gérer la présence des utilisateurs (online/offline).
*
* Ce service gère:
* - Le marquage des utilisateurs comme en ligne/hors ligne
* - Le heartbeat pour maintenir le statut online
* - La diffusion de la présence aux amis via WebSocket
*/
@ApplicationScoped
public class PresenceService {
@Inject
UsersRepository usersRepository;
/**
* Marque un utilisateur comme en ligne et broadcast sa présence.
*
* @param userId L'ID de l'utilisateur
*/
@Transactional
public void setUserOnline(UUID userId) {
Users user = usersRepository.findById(userId);
if (user != null) {
user.updatePresence();
usersRepository.persist(user);
// Broadcast présence aux autres utilisateurs
broadcastPresenceToAll(userId, true, user.getLastSeen());
System.out.println("[PRESENCE] Utilisateur " + userId + " marqué online");
}
}
/**
* Marque un utilisateur comme hors ligne.
*
* @param userId L'ID de l'utilisateur
*/
@Transactional
public void setUserOffline(UUID userId) {
Users user = usersRepository.findById(userId);
if (user != null) {
user.setOffline();
usersRepository.persist(user);
// Broadcast présence aux autres utilisateurs
broadcastPresenceToAll(userId, false, user.getLastSeen());
System.out.println("[PRESENCE] Utilisateur " + userId + " marqué offline");
}
}
/**
* Met à jour le heartbeat d'un utilisateur (keep-alive).
*
* @param userId L'ID de l'utilisateur
*/
@Transactional
public void heartbeat(UUID userId) {
Users user = usersRepository.findById(userId);
if (user != null) {
user.updatePresence();
usersRepository.persist(user);
System.out.println("[PRESENCE] Heartbeat reçu pour utilisateur " + userId);
}
}
/**
* Broadcast la présence d'un utilisateur à tous les utilisateurs connectés via WebSocket.
*
* @param userId L'ID de l'utilisateur
* @param isOnline Le statut online
* @param lastSeen La dernière fois que l'utilisateur était en ligne
*/
private void broadcastPresenceToAll(UUID userId, boolean isOnline, LocalDateTime lastSeen) {
try {
Map<String, Object> presenceData = new HashMap<>();
presenceData.put("userId", userId.toString());
presenceData.put("isOnline", isOnline);
presenceData.put("lastSeen", lastSeen != null ? lastSeen.toString() : null);
presenceData.put("timestamp", System.currentTimeMillis());
// Envoyer via NotificationWebSocket
NotificationWebSocket.broadcastPresenceUpdate(presenceData);
System.out.println("[PRESENCE] Broadcast de la présence de " + userId + " : " + isOnline);
} catch (Exception e) {
System.out.println("[ERROR] Erreur lors du broadcast de présence : " + e.getMessage());
}
}
/**
* Récupère le statut de présence d'un utilisateur.
*
* @param userId L'ID de l'utilisateur
* @return Map contenant isOnline et lastSeen
*/
public Map<String, Object> getUserPresence(UUID userId) {
Users user = usersRepository.findById(userId);
Map<String, Object> presence = new HashMap<>();
if (user != null) {
presence.put("userId", userId.toString());
presence.put("isOnline", user.isOnline());
presence.put("lastSeen", user.getLastSeen() != null ? user.getLastSeen().toString() : null);
}
return presence;
}
}