From d848f4596c884dbf0e1eab58a069eb0ed82617d2 Mon Sep 17 00:00:00 2001 From: DahoudG Date: Wed, 18 Sep 2024 10:33:56 +0000 Subject: [PATCH] Refactoring --- pom.xml | 327 +++++++++--------- .../com/lions/dev/entity/events/Events.java | 3 + .../com/lions/dev/entity/users/Users.java | 3 + .../lions/dev/resource/EventsResource.java | 140 ++++++-- .../dev/resource/FileUploadResource.java | 36 ++ .../com/lions/dev/resource/UsersResource.java | 48 ++- .../com/lions/dev/service/EventService.java | 30 ++ .../com/lions/dev/service/FileService.java | 35 ++ .../com/lions/dev/service/UserService.java | 33 ++ src/main/resources/application.properties | 5 + 10 files changed, 460 insertions(+), 200 deletions(-) create mode 100644 src/main/java/com/lions/dev/resource/FileUploadResource.java create mode 100644 src/main/java/com/lions/dev/service/FileService.java diff --git a/pom.xml b/pom.xml index c2dedb7..eee651b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,173 +1,174 @@ - - 4.0.0 - com.lions.dev - mic-after-work-server - 1.0.0-SNAPSHOT + + 4.0.0 + com.lions.dev + mic-after-work-server + 1.0.0-SNAPSHOT - - 3.13.0 - 17 - UTF-8 - UTF-8 - quarkus-bom - io.quarkus.platform - 3.13.0 - true - 3.2.5 - - - - - - ${quarkus.platform.group-id} - ${quarkus.platform.artifact-id} - ${quarkus.platform.version} - pom - import - - - + + 3.13.0 + 17 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.13.0 + true + 3.2.5 + + - - io.quarkus - quarkus-smallrye-jwt - - - - org.springframework.security - spring-security-core - 6.3.3 - - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - io.quarkiverse.groovy - quarkus-groovy-junit5 - 3.12.1 - - - io.quarkus - quarkus-smallrye-openapi - - - io.quarkus - quarkus-resteasy-reactive-jackson - - - io.quarkus - quarkus-hibernate-orm-panache - - - io.quarkus - quarkus-jdbc-oracle - - - io.quarkus - quarkus-arc - - - io.quarkus - quarkus-hibernate-orm - - - io.quarkus - quarkus-junit5 - test - - - io.rest-assured - rest-assured - test - - - - org.hibernate.validator - hibernate-validator - - org.projectlombok - lombok - 1.18.30 - provided + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} + pom + import + - - - - ${quarkus.platform.group-id} - quarkus-maven-plugin - ${quarkus.platform.version} - true - - - - build - generate-code - generate-code-tests - native-image-agent - - - - - - maven-compiler-plugin - ${compiler-plugin.version} - - - -parameters - - - - - maven-surefire-plugin - ${surefire-plugin.version} - - - org.jboss.logmanager.LogManager - ${maven.home} - - - - - maven-failsafe-plugin - ${surefire-plugin.version} - - - - integration-test - verify - - - - - - ${project.build.directory}/${project.build.finalName}-runner - org.jboss.logmanager.LogManager - ${maven.home} - - - - - + + + io.quarkus + quarkus-smallrye-jwt + + + org.springframework.security + spring-security-core + 6.3.3 + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + io.quarkiverse.groovy + quarkus-groovy-junit5 + 3.12.1 + + + io.quarkus + quarkus-smallrye-openapi + + + io.quarkus + quarkus-rest-jackson + + + io.quarkus + quarkus-hibernate-orm-panache + + + io.quarkus + quarkus-jdbc-oracle + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-hibernate-orm + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test + + + + org.hibernate.validator + hibernate-validator + + + org.projectlombok + lombok + 1.18.30 + provided + + - - - native - - - native - - - - false - true - - - + + + + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true + + + + build + generate-code + generate-code-tests + native-image-agent + + + + + + maven-compiler-plugin + ${compiler-plugin.version} + + + -parameters + + + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + + + ${project.build.directory}/${project.build.finalName}-runner + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + native + + + native + + + + false + true + + + diff --git a/src/main/java/com/lions/dev/entity/events/Events.java b/src/main/java/com/lions/dev/entity/events/Events.java index c50e437..bd58a98 100644 --- a/src/main/java/com/lions/dev/entity/events/Events.java +++ b/src/main/java/com/lions/dev/entity/events/Events.java @@ -53,6 +53,9 @@ public class Events extends BaseEntity { @Column(name = "status", nullable = false) private String status = "en cours"; // Le statut de l'événement (en cours, terminé, annulé, etc.) + @Column(name = "profile_image_url") + private String profileImageUrl; // URL de la photo de profil + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "creator_id", nullable = false) private Users creator; // L'utilisateur créateur de l'événement diff --git a/src/main/java/com/lions/dev/entity/users/Users.java b/src/main/java/com/lions/dev/entity/users/Users.java index 06435b7..545b1f2 100644 --- a/src/main/java/com/lions/dev/entity/users/Users.java +++ b/src/main/java/com/lions/dev/entity/users/Users.java @@ -38,6 +38,9 @@ public class Users extends BaseEntity { @Column(name = "role", nullable = false) private String role; // Le rôle de l'utilisateur (ADMIN, MODERATOR, USER, etc.) + @Column(name = "profile_image_url") + private String profileImageUrl; // L'URL de l'image de profil de l'utilisateur + // Utilisation de BCrypt pour hacher les mots de passe de manière sécurisée private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); diff --git a/src/main/java/com/lions/dev/resource/EventsResource.java b/src/main/java/com/lions/dev/resource/EventsResource.java index ff4e893..9a045e6 100644 --- a/src/main/java/com/lions/dev/resource/EventsResource.java +++ b/src/main/java/com/lions/dev/resource/EventsResource.java @@ -1,17 +1,19 @@ 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.service.EventService; import com.lions.dev.repository.EventsRepository; -import com.lions.dev.repository.UsersRepository; // Ajout du UsersRepository pour gérer les participants +import com.lions.dev.dto.request.events.EventCreateRequestDTO; +import com.lions.dev.dto.request.events.EventUpdateRequestDTO; +import com.lions.dev.dto.response.events.EventCreateResponseDTO; +import com.lions.dev.dto.response.events.EventUpdateResponseDTO; +import com.lions.dev.entity.events.Events; +import com.lions.dev.entity.users.Users; +import com.lions.dev.repository.UsersRepository; // Ajout du UsersRepository pour gérer les import jakarta.inject.Inject; import jakarta.transaction.Transactional; import jakarta.ws.rs.*; import jakarta.ws.rs.core.Response; +import java.io.File; // participants import java.time.LocalDateTime; import java.util.List; import java.util.UUID; @@ -20,10 +22,10 @@ import org.eclipse.microprofile.openapi.annotations.tags.Tag; import org.jboss.logging.Logger; /** - * Ressource REST pour la gestion des événements dans le système AfterWork. - * Cette classe expose des endpoints pour créer, récupérer, et supprimer des événements. + * Ressource REST pour la gestion des événements dans le système AfterWork. Cette classe expose des + * endpoints pour créer, récupérer, et supprimer des événements. * - * Tous les logs nécessaires pour la traçabilité sont intégrés. + *

Tous les logs nécessaires pour la traçabilité sont intégrés. */ @Path("/events") @Produces("application/json") @@ -35,7 +37,10 @@ public class EventsResource { EventsRepository eventsRepository; @Inject - UsersRepository usersRepository; // Ajout pour la gestion des participants + UsersRepository usersRepository; // Ajout pour la gestion des participants + + @Inject + EventService eventService; private static final Logger LOG = Logger.getLogger(EventsResource.class); @@ -47,9 +52,12 @@ public class EventsResource { */ @POST @Transactional - @Operation(summary = "Créer un nouvel événement", description = "Crée un nouvel événement et retourne ses détails") + @Operation( + summary = "Créer un nouvel événement", + description = "Crée un nouvel événement et retourne ses détails") public Response createEvent(EventCreateRequestDTO eventCreateRequestDTO) { - LOG.info("[LOG] Tentative de création d'un nouvel événement : " + eventCreateRequestDTO.getTitle()); + LOG.info( + "[LOG] Tentative de création d'un nouvel événement : " + eventCreateRequestDTO.getTitle()); Events event = new Events(); event.setTitle(eventCreateRequestDTO.getTitle()); @@ -77,7 +85,9 @@ public class EventsResource { */ @GET @Path("/{id}") - @Operation(summary = "Récupérer un événement par ID", description = "Retourne les détails de l'événement demandé") + @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("[LOG] Récupération de l'événement avec l'ID : " + id); @@ -100,17 +110,22 @@ public class EventsResource { */ @GET @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") + @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("[LOG] Récupération des événements après la date : " + startDate); List events = eventsRepository.findEventsAfterDate(startDate); if (events.isEmpty()) { 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(); + return Response.status(Response.Status.NOT_FOUND) + .entity("Aucun événement trouvé après cette date.") + .build(); } - List responseDTOs = events.stream().map(EventCreateResponseDTO::new).toList(); + List 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(); } @@ -124,7 +139,9 @@ public class EventsResource { @DELETE @Path("/{id}") @Transactional - @Operation(summary = "Supprimer un événement", description = "Supprime un événement de la base de données") + @Operation( + summary = "Supprimer un événement", + description = "Supprime un événement de la base de données") public Response deleteEvent(@PathParam("id") UUID id) { LOG.info("Tentative de suppression de l'événement avec l'ID : " + id); @@ -134,8 +151,7 @@ public class EventsResource { return Response.noContent().build(); } 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(); + return Response.status(Response.Status.NOT_FOUND).entity("Événement non trouvé.").build(); } } @@ -149,15 +165,16 @@ public class EventsResource { @POST @Path("/{id}/participants") @Transactional - @Operation(summary = "Ajouter un participant à un événement", description = "Ajoute un utilisateur à un événement") + @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(); + return Response.status(Response.Status.NOT_FOUND).entity("Événement non trouvé.").build(); } event.addParticipant(user); @@ -176,22 +193,23 @@ public class EventsResource { @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) { + @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(); + 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(); + return Response.status(Response.Status.NOT_FOUND).entity("Utilisateur non trouvé.").build(); } event.removeParticipant(user); @@ -208,15 +226,16 @@ public class EventsResource { */ @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") + @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(); + return Response.status(Response.Status.NOT_FOUND).entity("Événement non trouvé.").build(); } int participantCount = event.getNumberOfParticipants(); @@ -233,15 +252,16 @@ public class EventsResource { @POST @Path("/{id}/close") @Transactional - @Operation(summary = "Fermer un événement", description = "Ferme un événement et empêche les nouvelles participations") + @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(); + return Response.status(Response.Status.NOT_FOUND).entity("Événement non trouvé.").build(); } event.setClosed(true); // Marquer l'événement comme fermé @@ -261,7 +281,8 @@ public class EventsResource { @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) { + 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); @@ -287,4 +308,51 @@ public class EventsResource { return Response.ok(responseDTO).build(); } + /** + * Endpoint pour mettre à jour l'image d'un événement. + * + * @param id L'identifiant de l'événement. + * @param imageFilePath Le chemin vers l'image de l'événement. + * @return Un message indiquant si la mise à jour a réussi ou non. + */ + @PUT + @jakarta.ws.rs.Path("/{id}/image") + public String updateEventImage(@PathParam("id") UUID id, String imageFilePath) { + try { + // Vérification si le chemin d'image est vide ou null + if (imageFilePath == null || imageFilePath.isEmpty()) { + System.out.println("[ERROR] Le chemin de l'image est vide ou null."); + return "Le chemin de l'image est vide ou null."; + } + + // Utiliser File pour vérifier si le fichier existe + File file = new File(imageFilePath); + if (!file.exists()) { + System.out.println("[ERROR] Le fichier spécifié n'existe pas : " + imageFilePath); + return "Le fichier spécifié n'existe pas."; + } + + // Récupérer l'événement par son ID + Events event = eventService.getEventById(id); + if (event == null) { + System.out.println("[ERROR] Événement non trouvé avec l'ID : " + id); + return "Événement non trouvé."; + } + + // Mettre à jour l'URL de l'image de l'événement + String imageUrl = file.getAbsolutePath(); // Obtenir le chemin complet du fichier + event.setImageUrl(imageUrl); + + // Mise à jour de l'événement + eventService.updateEvent(event); + System.out.println( + "[LOG] Image de l'événement mise à jour avec succès pour : " + event.getTitle()); + + return "Image de l'événement mise à jour avec succès."; + } catch (Exception e) { + System.out.println( + "[ERROR] Erreur lors de la mise à jour de l'image de l'événement : " + e.getMessage()); + return "Erreur lors de la mise à jour de l'image de l'événement."; + } + } } diff --git a/src/main/java/com/lions/dev/resource/FileUploadResource.java b/src/main/java/com/lions/dev/resource/FileUploadResource.java new file mode 100644 index 0000000..3451b8c --- /dev/null +++ b/src/main/java/com/lions/dev/resource/FileUploadResource.java @@ -0,0 +1,36 @@ +package com.lions.dev.resource; + +import com.lions.dev.service.FileService; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.jboss.logging.Logger; +import org.jboss.resteasy.reactive.RestForm; +import org.jboss.resteasy.reactive.multipart.FileUpload; +import jakarta.inject.Inject; +import java.io.IOException; + +@Path("/upload") +public class FileUploadResource { + + private static final Logger LOG = Logger.getLogger(FileUploadResource.class); + + @Inject + FileService fileService; + + @POST + @Consumes(MediaType.MULTIPART_FORM_DATA) + public Response uploadFile(@RestForm("file") FileUpload file) { + String uploadDir = "/tmp/uploads/"; + + try { + Path savedFilePath = (jakarta.ws.rs.Path) fileService.saveFile(file.uploadedFile(), uploadDir, file.fileName()); + return Response.ok("Fichier uploadé avec succès : " + savedFilePath).build(); + } catch (IOException e) { + LOG.error("Erreur lors de l'upload du fichier", e); + return Response.serverError().entity("Erreur lors de l'upload du fichier.").build(); + } + } +} diff --git a/src/main/java/com/lions/dev/resource/UsersResource.java b/src/main/java/com/lions/dev/resource/UsersResource.java index 836788c..3680539 100644 --- a/src/main/java/com/lions/dev/resource/UsersResource.java +++ b/src/main/java/com/lions/dev/resource/UsersResource.java @@ -1,5 +1,8 @@ package com.lions.dev.resource; +import java.io.File; + +import jakarta.ws.rs.Path; import com.lions.dev.dto.request.users.UserAuthenticateRequestDTO; import com.lions.dev.dto.response.users.UserAuthenticateResponseDTO; import com.lions.dev.dto.response.users.UserDeleteResponseDto; @@ -14,6 +17,7 @@ import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.tags.Tag; import org.jboss.logging.Logger; + /** * Ressource REST pour la gestion des utilisateurs dans le système AfterWork. Cette classe expose * des endpoints pour créer, authentifier, récupérer et supprimer des utilisateurs. @@ -26,7 +30,8 @@ import org.jboss.logging.Logger; @Tag(name = "Users", description = "Opérations liées à la gestion des utilisateurs") public class UsersResource { - @Inject UserService userService; + @Inject + UserService userService; private static final Logger LOG = Logger.getLogger(UsersResource.class); @@ -145,4 +150,45 @@ public class UsersResource { } } + /** + * Endpoint pour mettre à jour l'image de profil de l'utilisateur. + * + * @param id L'identifiant de l'utilisateur. + * @param imageFilePath Le chemin vers l'image de profil. + * @return Un message indiquant si la mise à jour a réussi. + */ + @PUT + @jakarta.ws.rs.Path("/{id}/profile-image") // Annotation REST avec jakarta.ws.rs.Path + public String updateUserProfileImage(@PathParam("id") UUID id, String imageFilePath) { + try { + // Utiliser File au lieu de Path pour vérifier si le fichier existe + File file = new File(imageFilePath); + if (!file.exists()) { + System.out.println("[ERROR] Le fichier spécifié n'existe pas : " + imageFilePath); + return "Le fichier spécifié n'existe pas."; + } + + // Récupérer l'utilisateur par son ID + Users user = userService.getUserById(id); + if (user == null) { + System.out.println("[ERROR] Utilisateur non trouvé avec l'ID : " + id); + return "Utilisateur non trouvé."; + } + + // Mettre à jour l'URL de l'image de profil + String profileImageUrl = file.getAbsolutePath(); // Obtenir le chemin complet du fichier + user.setProfileImageUrl(profileImageUrl); + + // Mise à jour de l'utilisateur + userService.updateUser(user); + System.out.println("[LOG] Image de profil mise à jour pour l'utilisateur : " + user.getEmail()); + + return "Image de profil mise à jour avec succès."; + } catch (Exception e) { + System.out.println("[ERROR] Erreur lors de la mise à jour de l'image de profil : " + e.getMessage()); + return "Erreur lors de la mise à jour de l'image de profil."; + } + } + + } diff --git a/src/main/java/com/lions/dev/service/EventService.java b/src/main/java/com/lions/dev/service/EventService.java index 868a5b8..6e155b3 100644 --- a/src/main/java/com/lions/dev/service/EventService.java +++ b/src/main/java/com/lions/dev/service/EventService.java @@ -98,4 +98,34 @@ public class EventService { } return deleted; } + + /** + * Met à jour un événement dans le système. + * + * @param event L'événement à mettre à jour. + * @return L'événement mis à jour. + */ + @Transactional + public Events updateEvent(Events event) { + Events existingEvent = eventsRepository.findById(event.getId()); + if (existingEvent == null) { + logger.error("[ERROR] Événement non trouvé avec l'ID : {}", event.getId()); + throw new EventNotFoundException(event.getId()); + } + + // Mettre à jour les détails de l'événement + existingEvent.setTitle(event.getTitle()); + existingEvent.setDescription(event.getDescription()); + existingEvent.setStartDate(event.getStartDate()); + existingEvent.setEndDate(event.getEndDate()); + existingEvent.setLocation(event.getLocation()); + existingEvent.setCategory(event.getCategory()); + existingEvent.setLink(event.getLink()); + existingEvent.setImageUrl(event.getImageUrl()); + existingEvent.setStatus(event.getStatus()); + + eventsRepository.persist(existingEvent); + logger.info("[LOG] Événement mis à jour avec succès : {}", existingEvent.getTitle()); + return existingEvent; + } } diff --git a/src/main/java/com/lions/dev/service/FileService.java b/src/main/java/com/lions/dev/service/FileService.java new file mode 100644 index 0000000..ff5f5a3 --- /dev/null +++ b/src/main/java/com/lions/dev/service/FileService.java @@ -0,0 +1,35 @@ +package com.lions.dev.service; + +import org.jboss.logging.Logger; +import jakarta.enterprise.context.ApplicationScoped; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Service pour la gestion des fichiers uploadés. + * Ce service permet de sauvegarder et gérer les fichiers uploadés sur le serveur. + */ +@ApplicationScoped +public class FileService { + + private static final Logger LOG = Logger.getLogger(FileService.class); + + /** + * Sauvegarde le fichier uploadé sur le serveur. + * + * @param uploadedFilePath Le chemin temporaire du fichier uploadé. + * @param destinationDir Le répertoire de destination où sauvegarder le fichier. + * @param fileName Le nom du fichier. + * @return Le chemin complet du fichier sauvegardé. + * @throws IOException Si une erreur survient lors de la sauvegarde. + */ + public Path saveFile(Path uploadedFilePath, String destinationDir, String fileName) throws IOException { + Path destination = Paths.get(destinationDir, fileName); + Files.createDirectories(Paths.get(destinationDir)); // Crée le répertoire s'il n'existe pas + Files.copy(uploadedFilePath, destination); // Copie le fichier vers sa destination + LOG.info("Fichier sauvegardé avec succès : " + destination); + return destination; + } +} diff --git a/src/main/java/com/lions/dev/service/UserService.java b/src/main/java/com/lions/dev/service/UserService.java index 9e5df8f..15f920d 100644 --- a/src/main/java/com/lions/dev/service/UserService.java +++ b/src/main/java/com/lions/dev/service/UserService.java @@ -43,6 +43,37 @@ public class UserService { return user; } + /** + * Met à jour un utilisateur existant dans le système. + * + * @param user L'utilisateur à mettre à jour. + * @return L'utilisateur mis à jour. + */ + public Users updateUser(Users user) { + try { + Users existingUser = usersRepository.findById(user.getId()); + if (existingUser == null) { + System.out.println("[ERROR] Utilisateur non trouvé pour la mise à jour avec l'ID : " + user.getId()); + throw new UserNotFoundException("Utilisateur non trouvé avec l'ID : " + user.getId()); + } + + // Mettre à jour les champs de l'utilisateur existant + existingUser.setNom(user.getNom()); + existingUser.setPrenoms(user.getPrenoms()); + existingUser.setEmail(user.getEmail()); + existingUser.setMotDePasse(user.getMotDePasse()); // Hachage automatique si nécessaire + existingUser.setRole(user.getRole()); + + usersRepository.persist(existingUser); + System.out.println("[LOG] Utilisateur mis à jour avec succès : " + existingUser.getEmail()); + return existingUser; + } catch (Exception e) { + System.out.println("[ERROR] Erreur lors de la mise à jour de l'utilisateur : " + e.getMessage()); + throw e; + } + } + + /** * Authentifie un utilisateur avec son email et son mot de passe. * @@ -93,4 +124,6 @@ public class UserService { } return deleted; } + + } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4fc0968..5cb4d5e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -27,3 +27,8 @@ quarkus.log.level=INFO # smallrye.jwt.sign.key.location=META-INF/resources/privateKey.pem # smallrye.jwt.sign.key.algorithm=RS256 # smallrye.jwt.token.lifetime=3600 + +# Activer le support multipart +quarkus.http.body.uploads-directory=/tmp/uploads +quarkus.http.body.multipart.max-file-size=10M +quarkus.http.body.multipart.max-request-size=15M