diff --git a/gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/GmsClient.java b/gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/GmsClient.java index 304df22c334f1d71a1cdc0225e27e69db1f1cbdb..5560987fc83dda6f25543dea6e9f515edb833eb8 100644 --- a/gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/GmsClient.java +++ b/gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/GmsClient.java @@ -98,8 +98,8 @@ public class GmsClient extends BaseClient { }).orElse(super.getInvalidStatusCodeExceptionMessage(request, response)); } - public List<String> listGroups(String prefix) { - return new ListGroupsCall(this).listGroups(prefix); + public List<String> listGroups(String prefix, boolean recursive) { + return new ListGroupsCall(this).listGroups(prefix, recursive); } public List<String> getUserGroups(String userId) { diff --git a/gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/call/ListGroupsCall.java b/gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/call/ListGroupsCall.java index 2c3123ef896e211fe76c41fec92224d5030620c6..f032d9c0eb5b9c19cef20c4b5e22a3c992e8358c 100644 --- a/gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/call/ListGroupsCall.java +++ b/gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/call/ListGroupsCall.java @@ -19,14 +19,15 @@ public class ListGroupsCall extends BaseCall<GmsClient> { * the privileges to see that information). The prefix is removed by the * service. */ - public List<String> listGroups(String prefix) { + public List<String> listGroups(String prefix, boolean recursive) { List<String> groups = new ArrayList<>(); - String uri = "ws/jwt/list"; + String uri = "list"; if (prefix != null && !prefix.isBlank()) { uri += "/" + prefix; } + uri += "?recursive=" + recursive; HttpRequest groupsRequest = client.newRequest(uri) .header("Accept", "text/plain") diff --git a/gms-client/gms-client/src/test/java/it/inaf/ia2/gms/client/call/GetUserGroupsTest.java b/gms-client/gms-client/src/test/java/it/inaf/ia2/gms/client/call/GetUserGroupsTest.java index 3b2dee689ffc556752cb0af3027803482f97d130..d7cde9f6d28bd9aeb13c2fb1c46eb6fa9928de7e 100644 --- a/gms-client/gms-client/src/test/java/it/inaf/ia2/gms/client/call/GetUserGroupsTest.java +++ b/gms-client/gms-client/src/test/java/it/inaf/ia2/gms/client/call/GetUserGroupsTest.java @@ -50,9 +50,9 @@ public class GetUserGroupsTest extends BaseGmsClientTest { CompletableFuture response = CompletableFuture.completedFuture(getMockedStreamResponse(200, body)); when(httpClient.sendAsync(any(), any())).thenReturn(response); - List<String> groups = gmsClient.listGroups("LBT."); + List<String> groups = gmsClient.listGroups("LBT.", false); - verify(httpClient, times(1)).sendAsync(endpointEq("GET", "ws/jwt/list/LBT."), any()); + verify(httpClient, times(1)).sendAsync(endpointEq("GET", "list/LBT.?recursive=false"), any()); assertEquals(2, groups.size()); assertEquals("INAF", groups.get(0)); diff --git a/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java b/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java index e675daa0c2c30c0d1aa633bb79ca9fabdc0ea532..983e8746daedf0f22b111f1417ead22eb8eb76d5 100644 --- a/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java +++ b/gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java @@ -136,14 +136,21 @@ public class JWTWebServiceController { // else: empty response (as defined by GMS standard) } - @GetMapping(value = {"/ws/jwt/list/{group:.+}", "/ws/jwt/list"}, produces = MediaType.TEXT_PLAIN_VALUE) - public void listGroups(@PathVariable("group") Optional<String> groupNames, Principal principal, HttpServletResponse response) throws IOException { + @GetMapping(value = {"/ws/jwt/list/{group:.+}", "/ws/jwt/list", "/list"}, produces = MediaType.TEXT_PLAIN_VALUE) + public void listGroups(@PathVariable("group") Optional<String> groupNames, + @RequestParam(value = "recursive", defaultValue = "false") boolean recursive, + Principal principal, HttpServletResponse response) throws IOException { String userId = principal.getName(); GroupEntity parentGroup = groupNameService.getGroupFromNames(groupNames); - List<GroupEntity> allSubGroups = groupsDAO.getDirectSubGroups(parentGroup.getPath()); + List<GroupEntity> allSubGroups; + if (recursive) { + allSubGroups = groupsDAO.getAllChildren(parentGroup.getPath()); + } else { + allSubGroups = groupsDAO.getDirectSubGroups(parentGroup.getPath()); + } // Select only the groups visible to the user List<PermissionEntity> permissions = permissionsDAO.findUserPermissions(userId);