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

@@ -5,14 +5,19 @@ import org.slf4j.LoggerFactory;
import jakarta.transaction.Transactional;
import com.lions.dev.dto.request.events.EventCreateRequestDTO;
import com.lions.dev.entity.events.Events;
import com.lions.dev.entity.friends.Friendship;
import com.lions.dev.entity.users.Users;
import com.lions.dev.repository.EventsRepository;
import com.lions.dev.exception.EventNotFoundException;
import com.lions.dev.exception.UserNotFoundException;
import com.lions.dev.repository.EventsRepository;
import com.lions.dev.repository.FriendshipRepository;
import com.lions.dev.repository.UsersRepository;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* Service de gestion des événements.
@@ -25,6 +30,15 @@ public class EventService {
@Inject
EventsRepository eventsRepository;
@Inject
FriendshipRepository friendshipRepository;
@Inject
UsersRepository usersRepository;
@Inject
NotificationService notificationService;
private static final Logger logger = LoggerFactory.getLogger(EventService.class);
/**
@@ -51,6 +65,33 @@ public class EventService {
// Persiste l'événement dans la base de données
eventsRepository.persist(event);
logger.info("[logger] Événement créé avec succès : {}", event.getTitle());
// Créer des notifications pour tous les amis
try {
List<Friendship> friendships = friendshipRepository.findFriendsByUser(creator, 0, Integer.MAX_VALUE);
String creatorName = creator.getPrenoms() + " " + creator.getNom();
for (Friendship friendship : friendships) {
Users friend = friendship.getUser().equals(creator)
? friendship.getFriend()
: friendship.getUser();
String notificationTitle = "Nouvel événement de " + creatorName;
String notificationMessage = creatorName + " a créé un nouvel événement : " + event.getTitle();
notificationService.createNotification(
notificationTitle,
notificationMessage,
"event",
friend.getId(),
event.getId()
);
}
logger.info("[logger] Notifications créées pour {} ami(s)", friendships.size());
} catch (Exception e) {
logger.error("[ERROR] Erreur lors de la création des notifications : {}", e.getMessage());
}
return event;
}
@@ -282,4 +323,42 @@ public class EventService {
logger.info("[logger] Nombre d'événements recommandés pour l'utilisateur : " + events.size());
return events;
}
/**
* Récupère les événements de l'utilisateur et de ses amis (relations d'amitié acceptées).
*
* @param userId L'ID de l'utilisateur
* @param page Le numéro de la page (0-indexé)
* @param size La taille de la page
* @return Liste paginée des événements de l'utilisateur et de ses amis
* @throws UserNotFoundException Si l'utilisateur n'existe pas
*/
public List<Events> getEventsByFriends(UUID userId, int page, int size) {
logger.info("[logger] Récupération des événements des amis pour l'utilisateur ID : " + userId);
Users user = usersRepository.findById(userId);
if (user == null) {
logger.error("[ERROR] Utilisateur non trouvé avec l'ID : " + userId);
throw new UserNotFoundException("Utilisateur non trouvé avec l'ID : " + userId);
}
// Récupérer toutes les relations d'amitié acceptées
List<Friendship> friendships = friendshipRepository.findFriendsByUser(user, 0, Integer.MAX_VALUE);
// Extraire les IDs des amis
List<UUID> friendIds = friendships.stream()
.map(friendship -> {
// L'ami est soit dans 'user' soit dans 'friend', selon qui a initié la relation
return friendship.getUser().equals(user)
? friendship.getFriend().getId()
: friendship.getUser().getId();
})
.distinct()
.collect(Collectors.toList());
logger.info("[logger] " + friendIds.size() + " ami(s) trouvé(s) pour l'utilisateur ID : " + userId);
// Récupérer les événements de l'utilisateur et de ses amis
return eventsRepository.findEventsByFriends(userId, friendIds, page, size);
}
}