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
package it.inaf.ia2.gms.service;
import it.inaf.ia2.gms.model.Permission;
import it.inaf.ia2.gms.model.response.PaginatedData;
import it.inaf.ia2.gms.model.response.SearchResponseItem;
import it.inaf.ia2.gms.model.response.SearchResponseType;
import it.inaf.ia2.gms.model.response.UserSearchResponse;
import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.MembershipsDAO;
import it.inaf.ia2.gms.persistence.PermissionsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import it.inaf.ia2.gms.rap.RapClient;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SearchService {
@Autowired
private RapClient rapClient;
@Autowired
private GroupsService groupsService;
@Autowired
private GroupsDAO groupsDAO;
@Autowired
private PermissionsDAO permissionsDAO;
@Autowired
private MembershipsDAO membershipsDAO;
/**
* Generic search (both groups and users).
*/
public PaginatedData<SearchResponseItem> search(String query, String userId, int page, int pageSize) {
List<SearchResponseItem> items = searchUsers(query);
items.addAll(searchGroups(query, userId));
// sort by label
items.sort((i1, i2) -> i1.getLabel().compareTo(i2.getLabel()));
return new PaginatedData<>(items, page, pageSize);
}
private List<SearchResponseItem> searchUsers(String query) {
return rapClient.searchUsers(query).stream()
.map(u -> {
SearchResponseItem item = new SearchResponseItem();
item.setType(SearchResponseType.USER);
item.setId(u.getId());
item.setLabel(u.getDisplayName());
return item;
})
.collect(Collectors.toList());
}
private List<SearchResponseItem> searchGroups(String query, String userId) {
List<GroupEntity> allGroups = groupsDAO.searchGroups(query);
// Select only the groups visible to the user
List<PermissionEntity> permissions = permissionsDAO.findUserPermissions(userId);
List<SearchResponseItem> items = new ArrayList<>();
for (GroupEntity group : allGroups) {
PermissionUtils.getGroupPermission(group, permissions).ifPresent(permission -> {
SearchResponseItem item = new SearchResponseItem();
item.setType(SearchResponseType.GROUP);
item.setId(group.getId());
item.setLabel(group.getName());
items.add(item);
});
}
return items;
}
/**
* Retrieve additional data about an user displayed into the generic search.
*
* @param actorUserId the user who performed the search
* @param targetUserId the user displayed into the search results
*/
public UserSearchResponse getUserSearchResult(String actorUserId, String targetUserId) {
List<GroupEntity> allGroups = membershipsDAO.getUserMemberships(targetUserId);
// Select only the groups visible to the user
List<PermissionEntity> permissions = permissionsDAO.findUserPermissions(actorUserId);
List<GroupEntity> visibleGroups = new ArrayList<>();
for (GroupEntity group : allGroups) {
PermissionUtils.getGroupPermission(group, permissions).ifPresent(permission -> {
visibleGroups.add(group);
});
}
UserSearchResponse response = new UserSearchResponse();
response.setGroups(visibleGroups);
// Super-admin user is able to see also other user permissions
PermissionUtils.getGroupPermission(groupsService.getRoot(), permissions).ifPresent(permission -> {
if (permission.equals(Permission.ADMIN)) {
List<PermissionEntity> targetUserPermissions = permissionsDAO.findUserPermissions(targetUserId);
response.setPermissions(targetUserPermissions);
}
});
return response;
}
}