Newer
Older
package it.inaf.ia2.gms.service;
import it.inaf.ia2.gms.model.GroupNode;
import it.inaf.ia2.gms.model.response.PaginatedData;
import it.inaf.ia2.gms.model.request.PaginatedModelRequest;
import it.inaf.ia2.gms.model.request.SearchFilterRequest;
import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.PermissionsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* Returns to the user only the groups he or she is allowed to see.
*/
@Component
public class GroupsTreeBuilder {
private final GroupsDAO groupsDAO;
private final PermissionsDAO permissionsDAO;
@Autowired
public GroupsTreeBuilder(GroupsDAO groupsDAO, PermissionsDAO permissionsDAO) {
this.groupsDAO = groupsDAO;
this.permissionsDAO = permissionsDAO;
}
public <T extends PaginatedModelRequest & SearchFilterRequest> PaginatedData<GroupNode> listSubGroups(GroupEntity parentGroup, T request, String userId) {
// All the sub groups of given parent
List<GroupEntity> allGroups = groupsDAO.getDirectSubGroups(parentGroup.getPath(), request.getSearchFilter());
// Select only the groups visible to the user
List<PermissionEntity> permissions = permissionsDAO.findUserPermissions(userId);
List<GroupNode> userGroups = filterOnPermissions(allGroups, permissions);
PaginatedData<GroupNode> paginatedGroups = new PaginatedData<>(userGroups,
request.getPaginatorPage(), request.getPaginatorPageSize());
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
fillHasChildrenFlags(paginatedGroups.getItems());
return paginatedGroups;
}
private List<GroupNode> filterOnPermissions(List<GroupEntity> allGroups, List<PermissionEntity> permissions) {
List<GroupNode> nodes = new ArrayList<>();
for (GroupEntity group : allGroups) {
PermissionUtils.getGroupPermission(group, permissions).ifPresent(permission -> {
GroupNode node = new GroupNode();
node.setGroupId(group.getId());
node.setGroupName(group.getName());
node.setPermission(permission);
nodes.add(node);
});
}
// Sort by group name
nodes.sort((n1, n2) -> n1.getGroupName().compareTo(n2.getGroupName()));
return nodes;
}
private void fillHasChildrenFlags(List<GroupNode> groups) {
Set<String> groupIds = groups.stream().map(g -> g.getGroupId()).collect(Collectors.toSet());
Map<String, Boolean> hasChildrenMap = groupsDAO.getHasChildrenMap(groupIds);
for (GroupNode group : groups) {
group.setHasChildren(hasChildrenMap.get(group.getGroupId()));
}
}
}