From e2e7f5f9e3e19f900f58d8f7cf251b4756d48c6d Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 27 Nov 2025 17:27:07 +0100 Subject: [PATCH 1/2] Update store to handle nested `users` and `groups` response objects --- src/frontend/src/store/group.js | 2 +- src/frontend/src/store/users.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/store/group.js b/src/frontend/src/store/group.js index c3c2e35..f5ddf1a 100644 --- a/src/frontend/src/store/group.js +++ b/src/frontend/src/store/group.js @@ -18,7 +18,7 @@ export const useGroupStore = defineStore('group', { this.loading = true; const url = `${config.backendUrl}/groups`; const resp = await performRequest(this,'GET', url, null); - this.groups = resp.data; + this.groups = resp.data.groups; this.loading = false; } } diff --git a/src/frontend/src/store/users.js b/src/frontend/src/store/users.js index 9adc32c..9d48c3d 100644 --- a/src/frontend/src/store/users.js +++ b/src/frontend/src/store/users.js @@ -56,8 +56,8 @@ export const useUsersStore = defineStore('users', { }; this.loading = false; - this.empty = data.length === 0; - this.users = data; + this.empty = data.users.length === 0; + this.users = data.users; } } From 75bff6886a49cf7bcb162de2e3b5939a451878c1 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 27 Nov 2025 17:26:50 +0100 Subject: [PATCH 2/2] Switch `listGroups` and `listUsers` endpoints to use root objects --- .../lcc/controller/users/GroupController.java | 10 +++++++--- .../lcc/controller/users/UserController.java | 11 ++++++----- .../avatic/lcc/dto/users/GroupContainerDTO.java | 16 ++++++++++++++++ .../avatic/lcc/dto/users/UserContainerDTO.java | 16 ++++++++++++++++ 4 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 src/main/java/de/avatic/lcc/dto/users/GroupContainerDTO.java create mode 100644 src/main/java/de/avatic/lcc/dto/users/UserContainerDTO.java diff --git a/src/main/java/de/avatic/lcc/controller/users/GroupController.java b/src/main/java/de/avatic/lcc/controller/users/GroupController.java index 314ff35..c9af699 100644 --- a/src/main/java/de/avatic/lcc/controller/users/GroupController.java +++ b/src/main/java/de/avatic/lcc/controller/users/GroupController.java @@ -1,5 +1,6 @@ package de.avatic.lcc.controller.users; +import de.avatic.lcc.dto.users.GroupContainerDTO; import de.avatic.lcc.dto.users.GroupDTO; import de.avatic.lcc.repositories.pagination.SearchQueryResult; import de.avatic.lcc.service.users.GroupService; @@ -34,16 +35,19 @@ public class GroupController { */ @GetMapping({"/", ""}) @PreAuthorize("hasAnyRole('RIGHT-MANAGEMENT', 'SERVICE')") - public ResponseEntity> listGroups(@RequestParam(defaultValue = "20") @Min(1) int limit, - @RequestParam(defaultValue = "1") @Min(1) int page) { + public ResponseEntity listGroups(@RequestParam(defaultValue = "20") @Min(1) int limit, + @RequestParam(defaultValue = "1") @Min(1) int page) { SearchQueryResult groups = groupService.listGroups(page, limit); + var container = new GroupContainerDTO(); + container.setGroups(groups.toList()); + return ResponseEntity.ok() .header("X-Total-Count", String.valueOf(groups.getTotalElements())) .header("X-Page-Count", String.valueOf(groups.getTotalPages())) .header("X-Current-Page", String.valueOf(page)) - .body(groups.toList()); + .body(container); } } diff --git a/src/main/java/de/avatic/lcc/controller/users/UserController.java b/src/main/java/de/avatic/lcc/controller/users/UserController.java index 674f98c..6db709d 100644 --- a/src/main/java/de/avatic/lcc/controller/users/UserController.java +++ b/src/main/java/de/avatic/lcc/controller/users/UserController.java @@ -1,19 +1,17 @@ package de.avatic.lcc.controller.users; +import de.avatic.lcc.dto.users.UserContainerDTO; import de.avatic.lcc.dto.users.UserDTO; import de.avatic.lcc.repositories.pagination.SearchQueryResult; import de.avatic.lcc.service.users.UserService; import jakarta.validation.Valid; import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotNull; -import org.hibernate.validator.constraints.Length; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; import java.util.Optional; /** @@ -41,17 +39,20 @@ public class UserController { */ @GetMapping({"/", ""}) @PreAuthorize("hasRole('RIGHT-MANAGEMENT')") - public ResponseEntity> listUsers( + public ResponseEntity listUsers( @RequestParam(defaultValue = "20") @Min(1) int limit, @RequestParam(defaultValue = "1") @Min(1) int page) { SearchQueryResult users = userService.listUsers(page, limit); + var container = new UserContainerDTO(); + container.setUsers( users.toList()); + return ResponseEntity.ok() .header("X-Total-Count", String.valueOf(users.getTotalElements())) .header("X-Page-Count", String.valueOf(users.getTotalPages())) .header("X-Current-Page", String.valueOf(page)) - .body(users.toList()); + .body(container); } diff --git a/src/main/java/de/avatic/lcc/dto/users/GroupContainerDTO.java b/src/main/java/de/avatic/lcc/dto/users/GroupContainerDTO.java new file mode 100644 index 0000000..73db58e --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/users/GroupContainerDTO.java @@ -0,0 +1,16 @@ +package de.avatic.lcc.dto.users; + +import java.util.List; + +public class GroupContainerDTO { + + private List groups; + + public List getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } +} diff --git a/src/main/java/de/avatic/lcc/dto/users/UserContainerDTO.java b/src/main/java/de/avatic/lcc/dto/users/UserContainerDTO.java new file mode 100644 index 0000000..f8c694f --- /dev/null +++ b/src/main/java/de/avatic/lcc/dto/users/UserContainerDTO.java @@ -0,0 +1,16 @@ +package de.avatic.lcc.dto.users; + +import java.util.List; + +public class UserContainerDTO { + + private List users; + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } +}