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:
122
src/main/java/com/lions/dev/service/PresenceService.java
Normal file
122
src/main/java/com/lions/dev/service/PresenceService.java
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user