blob: 66ef5fb3892e5db837dac79e8a6007c71397a060 [file] [log] [blame]
margarethabf11d8d2017-10-24 19:31:44 +02001package de.ids_mannheim.korap.dao;
2
margaretha18533fd2018-03-28 16:01:06 +02003import java.util.HashSet;
margarethabf11d8d2017-10-24 19:31:44 +02004import java.util.List;
margaretha18533fd2018-03-28 16:01:06 +02005import java.util.Set;
margarethabf11d8d2017-10-24 19:31:44 +02006
7import javax.persistence.EntityManager;
margaretha61966dd2017-10-26 19:32:21 +02008import javax.persistence.NoResultException;
margarethabf11d8d2017-10-24 19:31:44 +02009import javax.persistence.PersistenceContext;
10import javax.persistence.Query;
11import javax.persistence.criteria.CriteriaBuilder;
12import javax.persistence.criteria.CriteriaQuery;
margaretha61966dd2017-10-26 19:32:21 +020013import javax.persistence.criteria.Join;
margarethad3c0fc92017-10-25 15:03:32 +020014import javax.persistence.criteria.ListJoin;
15import javax.persistence.criteria.Predicate;
margarethabf11d8d2017-10-24 19:31:44 +020016import javax.persistence.criteria.Root;
17
margarethab42b9632017-10-25 18:34:12 +020018import org.springframework.beans.factory.annotation.Autowired;
margarethad3c0fc92017-10-25 15:03:32 +020019import org.springframework.stereotype.Repository;
margarethabf11d8d2017-10-24 19:31:44 +020020import org.springframework.transaction.annotation.Transactional;
21
margarethaf438c592017-10-25 15:23:50 +020022import de.ids_mannheim.korap.constant.GroupMemberStatus;
margarethab42b9632017-10-25 18:34:12 +020023import de.ids_mannheim.korap.constant.PredefinedRole;
margarethaf438c592017-10-25 15:23:50 +020024import de.ids_mannheim.korap.constant.UserGroupStatus;
margarethab097fb02021-02-22 19:28:33 +010025import de.ids_mannheim.korap.constant.QueryAccessStatus;
margarethab42b9632017-10-25 18:34:12 +020026import de.ids_mannheim.korap.entity.Role;
margarethabf11d8d2017-10-24 19:31:44 +020027import de.ids_mannheim.korap.entity.UserGroup;
28import de.ids_mannheim.korap.entity.UserGroupMember;
margarethad3c0fc92017-10-25 15:03:32 +020029import de.ids_mannheim.korap.entity.UserGroupMember_;
30import de.ids_mannheim.korap.entity.UserGroup_;
margarethab097fb02021-02-22 19:28:33 +010031import de.ids_mannheim.korap.entity.QueryDO;
32import de.ids_mannheim.korap.entity.QueryAccess;
33import de.ids_mannheim.korap.entity.QueryAccess_;
34import de.ids_mannheim.korap.entity.QueryDO_;
margaretha61966dd2017-10-26 19:32:21 +020035import de.ids_mannheim.korap.exceptions.KustvaktException;
36import de.ids_mannheim.korap.exceptions.StatusCodes;
37import de.ids_mannheim.korap.utils.ParameterChecker;
margarethabf11d8d2017-10-24 19:31:44 +020038
margaretha398f4722019-01-09 19:07:20 +010039/**
40 * Manages database queries and transactions regarding
41 * {@link UserGroup} entity and database table.
margaretha69e8adc2018-03-15 15:14:22 +010042 *
43 * @author margaretha
44 *
45 * @see UserGroup
46 *
47 */
margarethabf11d8d2017-10-24 19:31:44 +020048@Transactional
margarethad3c0fc92017-10-25 15:03:32 +020049@Repository
margarethabf11d8d2017-10-24 19:31:44 +020050public class UserGroupDao {
51
52 @PersistenceContext
53 private EntityManager entityManager;
54
margarethab42b9632017-10-25 18:34:12 +020055 @Autowired
56 private RoleDao roleDao;
57
margarethad8aa1352019-12-19 11:04:41 +010058 public int createGroup (String name, String description,
59 String createdBy, UserGroupStatus status) throws KustvaktException {
margaretha61966dd2017-10-26 19:32:21 +020060 ParameterChecker.checkStringValue(name, "name");
61 ParameterChecker.checkStringValue(createdBy, "createdBy");
62 ParameterChecker.checkObjectValue(status, "UserGroupStatus");
63
margarethabf11d8d2017-10-24 19:31:44 +020064 UserGroup group = new UserGroup();
65 group.setName(name);
margarethad8aa1352019-12-19 11:04:41 +010066 group.setDescription(description);
margarethabf11d8d2017-10-24 19:31:44 +020067 group.setStatus(status);
68 group.setCreatedBy(createdBy);
margarethabf11d8d2017-10-24 19:31:44 +020069 entityManager.persist(group);
margarethab42b9632017-10-25 18:34:12 +020070
margaretha18533fd2018-03-28 16:01:06 +020071 Set<Role> roles = new HashSet<Role>();
margaretha9d3eb042017-12-22 11:02:30 +010072 roles.add(roleDao
73 .retrieveRoleById(PredefinedRole.USER_GROUP_ADMIN.getId()));
74 roles.add(roleDao
margaretha4a1a18c2021-02-26 10:19:54 +010075 .retrieveRoleById(PredefinedRole.VC_ACCESS_ADMIN.getId()));
margarethab42b9632017-10-25 18:34:12 +020076
77 UserGroupMember owner = new UserGroupMember();
margaretha61966dd2017-10-26 19:32:21 +020078 owner.setUserId(createdBy);
margarethab42b9632017-10-25 18:34:12 +020079 owner.setCreatedBy(createdBy);
80 owner.setStatus(GroupMemberStatus.ACTIVE);
81 owner.setGroup(group);
82 owner.setRoles(roles);
83 entityManager.persist(owner);
margaretha61966dd2017-10-26 19:32:21 +020084
85 return group.getId();
margarethabf11d8d2017-10-24 19:31:44 +020086 }
87
88 public void deleteGroup (int groupId, String deletedBy,
margaretha61966dd2017-10-26 19:32:21 +020089 boolean isSoftDelete) throws KustvaktException {
90 ParameterChecker.checkIntegerValue(groupId, "groupId");
91 ParameterChecker.checkStringValue(deletedBy, "deletedBy");
92
margaretha9d3eb042017-12-22 11:02:30 +010093 UserGroup group = null;
94 try {
95 group = retrieveGroupById(groupId);
96 }
97 catch (NoResultException e) {
margarethab5e1e0a2019-01-29 22:11:57 +010098 throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
99 "Group " + groupId + " is not found.",
margaretha9d3eb042017-12-22 11:02:30 +0100100 "groupId: " + groupId);
101 }
102
margarethabf11d8d2017-10-24 19:31:44 +0200103 if (isSoftDelete) {
104 group.setStatus(UserGroupStatus.DELETED);
105 group.setDeletedBy(deletedBy);
margarethab874ef52018-01-23 20:26:31 +0100106 entityManager.merge(group);
margarethabf11d8d2017-10-24 19:31:44 +0200107 }
108 else {
margarethac9f1dfa2018-02-07 17:50:33 +0100109 if (!entityManager.contains(group)) {
margarethab874ef52018-01-23 20:26:31 +0100110 group = entityManager.merge(group);
111 }
margarethabf11d8d2017-10-24 19:31:44 +0200112 entityManager.remove(group);
113 }
114 }
115
margarethad8aa1352019-12-19 11:04:41 +0100116 public void updateGroup (UserGroup group) throws KustvaktException {
117 ParameterChecker.checkObjectValue(group, "user-group");
margaretha541b8cc2018-01-10 13:02:46 +0100118 entityManager.merge(group);
119 }
margarethad8aa1352019-12-19 11:04:41 +0100120
margaretha398f4722019-01-09 19:07:20 +0100121 /**
122 * Retrieves the UserGroup by the given group id. This methods
123 * does not
124 * fetch group members because only group admin is allowed to see
125 * them.
126 * Group members have to be retrieved separately.
margaretha61966dd2017-10-26 19:32:21 +0200127 *
128 * @see UserGroupMember
margaretha398f4722019-01-09 19:07:20 +0100129 * @param groupId
130 * group id
margaretha61966dd2017-10-26 19:32:21 +0200131 * @return UserGroup
margaretha398f4722019-01-09 19:07:20 +0100132 * @throws KustvaktException
margaretha61966dd2017-10-26 19:32:21 +0200133 */
134 public UserGroup retrieveGroupById (int groupId) throws KustvaktException {
margaretha71e6fca2018-01-18 18:11:48 +0100135 return retrieveGroupById(groupId, false);
margarethabf11d8d2017-10-24 19:31:44 +0200136 }
137
margaretha71e6fca2018-01-18 18:11:48 +0100138 public UserGroup retrieveGroupById (int groupId, boolean fetchMembers)
margaretha61966dd2017-10-26 19:32:21 +0200139 throws KustvaktException {
margaretha61966dd2017-10-26 19:32:21 +0200140 ParameterChecker.checkIntegerValue(groupId, "groupId");
141
142 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
143 CriteriaQuery<UserGroup> query =
144 criteriaBuilder.createQuery(UserGroup.class);
145
146 Root<UserGroup> root = query.from(UserGroup.class);
margaretha71e6fca2018-01-18 18:11:48 +0100147 if (fetchMembers) {
148 root.fetch(UserGroup_.members);
149 }
margaretha61966dd2017-10-26 19:32:21 +0200150 query.select(root);
151 query.where(criteriaBuilder.equal(root.get(UserGroup_.id), groupId));
152 Query q = entityManager.createQuery(query);
153
margaretha61966dd2017-10-26 19:32:21 +0200154 try {
margaretha541b8cc2018-01-10 13:02:46 +0100155 return (UserGroup) q.getSingleResult();
margaretha61966dd2017-10-26 19:32:21 +0200156 }
157 catch (NoResultException e) {
margarethad8aa1352019-12-19 11:04:41 +0100158 throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
margarethac9f1dfa2018-02-07 17:50:33 +0100159 "Group with id " + groupId + " is not found",
margaretha61966dd2017-10-26 19:32:21 +0200160 String.valueOf(groupId), e);
161 }
margaretha61966dd2017-10-26 19:32:21 +0200162 }
163
margaretha398f4722019-01-09 19:07:20 +0100164 /**
165 * Retrieves only user-groups that are active (not hidden or
166 * deleted).
margaretha61966dd2017-10-26 19:32:21 +0200167 *
margaretha398f4722019-01-09 19:07:20 +0100168 * @param userId
169 * user id
margaretha61966dd2017-10-26 19:32:21 +0200170 * @return a list of UserGroup
171 * @throws KustvaktException
172 */
margarethadc515072018-08-03 17:01:19 +0200173 @SuppressWarnings("unchecked")
margaretha61966dd2017-10-26 19:32:21 +0200174 public List<UserGroup> retrieveGroupByUserId (String userId)
175 throws KustvaktException {
176 ParameterChecker.checkStringValue(userId, "userId");
177
margarethad3c0fc92017-10-25 15:03:32 +0200178 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
179 CriteriaQuery<UserGroup> query =
180 criteriaBuilder.createQuery(UserGroup.class);
181
182 Root<UserGroup> root = query.from(UserGroup.class);
183
margarethad3c0fc92017-10-25 15:03:32 +0200184 ListJoin<UserGroup, UserGroupMember> members =
185 root.join(UserGroup_.members);
margaretha61966dd2017-10-26 19:32:21 +0200186 Predicate restrictions = criteriaBuilder.and(
187 criteriaBuilder.equal(root.get(UserGroup_.status),
188 UserGroupStatus.ACTIVE),
margarethad3c0fc92017-10-25 15:03:32 +0200189 criteriaBuilder.equal(members.get(UserGroupMember_.userId),
190 userId),
margaretha45667922018-01-25 21:23:03 +0100191 criteriaBuilder.notEqual(members.get(UserGroupMember_.status),
192 GroupMemberStatus.DELETED));
margaretha398f4722019-01-09 19:07:20 +0100193 // criteriaBuilder.equal(members.get(UserGroupMember_.status),
194 // GroupMemberStatus.ACTIVE));
margarethad3c0fc92017-10-25 15:03:32 +0200195
196 query.select(root);
margaretha61966dd2017-10-26 19:32:21 +0200197 query.where(restrictions);
margarethad3c0fc92017-10-25 15:03:32 +0200198 Query q = entityManager.createQuery(query);
margaretha541b8cc2018-01-10 13:02:46 +0100199
200 try {
201 return q.getResultList();
202 }
203 catch (NoResultException e) {
204 throw new KustvaktException(StatusCodes.NO_RESULT_FOUND,
margarethab5e1e0a2019-01-29 22:11:57 +0100205 "No group for username: " + userId + " is found", userId,
206 e);
margaretha541b8cc2018-01-10 13:02:46 +0100207 }
margarethad3c0fc92017-10-25 15:03:32 +0200208 }
209
margarethaa18ab2b2019-11-11 12:55:26 +0100210 public UserGroup retrieveGroupByName (String groupName, boolean fetchMembers)
margaretha45dde682018-01-04 21:33:46 +0100211 throws KustvaktException {
212 ParameterChecker.checkStringValue(groupName, "groupName");
213
margaretha0b63de42017-12-20 18:48:09 +0100214 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
margaretha45dde682018-01-04 21:33:46 +0100215 CriteriaQuery<UserGroup> query =
216 criteriaBuilder.createQuery(UserGroup.class);
margaretha0b63de42017-12-20 18:48:09 +0100217
margaretha45dde682018-01-04 21:33:46 +0100218 Root<UserGroup> root = query.from(UserGroup.class);
margarethaa18ab2b2019-11-11 12:55:26 +0100219 if (fetchMembers) {
220 root.fetch(UserGroup_.members);
221 }
margaretha45dde682018-01-04 21:33:46 +0100222 query.select(root);
223 query.where(
224 criteriaBuilder.equal(root.get(UserGroup_.name), groupName));
225 Query q = entityManager.createQuery(query);
margaretha0b63de42017-12-20 18:48:09 +0100226
margaretha45dde682018-01-04 21:33:46 +0100227 try {
margaretha541b8cc2018-01-10 13:02:46 +0100228 return (UserGroup) q.getSingleResult();
margaretha45dde682018-01-04 21:33:46 +0100229 }
230 catch (NoResultException e) {
margarethab5e1e0a2019-01-29 22:11:57 +0100231 throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
232 "Group " + groupName + " is not found", groupName, e);
margaretha45dde682018-01-04 21:33:46 +0100233 }
margaretha0b63de42017-12-20 18:48:09 +0100234 }
margaretha9d3eb042017-12-22 11:02:30 +0100235
margarethab097fb02021-02-22 19:28:33 +0100236 public UserGroup retrieveHiddenGroupByQuery (int queryId)
margarethac9f1dfa2018-02-07 17:50:33 +0100237 throws KustvaktException {
margarethab097fb02021-02-22 19:28:33 +0100238 ParameterChecker.checkIntegerValue(queryId, "queryId");
margaretha71e6fca2018-01-18 18:11:48 +0100239
240 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
margarethab097fb02021-02-22 19:28:33 +0100241 CriteriaQuery<UserGroup> criteriaQuery =
margaretha71e6fca2018-01-18 18:11:48 +0100242 criteriaBuilder.createQuery(UserGroup.class);
243
margarethab097fb02021-02-22 19:28:33 +0100244 Root<UserGroup> root = criteriaQuery.from(UserGroup.class);
245 Join<UserGroup, QueryAccess> access =
246 root.join(UserGroup_.queryAccess);
247 Join<QueryAccess, QueryDO> query =
248 access.join(QueryAccess_.query);
margaretha71e6fca2018-01-18 18:11:48 +0100249
250 Predicate p = criteriaBuilder.and(
251 criteriaBuilder.equal(root.get(UserGroup_.status),
252 UserGroupStatus.HIDDEN),
margarethab097fb02021-02-22 19:28:33 +0100253 criteriaBuilder.equal(query.get(QueryDO_.id), queryId));
margarethac9f1dfa2018-02-07 17:50:33 +0100254
margarethab097fb02021-02-22 19:28:33 +0100255 criteriaQuery.select(root);
256 criteriaQuery.where(p);
257 Query q = entityManager.createQuery(criteriaQuery);
margaretha71e6fca2018-01-18 18:11:48 +0100258
259 try {
260 return (UserGroup) q.getSingleResult();
261 }
262 catch (NoResultException e) {
263 throw new KustvaktException(StatusCodes.NO_RESULT_FOUND,
margarethab097fb02021-02-22 19:28:33 +0100264 "No hidden group for query with id " + queryId
margarethab5e1e0a2019-01-29 22:11:57 +0100265 + " is found",
margarethab097fb02021-02-22 19:28:33 +0100266 String.valueOf(queryId), e);
margaretha71e6fca2018-01-18 18:11:48 +0100267 }
268
269 }
margaretha45dde682018-01-04 21:33:46 +0100270
margaretha398f4722019-01-09 19:07:20 +0100271 /**
272 * This is an admin function. It retrieves all groups given the
273 * userId
margaretha293ee032018-03-20 20:11:52 +0100274 * and status.
275 *
276 * @param userId
277 * @param status
278 * @return a list of {@link UserGroup}s
279 * @throws KustvaktException
280 */
margarethadc515072018-08-03 17:01:19 +0200281 @SuppressWarnings("unchecked")
margaretha293ee032018-03-20 20:11:52 +0100282 public List<UserGroup> retrieveGroupByStatus (String userId,
283 UserGroupStatus status) throws KustvaktException {
284
285 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
286 CriteriaQuery<UserGroup> query =
287 criteriaBuilder.createQuery(UserGroup.class);
288
289 Root<UserGroup> root = query.from(UserGroup.class);
290
291 Predicate restrictions = null;
292
293 if (userId != null && !userId.isEmpty()) {
294
295 ListJoin<UserGroup, UserGroupMember> members =
296 root.join(UserGroup_.members);
margaretha18533fd2018-03-28 16:01:06 +0200297 restrictions = criteriaBuilder.and(criteriaBuilder
298 .equal(members.get(UserGroupMember_.userId), userId));
299
300 if (status != null) {
margaretha293ee032018-03-20 20:11:52 +0100301 restrictions = criteriaBuilder.and(restrictions, criteriaBuilder
302 .equal(root.get(UserGroup_.status), status));
303 }
304 }
305 else if (status != null) {
margaretha18533fd2018-03-28 16:01:06 +0200306 restrictions =
307 criteriaBuilder.equal(root.get(UserGroup_.status), status);
308
margaretha293ee032018-03-20 20:11:52 +0100309 }
310
311 query.select(root);
margaretha18533fd2018-03-28 16:01:06 +0200312 if (restrictions != null) {
margaretha293ee032018-03-20 20:11:52 +0100313 query.where(restrictions);
314 }
315 Query q = entityManager.createQuery(query);
316
317 try {
318 return q.getResultList();
319 }
320 catch (NoResultException e) {
321 throw new KustvaktException(StatusCodes.NO_RESULT_FOUND,
margarethab5e1e0a2019-01-29 22:11:57 +0100322 "No group with status " + status + " is found",
323 status.toString());
margaretha293ee032018-03-20 20:11:52 +0100324 }
325
326 }
327
margarethab097fb02021-02-22 19:28:33 +0100328 public void addQueryToGroup (QueryDO query, String createdBy,
329 QueryAccessStatus status, UserGroup group) {
330 QueryAccess accessGroup = new QueryAccess();
margarethad3c0fc92017-10-25 15:03:32 +0200331 accessGroup.setCreatedBy(createdBy);
332 accessGroup.setStatus(status);
333 accessGroup.setUserGroup(group);
margarethab097fb02021-02-22 19:28:33 +0100334 accessGroup.setQuery(query);;
margarethad3c0fc92017-10-25 15:03:32 +0200335 entityManager.persist(accessGroup);
336 }
337
margarethab097fb02021-02-22 19:28:33 +0100338 public void addQueryToGroup (List<QueryDO> queries,
margarethad3c0fc92017-10-25 15:03:32 +0200339 String createdBy, UserGroup group,
margarethab097fb02021-02-22 19:28:33 +0100340 QueryAccessStatus status) {
margarethad3c0fc92017-10-25 15:03:32 +0200341
margarethab097fb02021-02-22 19:28:33 +0100342 for (QueryDO q : queries) {
343 addQueryToGroup(q, createdBy, status, group);
margarethabf11d8d2017-10-24 19:31:44 +0200344 }
345 }
margarethad3c0fc92017-10-25 15:03:32 +0200346
margarethab097fb02021-02-22 19:28:33 +0100347 public void deleteQueryFromGroup (int queryId, int groupId)
margaretha9d3eb042017-12-22 11:02:30 +0100348 throws KustvaktException {
margarethab097fb02021-02-22 19:28:33 +0100349 ParameterChecker.checkIntegerValue(queryId, "queryId");
margaretha61966dd2017-10-26 19:32:21 +0200350 ParameterChecker.checkIntegerValue(groupId, "groupId");
351
352 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
margarethab097fb02021-02-22 19:28:33 +0100353 CriteriaQuery<QueryAccess> criteriaQuery =
354 criteriaBuilder.createQuery(QueryAccess.class);
margaretha61966dd2017-10-26 19:32:21 +0200355
margarethab097fb02021-02-22 19:28:33 +0100356 Root<QueryAccess> root = criteriaQuery.from(QueryAccess.class);
357 Join<QueryAccess, QueryDO> queryAccess =
358 root.join(QueryAccess_.query);
359 Join<QueryAccess, UserGroup> group =
360 root.join(QueryAccess_.userGroup);
margaretha61966dd2017-10-26 19:32:21 +0200361
margarethab097fb02021-02-22 19:28:33 +0100362 Predicate query = criteriaBuilder
363 .equal(queryAccess.get(QueryDO_.id), queryId);
margaretha9d3eb042017-12-22 11:02:30 +0100364 Predicate userGroup =
365 criteriaBuilder.equal(group.get(UserGroup_.id), groupId);
366
margarethab097fb02021-02-22 19:28:33 +0100367 criteriaQuery.select(root);
368 criteriaQuery.where(criteriaBuilder.and(query, userGroup));
369 Query q = entityManager.createQuery(criteriaQuery);
370 QueryAccess access =
371 (QueryAccess) q.getSingleResult();
372 entityManager.remove(access);
margaretha61966dd2017-10-26 19:32:21 +0200373 }
374
margarethabf11d8d2017-10-24 19:31:44 +0200375}