Loading gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/GmsClient.java +3 −2 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ import it.inaf.ia2.gms.client.call.AddPermissionCall; import it.inaf.ia2.gms.client.call.CreateGroupCall; import it.inaf.ia2.gms.client.call.DeleteGroupCall; import it.inaf.ia2.gms.client.call.GetGroupPermissionsCall; import it.inaf.ia2.gms.client.call.GetGroupStatusCall; import it.inaf.ia2.gms.client.call.GetMemberEmailAddresses; import it.inaf.ia2.gms.client.call.GetUserGroupsCall; import it.inaf.ia2.gms.client.call.GetUserPermissionsCall; Loading Loading @@ -153,7 +154,7 @@ public class GmsClient extends BaseClient { return new GetMemberEmailAddresses(this).getMemberEmailAddresses(groupId, permission); } public Object call(HttpRequest groupsRequest, HttpResponse.BodyHandler<InputStream> ofInputStream) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. public List<String[]> getStatus(String groupCompleteName) { return new GetGroupStatusCall(this).getStatus(groupCompleteName); } } gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/call/GetGroupStatusCall.java 0 → 100644 +27 −0 Original line number Diff line number Diff line package it.inaf.ia2.gms.client.call; import it.inaf.ia2.client.BaseCall; import it.inaf.ia2.gms.client.GmsClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.List; public class GetGroupStatusCall extends BaseCall<GmsClient> { public GetGroupStatusCall(GmsClient client) { super(client); } public List<String[]> getStatus(String groupCompleteName) { String uri = "group/status?groupName=" + groupCompleteName; HttpRequest request = client.newRequest(uri) .header("Accept", "application/json") .GET() .build(); return client.call(request, HttpResponse.BodyHandlers.ofInputStream(), 200, in -> parseJsonList(in, String[].class)); } } gms-ui/src/components/GroupsBreadcrumb.vue +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ <span v-if="group.active">{{group.groupName}}</span> </li> </ol> <a v-if="currentGroup" :href="'group/status/' + currentGroup.groupId" :download="currentGroup.groupName + '.csv'" id="csv-status-download" title="Download CSV"> <a v-if="currentGroup" :href="'group/status?groupId=' + currentGroup.groupId" :download="currentGroup.groupName + '.csv'" id="csv-status-download" title="Download CSV"> <font-awesome-icon icon="download"></font-awesome-icon> </a> </nav> Loading gms/src/main/java/it/inaf/ia2/gms/controller/GroupsController.java +36 −6 Original line number Diff line number Diff line package it.inaf.ia2.gms.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.opencsv.CSVWriter; import it.inaf.ia2.gms.manager.GroupStatusManager; import it.inaf.ia2.gms.manager.GroupsManager; Loading @@ -12,9 +13,12 @@ import it.inaf.ia2.gms.model.request.GroupsRequest; import it.inaf.ia2.gms.model.request.RenameGroupRequest; import it.inaf.ia2.gms.model.request.SearchFilterRequest; import it.inaf.ia2.gms.persistence.model.GroupEntity; import it.inaf.ia2.gms.service.GroupNameService; import it.inaf.ia2.gms.service.GroupsTreeBuilder; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.List; import java.util.Optional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; Loading @@ -28,11 +32,14 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class GroupsController { private static final ObjectMapper MAPPER = new ObjectMapper(); @Autowired private HttpServletRequest servletRequest; Loading @@ -48,6 +55,9 @@ public class GroupsController { @Autowired private GroupStatusManager groupStatusManager; @Autowired private GroupNameService groupNameService; @GetMapping(value = "/groups", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<?> getGroupsTab(@Valid GroupsRequest request) { if (request.isOnlyPanel()) { Loading Loading @@ -93,18 +103,38 @@ public class GroupsController { return ResponseEntity.ok(groupsPanel); } @GetMapping(value = "/group/status/{groupId}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) public void downloadStatus(@PathVariable("groupId") String groupId, HttpServletResponse response) throws Exception { @GetMapping(value = "/group/status", produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE, MediaType.APPLICATION_JSON_VALUE}) public void downloadStatus(@RequestParam(value = "groupId", required = false) String groupId, @RequestParam(value = "groupName", required = false) String groupName, HttpServletRequest request, HttpServletResponse response) throws Exception { try ( OutputStream out = response.getOutputStream(); CSVWriter writer = new CSVWriter(new OutputStreamWriter(out))) { if (groupId == null && groupName == null) { response.sendError(400, "Parameter groupId or groupName is required"); return; } if (groupId == null) { GroupEntity group = groupNameService.getGroupFromNames(Optional.of(groupName)); groupId = group.getId(); } List<String[]> status = groupStatusManager.generateStatus(groupId); try ( OutputStream out = response.getOutputStream()) { if ("application/json".equals(request.getHeader("Accept"))) { MAPPER.writeValue(out, status); } else { try ( CSVWriter writer = new CSVWriter(new OutputStreamWriter(out))) { writer.writeNext(new String[]{"program", "email"}); for (String[] row : groupStatusManager.generateStatus(groupId)) { for (String[] row : status) { writer.writeNext(row); } } } } } private <T extends PaginatedModelRequest & SearchFilterRequest> PaginatedData<GroupNode> getGroupsPanel(GroupEntity parentGroup, T request) { return groupsTreeBuilder.listSubGroups(parentGroup, request, servletRequest.getUserPrincipal().getName()); Loading gms/src/main/java/it/inaf/ia2/gms/manager/GroupStatusManager.java +5 −8 Original line number Diff line number Diff line Loading @@ -6,7 +6,6 @@ import it.inaf.ia2.gms.persistence.GroupsDAO; import it.inaf.ia2.gms.persistence.MembershipsDAO; import it.inaf.ia2.gms.persistence.model.GroupEntity; import it.inaf.ia2.gms.persistence.model.MembershipEntity; import it.inaf.ia2.gms.service.GroupNameService; import it.inaf.ia2.gms.service.GroupsService; import it.inaf.ia2.rap.client.RapClient; import it.inaf.ia2.rap.data.RapUser; Loading Loading @@ -38,9 +37,6 @@ public class GroupStatusManager extends UserAwareComponent { @Autowired private MembershipsDAO membershipsDAO; @Autowired private GroupNameService groupNameService; @Autowired private RapClient rapClient; Loading @@ -50,14 +46,15 @@ public class GroupStatusManager extends UserAwareComponent { Permission groupPermission = permissionsManager.getCurrentUserPermission(parentGroup); if (groupPermission != Permission.ADMIN) { throw new UnauthorizedException("ADMIN permission is needed for performing this action"); if (Permission.includes(Permission.VIEW_MEMBERS, groupPermission)) { throw new UnauthorizedException("VIEW_MEMBERS permission is needed for performing this action"); } List<GroupEntity> groups = groupsDAO.getAllChildren(parentGroup.getPath()); groups.add(parentGroup); List<String> names = groupNameService.getGroupsNames(groups); Map<String, String> names = groupsDAO.getGroupCompleteNamesFromId(groups.stream() .map(g -> g.getId()).collect(Collectors.toSet())); List<MembershipEntity> memberships = membershipsDAO.findByGroups(groups.stream() .map(g -> g.getId()).collect(Collectors.toList())); Loading @@ -84,7 +81,7 @@ public class GroupStatusManager extends UserAwareComponent { for (int i = 0; i < groups.size(); i++) { GroupEntity group = groups.get(i); String groupName = names.get(i); String groupName = names.get(group.getId()); List<String> users = membersMap.get(group.getId()); if (users != null) { for (String userId : users) { Loading Loading
gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/GmsClient.java +3 −2 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ import it.inaf.ia2.gms.client.call.AddPermissionCall; import it.inaf.ia2.gms.client.call.CreateGroupCall; import it.inaf.ia2.gms.client.call.DeleteGroupCall; import it.inaf.ia2.gms.client.call.GetGroupPermissionsCall; import it.inaf.ia2.gms.client.call.GetGroupStatusCall; import it.inaf.ia2.gms.client.call.GetMemberEmailAddresses; import it.inaf.ia2.gms.client.call.GetUserGroupsCall; import it.inaf.ia2.gms.client.call.GetUserPermissionsCall; Loading Loading @@ -153,7 +154,7 @@ public class GmsClient extends BaseClient { return new GetMemberEmailAddresses(this).getMemberEmailAddresses(groupId, permission); } public Object call(HttpRequest groupsRequest, HttpResponse.BodyHandler<InputStream> ofInputStream) { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. public List<String[]> getStatus(String groupCompleteName) { return new GetGroupStatusCall(this).getStatus(groupCompleteName); } }
gms-client/gms-client/src/main/java/it/inaf/ia2/gms/client/call/GetGroupStatusCall.java 0 → 100644 +27 −0 Original line number Diff line number Diff line package it.inaf.ia2.gms.client.call; import it.inaf.ia2.client.BaseCall; import it.inaf.ia2.gms.client.GmsClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.List; public class GetGroupStatusCall extends BaseCall<GmsClient> { public GetGroupStatusCall(GmsClient client) { super(client); } public List<String[]> getStatus(String groupCompleteName) { String uri = "group/status?groupName=" + groupCompleteName; HttpRequest request = client.newRequest(uri) .header("Accept", "application/json") .GET() .build(); return client.call(request, HttpResponse.BodyHandlers.ofInputStream(), 200, in -> parseJsonList(in, String[].class)); } }
gms-ui/src/components/GroupsBreadcrumb.vue +1 −1 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ <span v-if="group.active">{{group.groupName}}</span> </li> </ol> <a v-if="currentGroup" :href="'group/status/' + currentGroup.groupId" :download="currentGroup.groupName + '.csv'" id="csv-status-download" title="Download CSV"> <a v-if="currentGroup" :href="'group/status?groupId=' + currentGroup.groupId" :download="currentGroup.groupName + '.csv'" id="csv-status-download" title="Download CSV"> <font-awesome-icon icon="download"></font-awesome-icon> </a> </nav> Loading
gms/src/main/java/it/inaf/ia2/gms/controller/GroupsController.java +36 −6 Original line number Diff line number Diff line package it.inaf.ia2.gms.controller; import com.fasterxml.jackson.databind.ObjectMapper; import com.opencsv.CSVWriter; import it.inaf.ia2.gms.manager.GroupStatusManager; import it.inaf.ia2.gms.manager.GroupsManager; Loading @@ -12,9 +13,12 @@ import it.inaf.ia2.gms.model.request.GroupsRequest; import it.inaf.ia2.gms.model.request.RenameGroupRequest; import it.inaf.ia2.gms.model.request.SearchFilterRequest; import it.inaf.ia2.gms.persistence.model.GroupEntity; import it.inaf.ia2.gms.service.GroupNameService; import it.inaf.ia2.gms.service.GroupsTreeBuilder; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.List; import java.util.Optional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; Loading @@ -28,11 +32,14 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class GroupsController { private static final ObjectMapper MAPPER = new ObjectMapper(); @Autowired private HttpServletRequest servletRequest; Loading @@ -48,6 +55,9 @@ public class GroupsController { @Autowired private GroupStatusManager groupStatusManager; @Autowired private GroupNameService groupNameService; @GetMapping(value = "/groups", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<?> getGroupsTab(@Valid GroupsRequest request) { if (request.isOnlyPanel()) { Loading Loading @@ -93,18 +103,38 @@ public class GroupsController { return ResponseEntity.ok(groupsPanel); } @GetMapping(value = "/group/status/{groupId}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) public void downloadStatus(@PathVariable("groupId") String groupId, HttpServletResponse response) throws Exception { @GetMapping(value = "/group/status", produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE, MediaType.APPLICATION_JSON_VALUE}) public void downloadStatus(@RequestParam(value = "groupId", required = false) String groupId, @RequestParam(value = "groupName", required = false) String groupName, HttpServletRequest request, HttpServletResponse response) throws Exception { try ( OutputStream out = response.getOutputStream(); CSVWriter writer = new CSVWriter(new OutputStreamWriter(out))) { if (groupId == null && groupName == null) { response.sendError(400, "Parameter groupId or groupName is required"); return; } if (groupId == null) { GroupEntity group = groupNameService.getGroupFromNames(Optional.of(groupName)); groupId = group.getId(); } List<String[]> status = groupStatusManager.generateStatus(groupId); try ( OutputStream out = response.getOutputStream()) { if ("application/json".equals(request.getHeader("Accept"))) { MAPPER.writeValue(out, status); } else { try ( CSVWriter writer = new CSVWriter(new OutputStreamWriter(out))) { writer.writeNext(new String[]{"program", "email"}); for (String[] row : groupStatusManager.generateStatus(groupId)) { for (String[] row : status) { writer.writeNext(row); } } } } } private <T extends PaginatedModelRequest & SearchFilterRequest> PaginatedData<GroupNode> getGroupsPanel(GroupEntity parentGroup, T request) { return groupsTreeBuilder.listSubGroups(parentGroup, request, servletRequest.getUserPrincipal().getName()); Loading
gms/src/main/java/it/inaf/ia2/gms/manager/GroupStatusManager.java +5 −8 Original line number Diff line number Diff line Loading @@ -6,7 +6,6 @@ import it.inaf.ia2.gms.persistence.GroupsDAO; import it.inaf.ia2.gms.persistence.MembershipsDAO; import it.inaf.ia2.gms.persistence.model.GroupEntity; import it.inaf.ia2.gms.persistence.model.MembershipEntity; import it.inaf.ia2.gms.service.GroupNameService; import it.inaf.ia2.gms.service.GroupsService; import it.inaf.ia2.rap.client.RapClient; import it.inaf.ia2.rap.data.RapUser; Loading Loading @@ -38,9 +37,6 @@ public class GroupStatusManager extends UserAwareComponent { @Autowired private MembershipsDAO membershipsDAO; @Autowired private GroupNameService groupNameService; @Autowired private RapClient rapClient; Loading @@ -50,14 +46,15 @@ public class GroupStatusManager extends UserAwareComponent { Permission groupPermission = permissionsManager.getCurrentUserPermission(parentGroup); if (groupPermission != Permission.ADMIN) { throw new UnauthorizedException("ADMIN permission is needed for performing this action"); if (Permission.includes(Permission.VIEW_MEMBERS, groupPermission)) { throw new UnauthorizedException("VIEW_MEMBERS permission is needed for performing this action"); } List<GroupEntity> groups = groupsDAO.getAllChildren(parentGroup.getPath()); groups.add(parentGroup); List<String> names = groupNameService.getGroupsNames(groups); Map<String, String> names = groupsDAO.getGroupCompleteNamesFromId(groups.stream() .map(g -> g.getId()).collect(Collectors.toSet())); List<MembershipEntity> memberships = membershipsDAO.findByGroups(groups.stream() .map(g -> g.getId()).collect(Collectors.toList())); Loading @@ -84,7 +81,7 @@ public class GroupStatusManager extends UserAwareComponent { for (int i = 0; i < groups.size(); i++) { GroupEntity group = groups.get(i); String groupName = names.get(i); String groupName = names.get(group.getId()); List<String> users = membersMap.get(group.getId()); if (users != null) { for (String userId : users) { Loading