Skip to content
Snippets Groups Projects
Commit 8d18a841 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Bugfix and improvements on groups status summary

parent 3a68a2f0
No related branches found
No related tags found
No related merge requests found
Pipeline #675 passed
...@@ -8,6 +8,7 @@ import it.inaf.ia2.gms.client.call.AddPermissionCall; ...@@ -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.CreateGroupCall;
import it.inaf.ia2.gms.client.call.DeleteGroupCall; import it.inaf.ia2.gms.client.call.DeleteGroupCall;
import it.inaf.ia2.gms.client.call.GetGroupPermissionsCall; 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.GetMemberEmailAddresses;
import it.inaf.ia2.gms.client.call.GetUserGroupsCall; import it.inaf.ia2.gms.client.call.GetUserGroupsCall;
import it.inaf.ia2.gms.client.call.GetUserPermissionsCall; import it.inaf.ia2.gms.client.call.GetUserPermissionsCall;
...@@ -153,7 +154,7 @@ public class GmsClient extends BaseClient { ...@@ -153,7 +154,7 @@ public class GmsClient extends BaseClient {
return new GetMemberEmailAddresses(this).getMemberEmailAddresses(groupId, permission); return new GetMemberEmailAddresses(this).getMemberEmailAddresses(groupId, permission);
} }
public Object call(HttpRequest groupsRequest, HttpResponse.BodyHandler<InputStream> ofInputStream) { public List<String[]> getStatus(String groupCompleteName) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. return new GetGroupStatusCall(this).getStatus(groupCompleteName);
} }
} }
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));
}
}
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<span v-if="group.active">{{group.groupName}}</span> <span v-if="group.active">{{group.groupName}}</span>
</li> </li>
</ol> </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> <font-awesome-icon icon="download"></font-awesome-icon>
</a> </a>
</nav> </nav>
......
package it.inaf.ia2.gms.controller; package it.inaf.ia2.gms.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.opencsv.CSVWriter; import com.opencsv.CSVWriter;
import it.inaf.ia2.gms.manager.GroupStatusManager; import it.inaf.ia2.gms.manager.GroupStatusManager;
import it.inaf.ia2.gms.manager.GroupsManager; import it.inaf.ia2.gms.manager.GroupsManager;
...@@ -12,9 +13,12 @@ import it.inaf.ia2.gms.model.request.GroupsRequest; ...@@ -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.RenameGroupRequest;
import it.inaf.ia2.gms.model.request.SearchFilterRequest; import it.inaf.ia2.gms.model.request.SearchFilterRequest;
import it.inaf.ia2.gms.persistence.model.GroupEntity; import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.service.GroupNameService;
import it.inaf.ia2.gms.service.GroupsTreeBuilder; import it.inaf.ia2.gms.service.GroupsTreeBuilder;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.util.List;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
...@@ -28,11 +32,14 @@ import org.springframework.web.bind.annotation.PathVariable; ...@@ -28,11 +32,14 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
public class GroupsController { public class GroupsController {
private static final ObjectMapper MAPPER = new ObjectMapper();
@Autowired @Autowired
private HttpServletRequest servletRequest; private HttpServletRequest servletRequest;
...@@ -48,6 +55,9 @@ public class GroupsController { ...@@ -48,6 +55,9 @@ public class GroupsController {
@Autowired @Autowired
private GroupStatusManager groupStatusManager; private GroupStatusManager groupStatusManager;
@Autowired
private GroupNameService groupNameService;
@GetMapping(value = "/groups", produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(value = "/groups", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> getGroupsTab(@Valid GroupsRequest request) { public ResponseEntity<?> getGroupsTab(@Valid GroupsRequest request) {
if (request.isOnlyPanel()) { if (request.isOnlyPanel()) {
...@@ -93,15 +103,35 @@ public class GroupsController { ...@@ -93,15 +103,35 @@ public class GroupsController {
return ResponseEntity.ok(groupsPanel); return ResponseEntity.ok(groupsPanel);
} }
@GetMapping(value = "/group/status/{groupId}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) @GetMapping(value = "/group/status", produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE, MediaType.APPLICATION_JSON_VALUE})
public void downloadStatus(@PathVariable("groupId") String groupId, HttpServletResponse response) throws Exception { public void downloadStatus(@RequestParam(value = "groupId", required = false) String groupId,
@RequestParam(value = "groupName", required = false) String groupName,
HttpServletRequest request, HttpServletResponse response) throws Exception {
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(); CSVWriter writer = new CSVWriter(new OutputStreamWriter(out))) { try ( OutputStream out = response.getOutputStream()) {
writer.writeNext(new String[]{"program", "email"}); 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); writer.writeNext(row);
}
}
} }
} }
} }
......
...@@ -6,7 +6,6 @@ import it.inaf.ia2.gms.persistence.GroupsDAO; ...@@ -6,7 +6,6 @@ import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.MembershipsDAO; import it.inaf.ia2.gms.persistence.MembershipsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity; import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.MembershipEntity; 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.gms.service.GroupsService;
import it.inaf.ia2.rap.client.RapClient; import it.inaf.ia2.rap.client.RapClient;
import it.inaf.ia2.rap.data.RapUser; import it.inaf.ia2.rap.data.RapUser;
...@@ -38,9 +37,6 @@ public class GroupStatusManager extends UserAwareComponent { ...@@ -38,9 +37,6 @@ public class GroupStatusManager extends UserAwareComponent {
@Autowired @Autowired
private MembershipsDAO membershipsDAO; private MembershipsDAO membershipsDAO;
@Autowired
private GroupNameService groupNameService;
@Autowired @Autowired
private RapClient rapClient; private RapClient rapClient;
...@@ -50,14 +46,15 @@ public class GroupStatusManager extends UserAwareComponent { ...@@ -50,14 +46,15 @@ public class GroupStatusManager extends UserAwareComponent {
Permission groupPermission = permissionsManager.getCurrentUserPermission(parentGroup); Permission groupPermission = permissionsManager.getCurrentUserPermission(parentGroup);
if (groupPermission != Permission.ADMIN) { if (Permission.includes(Permission.VIEW_MEMBERS, groupPermission)) {
throw new UnauthorizedException("ADMIN permission is needed for performing this action"); throw new UnauthorizedException("VIEW_MEMBERS permission is needed for performing this action");
} }
List<GroupEntity> groups = groupsDAO.getAllChildren(parentGroup.getPath()); List<GroupEntity> groups = groupsDAO.getAllChildren(parentGroup.getPath());
groups.add(parentGroup); 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() List<MembershipEntity> memberships = membershipsDAO.findByGroups(groups.stream()
.map(g -> g.getId()).collect(Collectors.toList())); .map(g -> g.getId()).collect(Collectors.toList()));
...@@ -84,7 +81,7 @@ public class GroupStatusManager extends UserAwareComponent { ...@@ -84,7 +81,7 @@ public class GroupStatusManager extends UserAwareComponent {
for (int i = 0; i < groups.size(); i++) { for (int i = 0; i < groups.size(); i++) {
GroupEntity group = groups.get(i); GroupEntity group = groups.get(i);
String groupName = names.get(i); String groupName = names.get(group.getId());
List<String> users = membersMap.get(group.getId()); List<String> users = membersMap.get(group.getId());
if (users != null) { if (users != null) {
for (String userId : users) { for (String userId : users) {
......
...@@ -46,9 +46,6 @@ public class GroupNameService { ...@@ -46,9 +46,6 @@ public class GroupNameService {
Set<String> groupIds = groups.stream().map(g -> g.getId()).collect(Collectors.toSet()); Set<String> groupIds = groups.stream().map(g -> g.getId()).collect(Collectors.toSet());
List<String> names = new ArrayList<>(groupsDAO.getGroupCompleteNamesFromId(groupIds).values()); List<String> names = new ArrayList<>(groupsDAO.getGroupCompleteNamesFromId(groupIds).values());
if (groupIds.contains("ROOT")) {
names.add(getRoot().getName());
}
Collections.sort(names); Collections.sort(names);
......
...@@ -74,5 +74,7 @@ FROM ( ...@@ -74,5 +74,7 @@ FROM (
FROM gms_group FROM gms_group
) AS p ON g.id = p.rel_id ) AS p ON g.id = p.rel_id
ORDER BY p.id, nlevel(g.path) ORDER BY p.id, nlevel(g.path)
) AS j ) AS j GROUP BY id
GROUP BY id ORDER BY complete_name; UNION
SELECT id, name AS complete_name FROM gms_group WHERE id = 'ROOT'
ORDER BY complete_name;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment