diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/GroupController.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/GroupController.java index 356e8000e76d093054efb2235c197fd28cd7bd18..20d87eac40604cc4cb13cf966e08def340c27523 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/GroupController.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/GroupController.java @@ -92,7 +92,7 @@ public class GroupController { createdGroup.addUser(UserGroupAsso.builder() .id(userGroupId) - .primaryGroup(false) + .primaryGroup(true) .groupAuthority("ADMIN") .group(createdGroup) .user(user) @@ -178,28 +178,46 @@ public class GroupController { * Handles the HTTP PUT request to change the primary group of a user. * * @param username the username of the user whose primary group is to be changed - * @param groupId the ID of the group + * @param newPrimaryGroupId the ID of the new primary group * @return a ResponseEntity object containing an HTTP status code and the updated UserGroupAsso object, * or a ResponseEntity object with an HTTP status code indicating that the request was not successful */ - @PutMapping("/markNewPrimary/{username}/{groupId}/{newId}") + @PutMapping("/markNewPrimary/{username}/{newPrimaryGroupId}") public ResponseEntity<?> markNewPrimaryGroup(@PathVariable("username") String username, - @PathVariable("groupId") long groupId){ - return userService.getUserFromUsername(username) - .flatMap(user ->{ - user.getGroup().forEach(userGroupAsso -> { - if(userGroupAsso.getGroup().getGroupId() != groupId){ - userGroupAsso.setPrimaryGroup(false); - } - if(userGroupAsso.getGroup().getGroupId() == groupId){ - userGroupAsso.setPrimaryGroup(true); - } - }); - return Optional.of(userService.updateUser(user)); - } - ) - .map(ResponseEntity::ok) - .orElseGet(() -> ResponseEntity.notFound().build()); + @PathVariable("newPrimaryGroupId") long newPrimaryGroupId) { + Optional<User> optionalUser = userService.getUserFromUsername(username); + + if (optionalUser.isEmpty()) { + return ResponseEntity.badRequest().body("Invalid username."); + } + + User user = optionalUser.get(); + + Optional<UserGroupAsso> oldPrimaryOpt = groupService.findPrimaryUserGroupAssoForUser(username); + if (oldPrimaryOpt.isEmpty()) { + return ResponseEntity.badRequest().body("No primary group found for the user."); + } + + UserGroupAsso oldPrimary = oldPrimaryOpt.get(); + oldPrimary.setPrimaryGroup(false); + groupService.updateUserGroupAsso(oldPrimary); + + Optional<UserGroupAsso> newPrimaryOpt = groupService.getUserGroupAsso(username, newPrimaryGroupId); + if (newPrimaryOpt.isEmpty()) { + return ResponseEntity.badRequest().body("Invalid new primary group ID."); + } + + UserGroupAsso newPrimary = newPrimaryOpt.get(); + newPrimary.setPrimaryGroup(true); + groupService.updateUserGroupAsso(newPrimary); + + userService.updateUser(user); + + Map<String, Object> responseBody = new HashMap<>(); + responseBody.put("username", username); + responseBody.put("oldPrimaryGroupId", oldPrimary.getGroup().getGroupId()); + responseBody.put("newPrimaryGroupId", newPrimary.getGroup().getGroupId()); + return ResponseEntity.ok(responseBody); } /** diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepository.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepository.java index 1580965a7e73b07091c4abad6843da268bb83555..8e3c12e3d9a31db60e7262729b8fe06eebfb83ab 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepository.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/UserGroupAssoRepository.java @@ -53,6 +53,16 @@ public interface UserGroupAssoRepository extends JpaRepository<UserGroupAsso, Us /** * Finds UserGroupAsso by UserGroupId + * + * @param userGroupId the UserGroupId to find by + * @return an optional containing the UserGroupAsso if it exists */ Optional<UserGroupAsso> findByUserGroupId(UserGroupId userGroupId); + + /** + * Finds primary group for given user + * @param username the username of the user + * @return an optional containing the UserGroupAsso if it exists + */ + Optional<UserGroupAsso> findByUser_UsernameAndPrimaryGroupTrue(String username); } diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupService.java index 5091a87044deef6a1d8b0489386e212189664eda..5f0f2b8c8d3046f41e979f791b42db2b5eb9e917 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupService.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/GroupService.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import ntnu.idatt2016.v233.SmartMat.entity.ShoppingList; 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.repository.ShoppingListRepository; import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeRepository; @@ -179,4 +180,27 @@ public class GroupService { return userGroupAssoRepository.findById(userGroupId).isPresent(); } + + /** + * Updates a user group association + * + * @param userGroupAsso the user group association to update + * @return the updated user group association + */ + public UserGroupAsso updateUserGroupAsso(UserGroupAsso userGroupAsso) { + return userGroupAssoRepository.save(userGroupAsso); + } + + public Optional<UserGroupAsso> findPrimaryUserGroupAssoForUser(String username) { + return userGroupAssoRepository.findByUser_UsernameAndPrimaryGroupTrue(username); + } + + public Optional<UserGroupAsso> getUserGroupAsso(String username, Long groupId) { + UserGroupId userGroupId = UserGroupId.builder() + .username(username) + .groupId(groupId) + .build(); + + return userGroupAssoRepository.findById(userGroupId); + } }