diff --git a/web/src/main/java/fr/abes/item/dto/DtoBuilder.java b/web/src/main/java/fr/abes/item/dto/DtoBuilder.java index df13ddd0..3b14f4da 100644 --- a/web/src/main/java/fr/abes/item/dto/DtoBuilder.java +++ b/web/src/main/java/fr/abes/item/dto/DtoBuilder.java @@ -1,10 +1,7 @@ package fr.abes.item.dto; import fr.abes.item.core.constant.TYPE_DEMANDE; -import fr.abes.item.core.entities.item.Demande; -import fr.abes.item.core.entities.item.DemandeExemp; -import fr.abes.item.core.entities.item.DemandeModif; -import fr.abes.item.core.entities.item.DemandeRecouv; +import fr.abes.item.core.entities.item.*; import jakarta.annotation.PostConstruct; import org.springframework.stereotype.Service; @@ -25,11 +22,15 @@ void init() { dtoList.add(DemandeRecouvWebDto.class); } - public DemandeWebDto buildDto(Demande demande, TYPE_DEMANDE type) { + public DemandeWebDto buildDemandeDto(Demande demande, TYPE_DEMANDE type) { return switch (type) { case EXEMP -> new DemandeExempWebDto((DemandeExemp) demande); case MODIF -> new DemandeModifWebDto((DemandeModif) demande); case RECOUV -> new DemandeRecouvWebDto((DemandeRecouv) demande); }; } + + public UtilisateurWebDto buildUtilisateurDto(Utilisateur utilisateur) { + return new UtilisateurWebDto(utilisateur.getId(), utilisateur.getEmail()); + } } diff --git a/web/src/main/java/fr/abes/item/dto/UtilisateurWebDto.java b/web/src/main/java/fr/abes/item/dto/UtilisateurWebDto.java new file mode 100644 index 00000000..e63ecc6c --- /dev/null +++ b/web/src/main/java/fr/abes/item/dto/UtilisateurWebDto.java @@ -0,0 +1,18 @@ +package fr.abes.item.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class UtilisateurWebDto { + @JsonProperty("userId") + private Integer userId; + @JsonProperty("email") + private String email; +} diff --git a/web/src/main/java/fr/abes/item/web/DemandeRestService.java b/web/src/main/java/fr/abes/item/web/DemandeRestService.java index 61a00420..d6b249ae 100644 --- a/web/src/main/java/fr/abes/item/web/DemandeRestService.java +++ b/web/src/main/java/fr/abes/item/web/DemandeRestService.java @@ -65,14 +65,14 @@ public List getAllActiveDemandes(@RequestParam("type") TYPE_DEMAN IDemandeService service = strategy.getStrategy(IDemandeService.class, type); if (role.equals("ADMIN")) { if (archive) { - return (!extension) ? service.getAllArchivedDemandes(iln).stream().map(element -> builder.buildDto(element, type)).collect(Collectors.toList()) : service.getAllArchivedDemandesAllIln().stream().map(element -> builder.buildDto(element, type)).collect(Collectors.toList()); + return (!extension) ? service.getAllArchivedDemandes(iln).stream().map(element -> builder.buildDemandeDto(element, type)).collect(Collectors.toList()) : service.getAllArchivedDemandesAllIln().stream().map(element -> builder.buildDemandeDto(element, type)).collect(Collectors.toList()); } else { - return (!extension) ? service.getAllActiveDemandesForAdmin(iln).stream().map(element -> builder.buildDto(element, type)).collect(Collectors.toList()) : service.getAllActiveDemandesForAdminExtended().stream().map(element -> builder.buildDto(element, type)).collect(Collectors.toList()); + return (!extension) ? service.getAllActiveDemandesForAdmin(iln).stream().map(element -> builder.buildDemandeDto(element, type)).collect(Collectors.toList()) : service.getAllActiveDemandesForAdminExtended().stream().map(element -> builder.buildDemandeDto(element, type)).collect(Collectors.toList()); } } //role USER - return (archive) ? service.getAllArchivedDemandes(iln).stream().map(element -> builder.buildDto(element, type)).collect(Collectors.toList()) : service.getActiveDemandesForUser(iln).stream().map(element -> builder.buildDto(element, type)).collect(Collectors.toList()); + return (archive) ? service.getAllArchivedDemandes(iln).stream().map(element -> builder.buildDemandeDto(element, type)).collect(Collectors.toList()) : service.getActiveDemandesForUser(iln).stream().map(element -> builder.buildDemandeDto(element, type)).collect(Collectors.toList()); } /** @@ -88,7 +88,7 @@ public List getAllActiveDemandes(@RequestParam("type") TYPE_DEMAN public DemandeWebDto getDemande(@RequestParam("type") TYPE_DEMANDE type, @PathVariable("id") Integer id, HttpServletRequest request) throws UserExistException, ForbiddenException { checkAccessToServices.autoriserAccesDemandeParIln(id, request.getAttribute(Constant.USER_NUM).toString(), type); IDemandeService service = strategy.getStrategy(IDemandeService.class, type); - return builder.buildDto(service.findById(id), type); + return builder.buildDemandeDto(service.findById(id), type); } /** @@ -106,7 +106,7 @@ public DemandeWebDto save(@RequestParam("type") TYPE_DEMANDE type, @RequestParam IDemandeService service = strategy.getStrategy(IDemandeService.class, type); Demande demande = service.creerDemande(rcr, Integer.parseInt(request.getAttribute(Constant.USER_NUM).toString())); Demande demToReturn = service.save(demande); - return builder.buildDto(demToReturn, type); + return builder.buildDemandeDto(demToReturn, type); } /** @@ -133,7 +133,7 @@ public DemandeWebDto supprimerAvecConservationEnBase(@RequestParam("type") TYPE_ ILigneFichierService ligneFichierService = strategy.getStrategy(ILigneFichierService.class, type); Demande demande = service.findById(numDemande); ligneFichierService.deleteByDemande(demande); - return builder.buildDto(service.changeStateCanceled(demande, Constant.ETATDEM_SUPPRIMEE), type); + return builder.buildDemandeDto(service.changeStateCanceled(demande, Constant.ETATDEM_SUPPRIMEE), type); } @@ -154,7 +154,7 @@ public DemandeWebDto save(@PathVariable("id") Integer id, @RequestParam("dem") D checkAccessToServices.autoriserAccesDemandeParIln(id, request.getAttribute(Constant.USER_NUM).toString(), type); dem.setNumDemande(id); IDemandeService service = strategy.getStrategy(IDemandeService.class, type); - return builder.buildDto(service.save(dem), type); + return builder.buildDemandeDto(service.save(dem), type); } @@ -169,7 +169,7 @@ public String getTypeExemplarisationDemande(@PathVariable("id") Integer id, Http @PostMapping(value = "/majTypeExemp/{id}") public DemandeWebDto majTypeExemp(@PathVariable("id") Integer id, @RequestParam("type") Integer type, HttpServletRequest request) throws UserExistException, ForbiddenException { checkAccessToServices.autoriserAccesDemandeParIln(id, request.getAttribute(Constant.USER_NUM).toString(), TYPE_DEMANDE.EXEMP); - return builder.buildDto(demandeExempService.majTypeExemp(id, type), TYPE_DEMANDE.EXEMP); + return builder.buildDemandeDto(demandeExempService.majTypeExemp(id, type), TYPE_DEMANDE.EXEMP); } @@ -248,7 +248,7 @@ public String[] simulerLigne(@RequestParam("type") TYPE_DEMANDE type, @RequestPa public DemandeWebDto passerEnAttente(@RequestParam("type") TYPE_DEMANDE type, @RequestParam("numDemande") Integer numDemande, HttpServletRequest request) throws DemandeCheckingException, UserExistException, ForbiddenException { checkAccessToServices.autoriserAccesDemandeParIln(numDemande, request.getAttribute(Constant.USER_NUM).toString(), type); IDemandeService service = strategy.getStrategy(IDemandeService.class, type); - return builder.buildDto(service.changeState(service.findById(numDemande), Constant.ETATDEM_ATTENTE), type); + return builder.buildDemandeDto(service.changeState(service.findById(numDemande), Constant.ETATDEM_ATTENTE), type); } /** @@ -269,7 +269,7 @@ public DemandeWebDto archiverDemande(@RequestParam("type") TYPE_DEMANDE type, @R DemandeCheckingException, UserExistException, ForbiddenException { checkAccessToServices.autoriserAccesDemandeParIln(numDemande, request.getAttribute(Constant.USER_NUM).toString(), type); IDemandeService service = strategy.getStrategy(IDemandeService.class, type); - return builder.buildDto(service.archiverDemande(service.findById(numDemande)), type); + return builder.buildDemandeDto(service.archiverDemande(service.findById(numDemande)), type); } /** @@ -291,7 +291,7 @@ public DemandeWebDto previousStep(@RequestParam("type") TYPE_DEMANDE type, @Path DemandeCheckingException, IOException, UserExistException, ForbiddenException { checkAccessToServices.autoriserAccesDemandeParIln(id, request.getAttribute(Constant.USER_NUM).toString(), type); IDemandeService service = strategy.getStrategy(IDemandeService.class, type); - return builder.buildDto(service.previousState(service.findById(id)), type); + return builder.buildDemandeDto(service.previousState(service.findById(id)), type); } /** @@ -310,7 +310,7 @@ public DemandeWebDto chosenStep(@RequestParam("type") TYPE_DEMANDE type, @PathVa DemandeCheckingException, UserExistException, ForbiddenException { checkAccessToServices.autoriserAccesDemandeParIln(id, request.getAttribute(Constant.USER_NUM).toString(), type); IDemandeService service = strategy.getStrategy(IDemandeService.class, type); - return builder.buildDto(service.returnState(etape, service.findById(id)), type); + return builder.buildDemandeDto(service.returnState(etape, service.findById(id)), type); } /** diff --git a/web/src/main/java/fr/abes/item/web/UtilisateurRestService.java b/web/src/main/java/fr/abes/item/web/UtilisateurRestService.java index b691b614..568b216b 100644 --- a/web/src/main/java/fr/abes/item/web/UtilisateurRestService.java +++ b/web/src/main/java/fr/abes/item/web/UtilisateurRestService.java @@ -3,6 +3,8 @@ import fr.abes.item.core.entities.item.Utilisateur; import fr.abes.item.core.exception.ForbiddenException; import fr.abes.item.core.service.UtilisateurService; +import fr.abes.item.dto.DtoBuilder; +import fr.abes.item.dto.UtilisateurWebDto; import fr.abes.item.security.CheckAccessToServices; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; @@ -13,22 +15,29 @@ public class UtilisateurRestService { private final UtilisateurService utilisateurService; private final CheckAccessToServices checkAccessToServices; - public UtilisateurRestService(UtilisateurService utilisateurService, CheckAccessToServices checkAccessToServices) { + private final DtoBuilder builder; + + public UtilisateurRestService(UtilisateurService utilisateurService, CheckAccessToServices checkAccessToServices, DtoBuilder builder) { this.utilisateurService = utilisateurService; this.checkAccessToServices = checkAccessToServices; + this.builder = builder; } /** * Webservice de sauvegarde d'un utilisateur via méthode PUT * @param id : identifiant de l'utilisateur à modifier - * @param util : utilisateur modifié + * @param email : adresse mail de l'utilisateur à modifier * @return l'utilisateur sauvegardé */ - @PutMapping(value="/utilisateurs/{id}") + @PostMapping(value="/utilisateurs/{id}") @Operation(summary = "permet de mettre à jour les données de l'utilisateur (adresse mail)") - public Utilisateur save(@PathVariable Integer id, @RequestBody Utilisateur util, HttpServletRequest request) throws ForbiddenException { + public UtilisateurWebDto save(@PathVariable("id") Integer id, @RequestBody String email, HttpServletRequest request) throws ForbiddenException { checkAccessToServices.autoriserMajUtilisateurParUserNum(id, request.getAttribute("userNum").toString()); - util.setNumUser(id); - return utilisateurService.save(util); + Utilisateur utilisateur = utilisateurService.findById(id); + if (utilisateur != null) { + utilisateur.setEmail(email); + return builder.buildUtilisateurDto(utilisateurService.save(utilisateur)); + } + throw new IllegalArgumentException("Utilisateur inexistant"); } } diff --git a/web/src/test/java/fr/abes/item/web/impl/UtilisateurRestServiceTest.java b/web/src/test/java/fr/abes/item/web/impl/UtilisateurRestServiceTest.java new file mode 100644 index 00000000..7d542dfd --- /dev/null +++ b/web/src/test/java/fr/abes/item/web/impl/UtilisateurRestServiceTest.java @@ -0,0 +1,81 @@ +package fr.abes.item.web.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.abes.item.core.entities.item.Utilisateur; +import fr.abes.item.core.exception.ForbiddenException; +import fr.abes.item.core.service.UtilisateurService; +import fr.abes.item.dto.DtoBuilder; +import fr.abes.item.exception.RestResponseEntityExceptionHandler; +import fr.abes.item.security.CheckAccessToServices; +import fr.abes.item.web.UtilisateurRestService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import java.nio.charset.StandardCharsets; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest(classes = {UtilisateurRestService.class, DtoBuilder.class, ObjectMapper.class}) +public class UtilisateurRestServiceTest { + @Autowired + WebApplicationContext context; + @InjectMocks + UtilisateurRestService controller; + @MockBean + UtilisateurService service; + @MockBean + CheckAccessToServices checkAccessToServices; + @Autowired + DtoBuilder builder; + @Autowired + ObjectMapper mapper; + MockMvc mockMvc; + + @BeforeEach + void init() { + this.mockMvc = MockMvcBuilders.standaloneSetup(context.getBean(UtilisateurRestService.class)).setControllerAdvice(new RestResponseEntityExceptionHandler()).build(); + } + + @Test + void testSaveUtilisateur() throws Exception { + Mockito.doNothing().when(checkAccessToServices).autoriserMajUtilisateurParUserNum(1, "1"); + Utilisateur utilisateur = new Utilisateur(1, "", "1"); + Mockito.when(service.findById(1)).thenReturn(utilisateur); + Utilisateur utilisateurSaved = new Utilisateur(1, "test@test.com", "1"); + Mockito.when(service.save(Mockito.any())).thenReturn(utilisateurSaved); + + this.mockMvc.perform(post("/api/v1/utilisateurs/1").content("test@test.com").requestAttr("userNum", "1") + .contentType(MediaType.APPLICATION_JSON_VALUE).characterEncoding(StandardCharsets.UTF_8)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.userId").value("1")) + .andExpect(jsonPath("$.email").value("test@test.com")); + } + + @Test + void testSaveUtilisateurForbidden() throws Exception { + Mockito.doThrow(ForbiddenException.class).when(checkAccessToServices).autoriserMajUtilisateurParUserNum(1, "1"); + this.mockMvc.perform(post("/api/v1/utilisateurs/1").content("test@test.com").requestAttr("userNum", "1") + .contentType(MediaType.APPLICATION_JSON_VALUE).characterEncoding(StandardCharsets.UTF_8)) + .andExpect(status().isForbidden()); + } + + @Test + void testSaveUtilisateurNoUser() throws Exception { + Mockito.doNothing().when(checkAccessToServices).autoriserMajUtilisateurParUserNum(1, "1"); + Mockito.when(service.findById(1)).thenReturn(null); + this.mockMvc.perform(post("/api/v1/utilisateurs/1").content("test@test.com").requestAttr("userNum", "1") + .contentType(MediaType.APPLICATION_JSON_VALUE).characterEncoding(StandardCharsets.UTF_8)) + .andExpect(status().isBadRequest()); + } +}