Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package it.inaf.ia2.gms.service;
import it.inaf.ia2.gms.exception.BadRequestException;
import it.inaf.ia2.gms.persistence.GroupsRepository;
import it.inaf.ia2.gms.persistence.UsersRepository;
import it.inaf.ia2.gms.persistence.model.Group;
import it.inaf.ia2.gms.persistence.model.User;
import it.inaf.ia2.gms.persistence.model.UserGroup;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import it.inaf.ia2.gms.persistence.PermissionsRepository;
import it.inaf.ia2.gms.service.model.GroupNode;
import it.inaf.ia2.gms.service.model.Permission;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;
@Service
public class GroupsService {
public static final String ROOT = "ROOT";
private final GroupsRepository groupsRepository;
private final UsersRepository usersRepository;
private final PermissionsRepository permissionsRepository;
@Autowired
public GroupsService(GroupsRepository groupsRepository,
UsersRepository usersRepository, PermissionsRepository permissionsRepository) {
this.groupsRepository = groupsRepository;
this.usersRepository = usersRepository;
this.permissionsRepository = permissionsRepository;
createRootIfNecessary();
}
private void createRootIfNecessary() {
if (groupsRepository.count() == 0) {
Group root = new Group();
root.setId(ROOT);
root.setName(ROOT);
groupsRepository.save(root);
}
}
public Group addGroup(String parentId, String groupName) {
Group parent = getGroupById(parentId);
Group group = new Group();
group.setId(UUID.randomUUID().toString());
group.setName(groupName);
group.setParentGroup(parent);
parent.getGroupsMembers().add(group);
group = groupsRepository.save(group);
groupsRepository.save(parent);
return group;
}
public List<Group> getSubgroups(String parentId) {
Group parent = getGroupById(parentId);
return groupsRepository.findByParentGroup(parent);
}
public List<GroupNode> getSubgroups(String parentGroupId, String userId) {
User user = usersRepository.findById(userId)
.orElseThrow(() -> new BadRequestException("User " + userId + " not found"));
Group parent = getGroupById(parentGroupId);
List<UserGroup> permissions = permissionsRepository.findBy_user(user);
Map<String, GroupNode> nodes = new LinkedHashMap<>();
for (Group childGroup : parent.getGroupsMembers()) {
Iterator<UserGroup> ite = permissions.iterator();
while (ite.hasNext()) {
UserGroup permission = ite.next();
boolean isChild = false;
if (permission.getGroup().getId().equals(childGroup.getId())
|| (isChild = isChildOf(permission.getGroup(), parentGroupId))) {
GroupNode node = nodes.get(childGroup.getId());
if (node == null) {
node = getGroupNode(childGroup);
}
if (isChild) {
// Traversal only
node.getPermissions().add(Permission.READ);
} else {
// Direct permission
node.getPermissions().add(permission.getPermission());
}
nodes.put(childGroup.getId(), node);
ite.remove();
}
}
}
// TODO: pagination
return new ArrayList<>(nodes.values());
}
private GroupNode getGroupNode(Group group) {
GroupNode node = new GroupNode();
node.setGroupId(group.getId());
node.setGroupName(group.getName());
node.setHasChildren(!group.getGroupsMembers().isEmpty());
return node;
}
private boolean isChildOf(Group group, String parentGroupId) {
Group parent = group.getParentGroup();
if (parent == null) {
// ROOT has no parent
return false;
}
if (parentGroupId.equals(parent.getId())) {
return true;
}
// recursive call to parent group
return isChildOf(parent, parentGroupId);
}
private Group getGroupById(String groupId) {
return groupsRepository.findById(groupId)
.orElseThrow(() -> new BadRequestException("Group " + groupId + " not found"));
}
}