Added list group controller for system admin & status to user-group DTO.
Change-Id: I628008322472c3910088ea7c17db137d7b3aec87
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupDao.java
index 43eee36..bee11e3 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupDao.java
@@ -259,6 +259,60 @@
}
+ /** This is an admin function. It retrieves all groups given the userId
+ * and status.
+ *
+ * @param userId
+ * @param status
+ * @return a list of {@link UserGroup}s
+ * @throws KustvaktException
+ */
+ public List<UserGroup> retrieveGroupByStatus (String userId,
+ UserGroupStatus status) throws KustvaktException {
+
+ CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+ CriteriaQuery<UserGroup> query =
+ criteriaBuilder.createQuery(UserGroup.class);
+
+ Root<UserGroup> root = query.from(UserGroup.class);
+
+ Predicate restrictions = null;
+
+ if (userId != null && !userId.isEmpty()) {
+
+ ListJoin<UserGroup, UserGroupMember> members =
+ root.join(UserGroup_.members);
+ restrictions = criteriaBuilder.and(
+ criteriaBuilder.equal(members.get(UserGroupMember_.userId),
+ userId));
+
+ if (status != null){
+ restrictions = criteriaBuilder.and(restrictions, criteriaBuilder
+ .equal(root.get(UserGroup_.status), status));
+ }
+ }
+ else if (status != null) {
+ restrictions = criteriaBuilder
+ .equal(root.get(UserGroup_.status), status);
+
+ }
+
+ query.select(root);
+ if (restrictions!=null){
+ query.where(restrictions);
+ }
+ Query q = entityManager.createQuery(query);
+
+ try {
+ return q.getResultList();
+ }
+ catch (NoResultException e) {
+ throw new KustvaktException(StatusCodes.NO_RESULT_FOUND,
+ "No group found for status " + status, status.toString());
+ }
+
+ }
+
public void addVCToGroup (VirtualCorpus virtualCorpus, String createdBy,
VirtualCorpusAccessStatus status, UserGroup group) {
VirtualCorpusAccess accessGroup = new VirtualCorpusAccess();
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupMemberDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupMemberDao.java
index ae58ec6..b4f2227 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupMemberDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/UserGroupMemberDao.java
@@ -143,17 +143,25 @@
public List<UserGroupMember> retrieveMemberByGroupId (int groupId)
throws KustvaktException {
+ return retrieveMemberByGroupId(groupId, false);
+ }
+
+ public List<UserGroupMember> retrieveMemberByGroupId (int groupId,
+ boolean isAdmin) throws KustvaktException {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupMember> query =
criteriaBuilder.createQuery(UserGroupMember.class);
Root<UserGroupMember> root = query.from(UserGroupMember.class);
- Predicate predicate = criteriaBuilder.and(
- criteriaBuilder.equal(root.get(UserGroupMember_.group),
- groupId),
- criteriaBuilder.notEqual(root.get(UserGroupMember_.status),
- GroupMemberStatus.DELETED));
+ Predicate predicate = criteriaBuilder.and(criteriaBuilder
+ .equal(root.get(UserGroupMember_.group), groupId));
+
+ if (!isAdmin) {
+ predicate = criteriaBuilder.and(predicate,
+ criteriaBuilder.notEqual(root.get(UserGroupMember_.status),
+ GroupMemberStatus.DELETED));
+ }
query.select(root);
query.where(predicate);
diff --git a/full/src/main/java/de/ids_mannheim/korap/dto/UserGroupDto.java b/full/src/main/java/de/ids_mannheim/korap/dto/UserGroupDto.java
index 8d64c09..69900d8 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dto/UserGroupDto.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dto/UserGroupDto.java
@@ -5,6 +5,7 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import de.ids_mannheim.korap.constant.GroupMemberStatus;
+import de.ids_mannheim.korap.constant.UserGroupStatus;
import lombok.Getter;
import lombok.Setter;
@@ -21,6 +22,7 @@
private int id;
private String name;
private String owner;
+ private UserGroupStatus status;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<UserGroupMemberDto> members;
diff --git a/full/src/main/java/de/ids_mannheim/korap/dto/converter/UserGroupConverter.java b/full/src/main/java/de/ids_mannheim/korap/dto/converter/UserGroupConverter.java
index 9dd4df9..0ee2912 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dto/converter/UserGroupConverter.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dto/converter/UserGroupConverter.java
@@ -29,14 +29,17 @@
UserGroupDto dto = new UserGroupDto();
dto.setId(group.getId());
dto.setName(group.getName());
+ dto.setStatus(group.getStatus());
dto.setOwner(group.getCreatedBy());
dto.setUserMemberStatus(userMemberStatus);
- List<String> roles = new ArrayList<>(userRoles.size());
- for (Role r : userRoles) {
- roles.add(r.getName());
+ if (userRoles != null) {
+ List<String> roles = new ArrayList<>(userRoles.size());
+ for (Role r : userRoles) {
+ roles.add(r.getName());
+ }
+ dto.setUserRoles(roles);
}
- dto.setUserRoles(roles);
if (members != null) {
ArrayList<UserGroupMemberDto> memberDtos =
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/UserGroupService.java b/full/src/main/java/de/ids_mannheim/korap/service/UserGroupService.java
index 147be56..4450551 100644
--- a/full/src/main/java/de/ids_mannheim/korap/service/UserGroupService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/service/UserGroupService.java
@@ -67,21 +67,8 @@
*
* @see {@link PredefinedRole}
*/
- public List<UserGroupDto> retrieveUserGroup (String username,
- String contextUsername) throws KustvaktException {
-
- boolean isAdmin = adminDao.isAdmin(contextUsername);
-
- if (username != null) {
- if (!username.equals(contextUsername) && !isAdmin) {
- throw new KustvaktException(StatusCodes.AUTHORIZATION_FAILED,
- "Unauthorized operation for user: " + contextUsername,
- contextUsername);
- }
- }
- else {
- username = contextUsername;
- }
+ public List<UserGroupDto> retrieveUserGroup (String username)
+ throws KustvaktException {
List<UserGroup> userGroups =
userGroupDao.retrieveGroupByUserId(username);
@@ -124,10 +111,40 @@
return userGroupDao.retrieveGroupById(groupId);
}
- public UserGroup retrieveHiddenGroup (int vcId) throws KustvaktException {
+ public UserGroup retrieveHiddenUserGroupByVC (int vcId)
+ throws KustvaktException {
return userGroupDao.retrieveHiddenGroupByVC(vcId);
}
+ public List<UserGroupDto> retrieveUserGroupByStatus (String username,
+ String contextUsername, UserGroupStatus status)
+ throws KustvaktException {
+
+ boolean isAdmin = adminDao.isAdmin(contextUsername);
+
+ if (isAdmin) {
+ List<UserGroup> userGroups =
+ userGroupDao.retrieveGroupByStatus(username, status);
+ Collections.sort(userGroups);
+ ArrayList<UserGroupDto> dtos = new ArrayList<>(userGroups.size());
+
+ List<UserGroupMember> members;
+ UserGroupDto groupDto;
+ for (UserGroup group : userGroups) {
+ members = groupMemberDao.retrieveMemberByGroupId(group.getId(), true);
+ groupDto = converter.createUserGroupDto(group, members, null,
+ null);
+ dtos.add(groupDto);
+ }
+ return dtos;
+ }
+ else {
+ throw new KustvaktException(StatusCodes.AUTHORIZATION_FAILED,
+ "Unauthorized operation for user: " + contextUsername,
+ contextUsername);
+ }
+ }
+
public List<UserGroupMember> retrieveVCAccessAdmins (UserGroup userGroup)
throws KustvaktException {
List<UserGroupMember> groupAdmins = groupMemberDao.retrieveMemberByRole(
@@ -460,4 +477,6 @@
groupMemberDao.deleteMember(member, deletedBy, isSoftDelete);
}
+
+
}
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java b/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java
index 6ea1002..32312cd 100644
--- a/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/service/VirtualCorpusService.java
@@ -383,7 +383,7 @@
else if (VirtualCorpusType.PUBLISHED.equals(type)) {
// add user in the VC's auto group
UserGroup userGroup =
- userGroupService.retrieveHiddenGroup(vcId);
+ userGroupService.retrieveHiddenUserGroupByVC(vcId);
try {
userGroupService.inviteGroupMember(username, userGroup,
"system", GroupMemberStatus.ACTIVE);
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
index a838c13..b4a5fc7 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
@@ -20,6 +20,7 @@
import com.sun.jersey.spi.container.ResourceFilters;
+import de.ids_mannheim.korap.constant.UserGroupStatus;
import de.ids_mannheim.korap.dto.UserGroupDto;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.service.UserGroupService;
@@ -55,19 +56,21 @@
private UserGroupService service;
/** Returns all user-groups in which a user is an active or a pending member.
+ * Not suitable for system-admin, instead use {@link UserGroupController#
+ * getUserGroupBySystemAdmin(SecurityContext, String, UserGroupStatus)}
*
* @param securityContext
* @return a list of user-groups
+ *
*/
@GET
@Path("list")
- public Response getUserGroup (@Context SecurityContext securityContext,
- @QueryParam("username") String username) {
+ public Response getUserGroup (@Context SecurityContext securityContext) {
TokenContext context =
(TokenContext) securityContext.getUserPrincipal();
try {
List<UserGroupDto> dtos =
- service.retrieveUserGroup(username, context.getUsername());
+ service.retrieveUserGroup(context.getUsername());
String result = JsonUtils.toJSON(dtos);
return Response.ok(result).build();
}
@@ -76,6 +79,34 @@
}
}
+
+ /** Lists user-groups for system-admin purposes. If username parameter
+ * is not specified, list user-groups of all users. If status is not
+ * specified, list user-groups of all statuses.
+ *
+ * @param securityContext
+ * @param username username
+ * @param status {@link UserGroupStatus}
+ * @return a list of user-groups
+ */
+ @GET
+ @Path("list/system-admin")
+ public Response getUserGroupBySystemAdmin (
+ @Context SecurityContext securityContext,
+ @QueryParam("username") String username,
+ @QueryParam("status") UserGroupStatus status) {
+ TokenContext context =
+ (TokenContext) securityContext.getUserPrincipal();
+ try {
+ List<UserGroupDto> dtos = service.retrieveUserGroupByStatus(
+ username, context.getUsername(), status);
+ String result = JsonUtils.toJSON(dtos);
+ return Response.ok(result).build();
+ }
+ catch (KustvaktException e) {
+ throw responseHandler.throwit(e);
+ }
+ }
/** Creates a user group where the user in token context is the
* group owner, and assigns the listed group members with status