Refactoring et Ajouts de nouveaux endpoints

This commit is contained in:
DahoudG
2024-09-16 19:40:48 +00:00
parent b1535d16cb
commit a5743d91af
23 changed files with 557 additions and 191 deletions

View File

@@ -1,10 +1,13 @@
package com.lions.dev.resource;
import com.lions.dev.dto.response.events.EventUpdateResponseDTO;
import com.lions.dev.dto.request.events.EventUpdateRequestDTO;
import com.lions.dev.entity.users.Users;
import com.lions.dev.dto.request.events.EventCreateRequestDTO;
import com.lions.dev.dto.response.events.EventCreateResponseDTO;
import com.lions.dev.entity.events.Events;
import com.lions.dev.repository.EventsRepository;
import com.lions.dev.dto.request.events.EventRequestDTO;
import com.lions.dev.dto.response.events.EventResponseDTO;
import com.lions.dev.exception.EventNotFoundException;
import com.lions.dev.repository.UsersRepository; // Ajout du UsersRepository pour gérer les participants
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.*;
@@ -31,30 +34,38 @@ public class EventsResource {
@Inject
EventsRepository eventsRepository;
@Inject
UsersRepository usersRepository; // Ajout pour la gestion des participants
private static final Logger LOG = Logger.getLogger(EventsResource.class);
/**
* Endpoint pour créer un nouvel événement.
*
* @param eventRequestDTO Le DTO contenant les informations de l'événement à créer.
* @param eventCreateRequestDTO Le DTO contenant les informations de l'événement à créer.
* @return Une réponse HTTP contenant l'événement créé ou un message d'erreur.
*/
@POST
@Transactional
@Operation(summary = "Créer un nouvel événement", description = "Crée un nouvel événement et retourne ses détails")
public Response createEvent(EventRequestDTO eventRequestDTO) {
LOG.info("Tentative de création d'un nouvel événement : " + eventRequestDTO.getTitle());
public Response createEvent(EventCreateRequestDTO eventCreateRequestDTO) {
LOG.info("[LOG] Tentative de création d'un nouvel événement : " + eventCreateRequestDTO.getTitle());
Events event = new Events();
event.setTitle(eventRequestDTO.getTitle());
event.setStartDate(eventRequestDTO.getStartDate());
event.setEndDate(eventRequestDTO.getEndDate());
event.setCreator(eventRequestDTO.getCreator()); // Créateur de l'événement
event.setTitle(eventCreateRequestDTO.getTitle());
event.setStartDate(eventCreateRequestDTO.getStartDate());
event.setEndDate(eventCreateRequestDTO.getEndDate());
event.setDescription(eventCreateRequestDTO.getDescription());
event.setLocation(eventCreateRequestDTO.getLocation());
event.setCategory(eventCreateRequestDTO.getCategory());
event.setLink(eventCreateRequestDTO.getLink());
event.setImageUrl(eventCreateRequestDTO.getImageUrl());
event.setCreator(eventCreateRequestDTO.getCreator());
eventsRepository.persist(event);
LOG.info("Événement créé avec succès : " + event.getTitle());
LOG.info("[LOG] Événement créé avec succès : " + event.getTitle());
EventResponseDTO responseDTO = new EventResponseDTO(event);
EventCreateResponseDTO responseDTO = new EventCreateResponseDTO(event);
return Response.status(Response.Status.CREATED).entity(responseDTO).build();
}
@@ -68,17 +79,16 @@ public class EventsResource {
@Path("/{id}")
@Operation(summary = "Récupérer un événement par ID", description = "Retourne les détails de l'événement demandé")
public Response getEventById(@PathParam("id") UUID id) {
LOG.info("Récupération de l'événement avec l'ID : " + id);
LOG.info("[LOG] Récupération de l'événement avec l'ID : " + id);
Events event = eventsRepository.findById(id);
if (event == null) {
LOG.warn("Événement non trouvé avec l'ID : " + id);
return Response.status(Response.Status.NOT_FOUND)
.entity("Événement non trouvé.").build();
LOG.warn("[LOG] Événement non trouvé avec l'ID : " + id);
return Response.status(Response.Status.NOT_FOUND).entity("Événement non trouvé.").build();
}
EventResponseDTO responseDTO = new EventResponseDTO(event);
LOG.info("Événement trouvé : " + event.getTitle());
EventCreateResponseDTO responseDTO = new EventCreateResponseDTO(event);
LOG.info("[LOG] Événement trouvé : " + event.getTitle());
return Response.ok(responseDTO).build();
}
@@ -92,17 +102,16 @@ public class EventsResource {
@Path("/after-date")
@Operation(summary = "Récupérer les événements après une date", description = "Retourne les événements après une date donnée")
public Response getEventsAfterDate(@QueryParam("startDate") LocalDateTime startDate) {
LOG.info("Récupération des événements après la date : " + startDate);
LOG.info("[LOG] Récupération des événements après la date : " + startDate);
List<Events> events = eventsRepository.findEventsAfterDate(startDate);
if (events.isEmpty()) {
LOG.warn("Aucun événement trouvé après la date : " + startDate);
return Response.status(Response.Status.NOT_FOUND)
.entity("Aucun événement trouvé après cette date.").build();
LOG.warn("[LOG] Aucun événement trouvé après la date : " + startDate);
return Response.status(Response.Status.NOT_FOUND).entity("Aucun événement trouvé après cette date.").build();
}
List<EventResponseDTO> responseDTOs = events.stream().map(EventResponseDTO::new).toList();
LOG.info("Nombre d'événements trouvés après la date : " + events.size());
List<EventCreateResponseDTO> responseDTOs = events.stream().map(EventCreateResponseDTO::new).toList();
LOG.info("[LOG] Nombre d'événements trouvés après la date : " + events.size());
return Response.ok(responseDTOs).build();
}
@@ -126,7 +135,156 @@ public class EventsResource {
} else {
LOG.warn("Échec de la suppression : événement introuvable avec l'ID : " + id);
return Response.status(Response.Status.NOT_FOUND)
.entity("Événement non trouvé.").build();
.entity("Événement non trouvé.").build();
}
}
/**
* Endpoint pour ajouter un participant à un événement.
*
* @param eventId L'ID de l'événement.
* @param user L'utilisateur à ajouter comme participant.
* @return Une réponse HTTP indiquant le succès de l'ajout.
*/
@POST
@Path("/{id}/participants")
@Transactional
@Operation(summary = "Ajouter un participant à un événement", description = "Ajoute un utilisateur à un événement")
public Response addParticipant(@PathParam("id") UUID eventId, Users user) {
LOG.info("Ajout d'un participant à l'événement : " + eventId);
Events event = eventsRepository.findById(eventId);
if (event == null) {
LOG.warn("Événement non trouvé avec l'ID : " + eventId);
return Response.status(Response.Status.NOT_FOUND)
.entity("Événement non trouvé.").build();
}
event.addParticipant(user);
eventsRepository.persist(event);
LOG.info("Participant ajouté avec succès à l'événement : " + event.getTitle());
return Response.ok(new EventCreateResponseDTO(event)).build();
}
/**
* Endpoint pour retirer un participant d'un événement.
*
* @param eventId L'ID de l'événement.
* @param userId L'ID de l'utilisateur à retirer.
* @return Une réponse HTTP indiquant le succès du retrait.
*/
@DELETE
@Path("/{id}/participants/{userId}")
@Transactional
@Operation(summary = "Retirer un participant d'un événement", description = "Supprime un utilisateur de la liste des participants d'un événement")
public Response removeParticipant(@PathParam("id") UUID eventId, @PathParam("userId") UUID userId) {
LOG.info("Retrait d'un participant de l'événement : " + eventId);
Events event = eventsRepository.findById(eventId);
if (event == null) {
LOG.warn("Événement non trouvé avec l'ID : " + eventId);
return Response.status(Response.Status.NOT_FOUND)
.entity("Événement non trouvé.").build();
}
Users user = usersRepository.findById(userId);
if (user == null) {
LOG.warn("Utilisateur non trouvé avec l'ID : " + userId);
return Response.status(Response.Status.NOT_FOUND)
.entity("Utilisateur non trouvé.").build();
}
event.removeParticipant(user);
eventsRepository.persist(event);
LOG.info("Participant retiré avec succès de l'événement : " + event.getTitle());
return Response.noContent().build();
}
/**
* Endpoint pour obtenir le nombre de participants à un événement.
*
* @param eventId L'ID de l'événement.
* @return Le nombre de participants.
*/
@GET
@Path("/{id}/participants/count")
@Operation(summary = "Obtenir le nombre de participants à un événement", description = "Retourne le nombre total de participants à un événement")
public Response getNumberOfParticipants(@PathParam("id") UUID eventId) {
LOG.info("Récupération du nombre de participants pour l'événement : " + eventId);
Events event = eventsRepository.findById(eventId);
if (event == null) {
LOG.warn("Événement non trouvé avec l'ID : " + eventId);
return Response.status(Response.Status.NOT_FOUND)
.entity("Événement non trouvé.").build();
}
int participantCount = event.getNumberOfParticipants();
LOG.info("Nombre de participants pour l'événement : " + participantCount);
return Response.ok(participantCount).build();
}
/**
* Endpoint pour fermer un événement.
*
* @param eventId L'ID de l'événement.
* @return Une réponse HTTP indiquant le succès de la fermeture.
*/
@POST
@Path("/{id}/close")
@Transactional
@Operation(summary = "Fermer un événement", description = "Ferme un événement et empêche les nouvelles participations")
public Response closeEvent(@PathParam("id") UUID eventId) {
LOG.info("Tentative de fermeture de l'événement avec l'ID : " + eventId);
Events event = eventsRepository.findById(eventId);
if (event == null) {
LOG.warn("Événement non trouvé avec l'ID : " + eventId);
return Response.status(Response.Status.NOT_FOUND)
.entity("Événement non trouvé.").build();
}
event.setClosed(true); // Marquer l'événement comme fermé
eventsRepository.persist(event);
LOG.info("Événement fermé avec succès : " + event.getTitle());
return Response.ok(new EventCreateResponseDTO(event)).build();
}
/**
* Endpoint pour mettre à jour un événement.
*
* @param id L'ID de l'événement.
* @param eventUpdateRequestDTO Le DTO de la requête de mise à jour.
* @return Une réponse HTTP indiquant la mise à jour.
*/
@PUT
@Path("/{id}")
@Transactional
@Operation(summary = "Mettre à jour un événement", description = "Modifie un événement existant")
public Response updateEvent(@PathParam("id") UUID id, EventUpdateRequestDTO eventUpdateRequestDTO) {
LOG.info("[LOG] Tentative de mise à jour de l'événement avec l'ID : " + id);
Events event = eventsRepository.findById(id);
if (event == null) {
LOG.warn("[LOG] Événement non trouvé avec l'ID : " + id);
return Response.status(Response.Status.NOT_FOUND).entity("Événement non trouvé.").build();
}
// Mise à jour des attributs de l'événement
event.setTitle(eventUpdateRequestDTO.getTitle());
event.setStartDate(eventUpdateRequestDTO.getStartDate());
event.setEndDate(eventUpdateRequestDTO.getEndDate());
event.setDescription(eventUpdateRequestDTO.getDescription());
event.setLocation(eventUpdateRequestDTO.getLocation());
event.setCategory(eventUpdateRequestDTO.getCategory());
event.setLink(eventUpdateRequestDTO.getLink());
event.setImageUrl(eventUpdateRequestDTO.getImageUrl());
eventsRepository.persist(event);
LOG.info("[LOG] Événement mis à jour avec succès : " + event.getTitle());
EventUpdateResponseDTO responseDTO = new EventUpdateResponseDTO(event);
return Response.ok(responseDTO).build();
}
}