diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListController.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListController.java index 4c4d085f99b2945c199416201739a3ecb7e3b978..39fb584fd055d8237c040c4280b3f45598f20786 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListController.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListController.java @@ -2,8 +2,10 @@ package ntnu.idatt2016.v233.SmartMat.controller; import java.util.Optional; +import ntnu.idatt2016.v233.SmartMat.dto.enums.Authority; import ntnu.idatt2016.v233.SmartMat.entity.product.Product; import ntnu.idatt2016.v233.SmartMat.entity.user.User; +import ntnu.idatt2016.v233.SmartMat.service.group.GroupService; import ntnu.idatt2016.v233.SmartMat.service.product.ProductService; import ntnu.idatt2016.v233.SmartMat.service.user.UserService; import org.springframework.beans.factory.annotation.Autowired; @@ -35,17 +37,22 @@ public class ShoppingListController { UserService userService; + GroupService groupService; + /** * Gets a shopping list by its ID * * @param id the shopping list ID - * @return the shopping list, or an error if the ID is invalid + * @return the shopping list, or an error if the ID is invalid, + * or the user dose not have the rights to edit the shopping list */ @GetMapping("/{id}") public ResponseEntity<ShoppingList> getShoppingListById(@PathVariable("id") long id, Authentication auth) { - shoppingListService.isUserInShoppinglist(id, auth.getName()); + if(!shoppingListService.isUserInShoppinglist(id, auth.getName()) && + auth.getAuthorities().stream().noneMatch(role -> role.getAuthority().equals(Authority.ADMIN.name()))) + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); Optional<ShoppingList> shoppingList = shoppingListService.getShoppingListById(id); return shoppingList.map(list -> ResponseEntity.status(HttpStatus.OK).body(list)) @@ -59,7 +66,11 @@ public class ShoppingListController { * @return the shopping list, or an error if the ID is invalid */ @GetMapping("/group/{groupId}") - public ResponseEntity<ShoppingList> getAllShoppingListsByGroupId(@PathVariable("groupId") long id) { + public ResponseEntity<ShoppingList> getAllShoppingListsByGroupId(@PathVariable("groupId") long id, Authentication auth) { + if(!groupService.isUserAssociatedWithGroup(auth.getName(), id) && + auth.getAuthorities().stream().noneMatch(role -> role.getAuthority().equals(Authority.ADMIN.name()))) + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + Optional<ShoppingList> shoppingList = shoppingListService.getShoppingListByGroupId(id); return shoppingList.map(list -> ResponseEntity.status(HttpStatus.OK).body(list)) .orElseGet(() -> ResponseEntity.status(HttpStatus.NOT_FOUND).build()); @@ -76,6 +87,10 @@ public class ShoppingListController { public ResponseEntity<?> addItemToShoppingList(@PathVariable("shoppingListId") long shoppingListId, @PathVariable("ean") String ean, Authentication auth){ + if(!shoppingListService.isUserInShoppinglist(shoppingListId, auth.getName()) && + auth.getAuthorities().stream().noneMatch(role -> role.getAuthority().equals(Authority.ADMIN.name()))) + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + Optional<ShoppingList> shoppingList = shoppingListService.getShoppingListById(shoppingListId); if(shoppingList.isEmpty()) @@ -125,7 +140,13 @@ public class ShoppingListController { */ @DeleteMapping("/removeProduct/{shoppingListId}/{ean}") public ResponseEntity<ShoppingList> removeProductFromShoppingList(@PathVariable("shoppingListId") String shoppingListId, - @PathVariable("ean") String ean) { + @PathVariable("ean") String ean, Authentication auth) { + + if(!shoppingListService.isUserInShoppinglist(Long.parseLong(shoppingListId), auth.getName()) && + auth.getAuthorities().stream().noneMatch(role -> role.getAuthority().equals(Authority.ADMIN.name()))) + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); + + Optional<ShoppingList> shoppingList = shoppingListService.getShoppingListById(Long.parseLong(shoppingListId)); if(shoppingList.isEmpty()) return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListControllerTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListControllerTest.java index cf325eb32a5f09e644ba684497e82bb5c36652d1..c0a48ec5aceaf581ec41fde5e55ac22bb7770cd0 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListControllerTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/ShoppingListControllerTest.java @@ -3,7 +3,12 @@ package ntnu.idatt2016.v233.SmartMat.controller; import ntnu.idatt2016.v233.SmartMat.dto.enums.Authority; import ntnu.idatt2016.v233.SmartMat.dto.request.ShoppingListRequest; import ntnu.idatt2016.v233.SmartMat.entity.ShoppingList; +import ntnu.idatt2016.v233.SmartMat.entity.group.Group; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupAsso; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupId; +import ntnu.idatt2016.v233.SmartMat.entity.user.User; import ntnu.idatt2016.v233.SmartMat.service.ShoppingListService; +import ntnu.idatt2016.v233.SmartMat.service.group.GroupService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -32,6 +37,9 @@ public class ShoppingListControllerTest { @Mock private ShoppingListService shoppingListService; + @Mock + private GroupService groupService; + private ShoppingList shoppingList; private final Authentication regularUser = new Authentication() { @@ -111,6 +119,28 @@ public class ShoppingListControllerTest { @BeforeEach public void setUp() { shoppingList = new ShoppingList(); + Group group = Group.builder() + .groupId(1) + .build(); + + User user = User.builder() + .username(regularUser.getName()) + .build(); + + UserGroupAsso userGroupAsso = UserGroupAsso.builder() + .id(new UserGroupId(user.getUsername(), group.getGroupId())) + .user(user) + .group(group) + .groupAuthority("USER") + .build(); + + + group.addUser(userGroupAsso); + user.addGroup(userGroupAsso); + + shoppingList.setGroup(group); + + } @@ -140,7 +170,7 @@ public class ShoppingListControllerTest { long groupId = 1; when(shoppingListService.getShoppingListByGroupId(groupId)).thenReturn(Optional.of(shoppingList)); - ResponseEntity<ShoppingList> response = shoppingListController.getAllShoppingListsByGroupId(groupId); + ResponseEntity<ShoppingList> response = shoppingListController.getAllShoppingListsByGroupId(groupId, adminUser); assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(shoppingList, response.getBody()); @@ -151,8 +181,32 @@ public class ShoppingListControllerTest { long groupId = 1; when(shoppingListService.getShoppingListByGroupId(groupId)).thenReturn(Optional.empty()); - ResponseEntity<ShoppingList> response = shoppingListController.getAllShoppingListsByGroupId(groupId); + ResponseEntity<ShoppingList> response = shoppingListController.getAllShoppingListsByGroupId(groupId, adminUser); assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); } + + @Test + public void getAllShoppingListsByGroupId_foundReg() { + long groupId = 1; + when(shoppingListService.getShoppingListByGroupId(groupId)).thenReturn(Optional.of(shoppingList)); + when(groupService.isUserAssociatedWithGroup(regularUser.getName(), groupId)).thenReturn(true); + + ResponseEntity<ShoppingList> response = shoppingListController.getAllShoppingListsByGroupId(groupId, regularUser); + + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertEquals(shoppingList, response.getBody()); + } + + @Test + public void getAllShoppingListsByGroupId_notFoundReg() { + long groupId = 1; + when(shoppingListService.getShoppingListByGroupId(groupId)).thenReturn(Optional.empty()); + when(groupService.isUserAssociatedWithGroup(regularUser.getName(), groupId)).thenReturn(true); + + ResponseEntity<ShoppingList> response = shoppingListController.getAllShoppingListsByGroupId(groupId, regularUser); + + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + } + } diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupServiceTest.java index 468e49e66e85a7d80f2d5efc2727a79e76ea410d..d6ab5af0029f352ecb7dee9055380513eb98251b 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupServiceTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupServiceTest.java @@ -2,9 +2,13 @@ package ntnu.idatt2016.v233.SmartMat.service.group; import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge; import ntnu.idatt2016.v233.SmartMat.entity.group.Group; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupAsso; +import ntnu.idatt2016.v233.SmartMat.entity.group.UserGroupId; +import ntnu.idatt2016.v233.SmartMat.entity.user.User; import ntnu.idatt2016.v233.SmartMat.repository.ShoppingListRepository; import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeRepository; import ntnu.idatt2016.v233.SmartMat.repository.group.GroupRepository; +import ntnu.idatt2016.v233.SmartMat.repository.group.UserGroupAssoRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -15,6 +19,7 @@ import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.*; public class GroupServiceTest { @@ -25,6 +30,9 @@ public class GroupServiceTest { @Mock private FridgeRepository fridgeRepository; + @Mock + private UserGroupAssoRepository userGroupAssoRepository; + @Mock private ShoppingListRepository shoppingListRepository; @@ -97,4 +105,37 @@ public class GroupServiceTest { verify(groupRepository).save(group); verify(fridgeRepository).save(fridge); } + + @Test + void isUserAssosiatedWithGroup(){ + // Arrange + long userId = 1L; + long groupId = 2L; + Group group = new Group(); + group.setGroupId(groupId); + User user = User.builder() + .username("test") + .build(); + + UserGroupAsso userGroupAsso = UserGroupAsso.builder() + .id(UserGroupId.builder() + .groupId(groupId) + .username("test") + .build()) + .user(user) + .group(group) + .build(); + + group.addUser(userGroupAsso); + user.addGroup(userGroupAsso); + + when(userGroupAssoRepository.findById(userGroupAsso.getId())).thenReturn(Optional.of(userGroupAsso)); + + // Act + boolean result = groupService.isUserAssociatedWithGroup(user.getUsername(), groupId); + + // Assert + assertTrue(result); + verify(userGroupAssoRepository).findById(userGroupAsso.getId()); + } }