From f5a2a9a36016bb057a6210ed47027a3f1a4ee5da Mon Sep 17 00:00:00 2001 From: Mats Lading <mjlading@stud.ntnu.no> Date: Fri, 28 Apr 2023 09:17:38 +0200 Subject: [PATCH 1/4] docs: create household cannot have 409 response, since the id is auto generated --- docs/swagger.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index f920880..8c512b5 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -241,8 +241,6 @@ paths: application/json: schema: $ref: '#/components/schemas/Household' - '409': - description: Household already exists /household/{id}/users: get: tags: -- GitLab From dd6760fbfe8d90428af501c0f59887eb742a853a Mon Sep 17 00:00:00 2001 From: Mats Lading <mjlading@stud.ntnu.no> Date: Fri, 28 Apr 2023 09:23:01 +0200 Subject: [PATCH 2/4] fix: return NO_CONTENT code in deleteHousehold method --- .../java/no/freshify/api/controller/HouseholdController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/no/freshify/api/controller/HouseholdController.java b/api/src/main/java/no/freshify/api/controller/HouseholdController.java index 0e36bc1..cf58907 100644 --- a/api/src/main/java/no/freshify/api/controller/HouseholdController.java +++ b/api/src/main/java/no/freshify/api/controller/HouseholdController.java @@ -72,7 +72,7 @@ public class HouseholdController { long idToDelete = householdService.findHouseholdByHouseholdId(householdId).getId(); householdService.removeHousehold(idToDelete); logger.info("Removed household"); - return ResponseEntity.ok("Operation successful"); + return ResponseEntity.status(HttpStatus.NO_CONTENT).body("Operation successful"); } /** -- GitLab From 275488c9db3b90778d8c21db3d2c223e5058d5ea Mon Sep 17 00:00:00 2001 From: Mats Lading <mjlading@stud.ntnu.no> Date: Fri, 28 Apr 2023 09:57:47 +0200 Subject: [PATCH 3/4] feat: when getting users in a household, the requester must be a member of the household --- .../freshify/api/controller/HouseholdController.java | 8 ++++++-- .../freshify/api/service/HouseholdMemberService.java | 10 ++++++++++ .../api/controller/HouseholdControllerTest.java | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/no/freshify/api/controller/HouseholdController.java b/api/src/main/java/no/freshify/api/controller/HouseholdController.java index cf58907..e20b9de 100644 --- a/api/src/main/java/no/freshify/api/controller/HouseholdController.java +++ b/api/src/main/java/no/freshify/api/controller/HouseholdController.java @@ -9,6 +9,7 @@ import no.freshify.api.model.dto.HouseholdMemberDTO; import no.freshify.api.model.mapper.HouseholdMapper; import no.freshify.api.model.mapper.HouseholdMemberMapper; import no.freshify.api.security.AuthenticationService; +import no.freshify.api.service.HouseholdMemberService; import no.freshify.api.service.HouseholdService; import org.mapstruct.factory.Mappers; @@ -19,6 +20,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import java.nio.file.AccessDeniedException; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -29,6 +31,7 @@ import java.util.Set; public class HouseholdController { private final HouseholdService householdService; private final AuthenticationService authenticationService; + private final HouseholdMemberService householdMemberService; private final HouseholdMapper householdMapper = Mappers.getMapper(HouseholdMapper.class); private final HouseholdMemberMapper householdMemberMapper = Mappers.getMapper(HouseholdMemberMapper.class); @@ -86,12 +89,13 @@ public class HouseholdController { return ResponseEntity.ok(householdMapper.toHouseholdDTO(householdService.findHouseholdByHouseholdId(householdId))); } - //TODO Remember to add authentication logic and verify/enforce access privileges before processing request /** - * Gets the users in a given household + * Gets the users in a given household. Can only be done by a user in the household. * @param householdId The household to get users from * @return A list of users in the given household + * @throws HouseholdNotFoundException If the household was not found */ + @PreAuthorize("hasPermission(#householdId, 'Household', '')") @GetMapping("/{id}/users") public ResponseEntity<List<HouseholdMemberDTO>> getUsers(@PathVariable("id") long householdId) throws HouseholdNotFoundException { diff --git a/api/src/main/java/no/freshify/api/service/HouseholdMemberService.java b/api/src/main/java/no/freshify/api/service/HouseholdMemberService.java index 93bb079..4e275cf 100644 --- a/api/src/main/java/no/freshify/api/service/HouseholdMemberService.java +++ b/api/src/main/java/no/freshify/api/service/HouseholdMemberService.java @@ -3,14 +3,18 @@ package no.freshify.api.service; import lombok.RequiredArgsConstructor; import no.freshify.api.exception.HouseholdMemberAlreadyExistsException; import no.freshify.api.exception.UserDoesNotBelongToHouseholdException; +import no.freshify.api.model.Household; import no.freshify.api.model.HouseholdMember; import no.freshify.api.model.HouseholdMemberKey; +import no.freshify.api.model.User; import no.freshify.api.repository.HouseholdMemberRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Objects; +import java.util.Set; @Service @RequiredArgsConstructor @@ -52,4 +56,10 @@ public class HouseholdMemberService { public void removeHouseholdMember(HouseholdMember householdMember) { householdMemberRepository.delete(householdMember); } + + public boolean userExistsInHousehold(User loggedInUser, Household household) { + Set<HouseholdMember> members = loggedInUser.getHouseholdMembers(); + return members.stream() + .anyMatch(o -> o.getHousehold().getId().equals(household.getId())); + } } diff --git a/api/src/test/java/no/freshify/api/controller/HouseholdControllerTest.java b/api/src/test/java/no/freshify/api/controller/HouseholdControllerTest.java index 0fc41ef..1e87db4 100644 --- a/api/src/test/java/no/freshify/api/controller/HouseholdControllerTest.java +++ b/api/src/test/java/no/freshify/api/controller/HouseholdControllerTest.java @@ -138,7 +138,7 @@ public class HouseholdControllerTest { when(householdService.findHouseholdByHouseholdId(householdId)).thenReturn(household); doNothing().when(householdService).removeHousehold(anyLong()); mockMvc.perform(delete("/household/{id}", householdId)) - .andExpect(status().isOk()); + .andExpect(status().isNoContent()); verify(householdService, VerificationModeFactory.times(1)).removeHousehold(anyLong()); verify(householdService, VerificationModeFactory.times(1)).findHouseholdByHouseholdId(Mockito.any()); -- GitLab From bd1aeab628f17b0d512bffcb76bea213b5d37016 Mon Sep 17 00:00:00 2001 From: Mats Lading <mjlading@stud.ntnu.no> Date: Fri, 28 Apr 2023 10:04:34 +0200 Subject: [PATCH 4/4] refac: remove household id field from HouseholdDTO --- api/src/main/java/no/freshify/api/model/dto/HouseholdDTO.java | 1 - .../no/freshify/api/controller/HouseholdControllerTest.java | 3 --- .../no/freshify/api/controller/ShoppingListControllerTest.java | 1 - 3 files changed, 5 deletions(-) diff --git a/api/src/main/java/no/freshify/api/model/dto/HouseholdDTO.java b/api/src/main/java/no/freshify/api/model/dto/HouseholdDTO.java index 9d7cf05..7b1ba35 100644 --- a/api/src/main/java/no/freshify/api/model/dto/HouseholdDTO.java +++ b/api/src/main/java/no/freshify/api/model/dto/HouseholdDTO.java @@ -6,6 +6,5 @@ import lombok.Setter; @Getter @Setter public class HouseholdDTO { - private Long id; private String name; } diff --git a/api/src/test/java/no/freshify/api/controller/HouseholdControllerTest.java b/api/src/test/java/no/freshify/api/controller/HouseholdControllerTest.java index 1e87db4..a8dcfaa 100644 --- a/api/src/test/java/no/freshify/api/controller/HouseholdControllerTest.java +++ b/api/src/test/java/no/freshify/api/controller/HouseholdControllerTest.java @@ -90,7 +90,6 @@ public class HouseholdControllerTest { household.setName("Test Household"); householdDTO = new HouseholdDTO(); - householdDTO.setId(householdId); householdDTO.setName("Test Household"); HouseholdMember householdMember = new HouseholdMember(); @@ -151,7 +150,6 @@ public class HouseholdControllerTest { mockMvc.perform(get("/household/{id}", householdId)) .andExpect(status().isOk()) - .andExpect(jsonPath("$.id", is(householdId.intValue()))) .andExpect(jsonPath("$.name", is(household.getName()))); verify(householdService, VerificationModeFactory.times(1)).findHouseholdByHouseholdId(anyLong()); @@ -171,7 +169,6 @@ public class HouseholdControllerTest { public void updateHouseholdTest() throws Exception { HouseholdDTO household = new HouseholdDTO(); household.setName("New Household Name"); - household.setId(1L); when(householdService.findHouseholdByHouseholdId(anyLong())).thenReturn(this.household); when(householdService.updateHousehold(any(Household.class))).thenReturn(this.household); diff --git a/api/src/test/java/no/freshify/api/controller/ShoppingListControllerTest.java b/api/src/test/java/no/freshify/api/controller/ShoppingListControllerTest.java index aeaf603..9546cc2 100644 --- a/api/src/test/java/no/freshify/api/controller/ShoppingListControllerTest.java +++ b/api/src/test/java/no/freshify/api/controller/ShoppingListControllerTest.java @@ -108,7 +108,6 @@ public class ShoppingListControllerTest { household.setName("Test Household"); householdDTO = new HouseholdDTO(); - householdDTO.setId(householdId); householdDTO.setName("Test Household"); HouseholdMember householdMember = new HouseholdMember(); -- GitLab