| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 1 | package de.ids_mannheim.korap.dao; |
| 2 | |
| margaretha | 18533fd | 2018-03-28 16:01:06 +0200 | [diff] [blame] | 3 | import java.util.HashSet; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 4 | import java.util.List; |
| margaretha | 18533fd | 2018-03-28 16:01:06 +0200 | [diff] [blame] | 5 | import java.util.Set; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 6 | |
| 7 | import javax.persistence.EntityManager; |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 8 | import javax.persistence.NoResultException; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 9 | import javax.persistence.PersistenceContext; |
| 10 | import javax.persistence.Query; |
| 11 | import javax.persistence.criteria.CriteriaBuilder; |
| 12 | import javax.persistence.criteria.CriteriaQuery; |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 13 | import javax.persistence.criteria.Join; |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 14 | import javax.persistence.criteria.ListJoin; |
| 15 | import javax.persistence.criteria.Predicate; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 16 | import javax.persistence.criteria.Root; |
| 17 | |
| margaretha | b42b963 | 2017-10-25 18:34:12 +0200 | [diff] [blame] | 18 | import org.springframework.beans.factory.annotation.Autowired; |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 19 | import org.springframework.stereotype.Repository; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 20 | import org.springframework.transaction.annotation.Transactional; |
| 21 | |
| margaretha | f438c59 | 2017-10-25 15:23:50 +0200 | [diff] [blame] | 22 | import de.ids_mannheim.korap.constant.GroupMemberStatus; |
| margaretha | b42b963 | 2017-10-25 18:34:12 +0200 | [diff] [blame] | 23 | import de.ids_mannheim.korap.constant.PredefinedRole; |
| margaretha | f438c59 | 2017-10-25 15:23:50 +0200 | [diff] [blame] | 24 | import de.ids_mannheim.korap.constant.UserGroupStatus; |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 25 | import de.ids_mannheim.korap.constant.QueryAccessStatus; |
| margaretha | b42b963 | 2017-10-25 18:34:12 +0200 | [diff] [blame] | 26 | import de.ids_mannheim.korap.entity.Role; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 27 | import de.ids_mannheim.korap.entity.UserGroup; |
| 28 | import de.ids_mannheim.korap.entity.UserGroupMember; |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 29 | import de.ids_mannheim.korap.entity.UserGroupMember_; |
| 30 | import de.ids_mannheim.korap.entity.UserGroup_; |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 31 | import de.ids_mannheim.korap.entity.QueryDO; |
| 32 | import de.ids_mannheim.korap.entity.QueryAccess; |
| 33 | import de.ids_mannheim.korap.entity.QueryAccess_; |
| 34 | import de.ids_mannheim.korap.entity.QueryDO_; |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 35 | import de.ids_mannheim.korap.exceptions.KustvaktException; |
| 36 | import de.ids_mannheim.korap.exceptions.StatusCodes; |
| 37 | import de.ids_mannheim.korap.utils.ParameterChecker; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 38 | |
| margaretha | 398f472 | 2019-01-09 19:07:20 +0100 | [diff] [blame] | 39 | /** |
| 40 | * Manages database queries and transactions regarding |
| 41 | * {@link UserGroup} entity and database table. |
| margaretha | 69e8adc | 2018-03-15 15:14:22 +0100 | [diff] [blame] | 42 | * |
| 43 | * @author margaretha |
| 44 | * |
| 45 | * @see UserGroup |
| 46 | * |
| 47 | */ |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 48 | @Transactional |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 49 | @Repository |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 50 | public class UserGroupDao { |
| 51 | |
| 52 | @PersistenceContext |
| 53 | private EntityManager entityManager; |
| 54 | |
| margaretha | b42b963 | 2017-10-25 18:34:12 +0200 | [diff] [blame] | 55 | @Autowired |
| 56 | private RoleDao roleDao; |
| 57 | |
| margaretha | d8aa135 | 2019-12-19 11:04:41 +0100 | [diff] [blame] | 58 | public int createGroup (String name, String description, |
| 59 | String createdBy, UserGroupStatus status) throws KustvaktException { |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 60 | ParameterChecker.checkStringValue(name, "name"); |
| 61 | ParameterChecker.checkStringValue(createdBy, "createdBy"); |
| 62 | ParameterChecker.checkObjectValue(status, "UserGroupStatus"); |
| 63 | |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 64 | UserGroup group = new UserGroup(); |
| 65 | group.setName(name); |
| margaretha | d8aa135 | 2019-12-19 11:04:41 +0100 | [diff] [blame] | 66 | group.setDescription(description); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 67 | group.setStatus(status); |
| 68 | group.setCreatedBy(createdBy); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 69 | entityManager.persist(group); |
| margaretha | b42b963 | 2017-10-25 18:34:12 +0200 | [diff] [blame] | 70 | |
| margaretha | 18533fd | 2018-03-28 16:01:06 +0200 | [diff] [blame] | 71 | Set<Role> roles = new HashSet<Role>(); |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 72 | roles.add(roleDao |
| 73 | .retrieveRoleById(PredefinedRole.USER_GROUP_ADMIN.getId())); |
| 74 | roles.add(roleDao |
| margaretha | 4a1a18c | 2021-02-26 10:19:54 +0100 | [diff] [blame] | 75 | .retrieveRoleById(PredefinedRole.VC_ACCESS_ADMIN.getId())); |
| margaretha | b42b963 | 2017-10-25 18:34:12 +0200 | [diff] [blame] | 76 | |
| 77 | UserGroupMember owner = new UserGroupMember(); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 78 | owner.setUserId(createdBy); |
| margaretha | b42b963 | 2017-10-25 18:34:12 +0200 | [diff] [blame] | 79 | owner.setCreatedBy(createdBy); |
| 80 | owner.setStatus(GroupMemberStatus.ACTIVE); |
| 81 | owner.setGroup(group); |
| 82 | owner.setRoles(roles); |
| 83 | entityManager.persist(owner); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 84 | |
| 85 | return group.getId(); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 86 | } |
| 87 | |
| 88 | public void deleteGroup (int groupId, String deletedBy, |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 89 | boolean isSoftDelete) throws KustvaktException { |
| 90 | ParameterChecker.checkIntegerValue(groupId, "groupId"); |
| 91 | ParameterChecker.checkStringValue(deletedBy, "deletedBy"); |
| 92 | |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 93 | UserGroup group = null; |
| 94 | try { |
| 95 | group = retrieveGroupById(groupId); |
| 96 | } |
| 97 | catch (NoResultException e) { |
| margaretha | b5e1e0a | 2019-01-29 22:11:57 +0100 | [diff] [blame] | 98 | throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND, |
| 99 | "Group " + groupId + " is not found.", |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 100 | "groupId: " + groupId); |
| 101 | } |
| 102 | |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 103 | if (isSoftDelete) { |
| 104 | group.setStatus(UserGroupStatus.DELETED); |
| 105 | group.setDeletedBy(deletedBy); |
| margaretha | b874ef5 | 2018-01-23 20:26:31 +0100 | [diff] [blame] | 106 | entityManager.merge(group); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 107 | } |
| 108 | else { |
| margaretha | c9f1dfa | 2018-02-07 17:50:33 +0100 | [diff] [blame] | 109 | if (!entityManager.contains(group)) { |
| margaretha | b874ef5 | 2018-01-23 20:26:31 +0100 | [diff] [blame] | 110 | group = entityManager.merge(group); |
| 111 | } |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 112 | entityManager.remove(group); |
| 113 | } |
| 114 | } |
| 115 | |
| margaretha | d8aa135 | 2019-12-19 11:04:41 +0100 | [diff] [blame] | 116 | public void updateGroup (UserGroup group) throws KustvaktException { |
| 117 | ParameterChecker.checkObjectValue(group, "user-group"); |
| margaretha | 541b8cc | 2018-01-10 13:02:46 +0100 | [diff] [blame] | 118 | entityManager.merge(group); |
| 119 | } |
| margaretha | d8aa135 | 2019-12-19 11:04:41 +0100 | [diff] [blame] | 120 | |
| margaretha | 398f472 | 2019-01-09 19:07:20 +0100 | [diff] [blame] | 121 | /** |
| 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. |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 127 | * |
| 128 | * @see UserGroupMember |
| margaretha | 398f472 | 2019-01-09 19:07:20 +0100 | [diff] [blame] | 129 | * @param groupId |
| 130 | * group id |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 131 | * @return UserGroup |
| margaretha | 398f472 | 2019-01-09 19:07:20 +0100 | [diff] [blame] | 132 | * @throws KustvaktException |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 133 | */ |
| 134 | public UserGroup retrieveGroupById (int groupId) throws KustvaktException { |
| margaretha | 71e6fca | 2018-01-18 18:11:48 +0100 | [diff] [blame] | 135 | return retrieveGroupById(groupId, false); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 136 | } |
| 137 | |
| margaretha | 71e6fca | 2018-01-18 18:11:48 +0100 | [diff] [blame] | 138 | public UserGroup retrieveGroupById (int groupId, boolean fetchMembers) |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 139 | throws KustvaktException { |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 140 | 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); |
| margaretha | 71e6fca | 2018-01-18 18:11:48 +0100 | [diff] [blame] | 147 | if (fetchMembers) { |
| 148 | root.fetch(UserGroup_.members); |
| 149 | } |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 150 | query.select(root); |
| 151 | query.where(criteriaBuilder.equal(root.get(UserGroup_.id), groupId)); |
| 152 | Query q = entityManager.createQuery(query); |
| 153 | |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 154 | try { |
| margaretha | 541b8cc | 2018-01-10 13:02:46 +0100 | [diff] [blame] | 155 | return (UserGroup) q.getSingleResult(); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 156 | } |
| 157 | catch (NoResultException e) { |
| margaretha | d8aa135 | 2019-12-19 11:04:41 +0100 | [diff] [blame] | 158 | throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND, |
| margaretha | c9f1dfa | 2018-02-07 17:50:33 +0100 | [diff] [blame] | 159 | "Group with id " + groupId + " is not found", |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 160 | String.valueOf(groupId), e); |
| 161 | } |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 162 | } |
| 163 | |
| margaretha | 398f472 | 2019-01-09 19:07:20 +0100 | [diff] [blame] | 164 | /** |
| 165 | * Retrieves only user-groups that are active (not hidden or |
| 166 | * deleted). |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 167 | * |
| margaretha | 398f472 | 2019-01-09 19:07:20 +0100 | [diff] [blame] | 168 | * @param userId |
| 169 | * user id |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 170 | * @return a list of UserGroup |
| 171 | * @throws KustvaktException |
| 172 | */ |
| margaretha | dc51507 | 2018-08-03 17:01:19 +0200 | [diff] [blame] | 173 | @SuppressWarnings("unchecked") |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 174 | public List<UserGroup> retrieveGroupByUserId (String userId) |
| 175 | throws KustvaktException { |
| 176 | ParameterChecker.checkStringValue(userId, "userId"); |
| 177 | |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 178 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); |
| 179 | CriteriaQuery<UserGroup> query = |
| 180 | criteriaBuilder.createQuery(UserGroup.class); |
| 181 | |
| 182 | Root<UserGroup> root = query.from(UserGroup.class); |
| 183 | |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 184 | ListJoin<UserGroup, UserGroupMember> members = |
| 185 | root.join(UserGroup_.members); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 186 | Predicate restrictions = criteriaBuilder.and( |
| 187 | criteriaBuilder.equal(root.get(UserGroup_.status), |
| 188 | UserGroupStatus.ACTIVE), |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 189 | criteriaBuilder.equal(members.get(UserGroupMember_.userId), |
| 190 | userId), |
| margaretha | 4566792 | 2018-01-25 21:23:03 +0100 | [diff] [blame] | 191 | criteriaBuilder.notEqual(members.get(UserGroupMember_.status), |
| 192 | GroupMemberStatus.DELETED)); |
| margaretha | 398f472 | 2019-01-09 19:07:20 +0100 | [diff] [blame] | 193 | // criteriaBuilder.equal(members.get(UserGroupMember_.status), |
| 194 | // GroupMemberStatus.ACTIVE)); |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 195 | |
| 196 | query.select(root); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 197 | query.where(restrictions); |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 198 | Query q = entityManager.createQuery(query); |
| margaretha | 541b8cc | 2018-01-10 13:02:46 +0100 | [diff] [blame] | 199 | |
| 200 | try { |
| 201 | return q.getResultList(); |
| 202 | } |
| 203 | catch (NoResultException e) { |
| 204 | throw new KustvaktException(StatusCodes.NO_RESULT_FOUND, |
| margaretha | b5e1e0a | 2019-01-29 22:11:57 +0100 | [diff] [blame] | 205 | "No group for username: " + userId + " is found", userId, |
| 206 | e); |
| margaretha | 541b8cc | 2018-01-10 13:02:46 +0100 | [diff] [blame] | 207 | } |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 208 | } |
| 209 | |
| margaretha | a18ab2b | 2019-11-11 12:55:26 +0100 | [diff] [blame] | 210 | public UserGroup retrieveGroupByName (String groupName, boolean fetchMembers) |
| margaretha | 45dde68 | 2018-01-04 21:33:46 +0100 | [diff] [blame] | 211 | throws KustvaktException { |
| 212 | ParameterChecker.checkStringValue(groupName, "groupName"); |
| 213 | |
| margaretha | 0b63de4 | 2017-12-20 18:48:09 +0100 | [diff] [blame] | 214 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); |
| margaretha | 45dde68 | 2018-01-04 21:33:46 +0100 | [diff] [blame] | 215 | CriteriaQuery<UserGroup> query = |
| 216 | criteriaBuilder.createQuery(UserGroup.class); |
| margaretha | 0b63de4 | 2017-12-20 18:48:09 +0100 | [diff] [blame] | 217 | |
| margaretha | 45dde68 | 2018-01-04 21:33:46 +0100 | [diff] [blame] | 218 | Root<UserGroup> root = query.from(UserGroup.class); |
| margaretha | a18ab2b | 2019-11-11 12:55:26 +0100 | [diff] [blame] | 219 | if (fetchMembers) { |
| 220 | root.fetch(UserGroup_.members); |
| 221 | } |
| margaretha | 45dde68 | 2018-01-04 21:33:46 +0100 | [diff] [blame] | 222 | query.select(root); |
| 223 | query.where( |
| 224 | criteriaBuilder.equal(root.get(UserGroup_.name), groupName)); |
| 225 | Query q = entityManager.createQuery(query); |
| margaretha | 0b63de4 | 2017-12-20 18:48:09 +0100 | [diff] [blame] | 226 | |
| margaretha | 45dde68 | 2018-01-04 21:33:46 +0100 | [diff] [blame] | 227 | try { |
| margaretha | 541b8cc | 2018-01-10 13:02:46 +0100 | [diff] [blame] | 228 | return (UserGroup) q.getSingleResult(); |
| margaretha | 45dde68 | 2018-01-04 21:33:46 +0100 | [diff] [blame] | 229 | } |
| 230 | catch (NoResultException e) { |
| margaretha | b5e1e0a | 2019-01-29 22:11:57 +0100 | [diff] [blame] | 231 | throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND, |
| 232 | "Group " + groupName + " is not found", groupName, e); |
| margaretha | 45dde68 | 2018-01-04 21:33:46 +0100 | [diff] [blame] | 233 | } |
| margaretha | 0b63de4 | 2017-12-20 18:48:09 +0100 | [diff] [blame] | 234 | } |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 235 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 236 | public UserGroup retrieveHiddenGroupByQuery (int queryId) |
| margaretha | c9f1dfa | 2018-02-07 17:50:33 +0100 | [diff] [blame] | 237 | throws KustvaktException { |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 238 | ParameterChecker.checkIntegerValue(queryId, "queryId"); |
| margaretha | 71e6fca | 2018-01-18 18:11:48 +0100 | [diff] [blame] | 239 | |
| 240 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 241 | CriteriaQuery<UserGroup> criteriaQuery = |
| margaretha | 71e6fca | 2018-01-18 18:11:48 +0100 | [diff] [blame] | 242 | criteriaBuilder.createQuery(UserGroup.class); |
| 243 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 244 | 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); |
| margaretha | 71e6fca | 2018-01-18 18:11:48 +0100 | [diff] [blame] | 249 | |
| 250 | Predicate p = criteriaBuilder.and( |
| 251 | criteriaBuilder.equal(root.get(UserGroup_.status), |
| 252 | UserGroupStatus.HIDDEN), |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 253 | criteriaBuilder.equal(query.get(QueryDO_.id), queryId)); |
| margaretha | c9f1dfa | 2018-02-07 17:50:33 +0100 | [diff] [blame] | 254 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 255 | criteriaQuery.select(root); |
| 256 | criteriaQuery.where(p); |
| 257 | Query q = entityManager.createQuery(criteriaQuery); |
| margaretha | 71e6fca | 2018-01-18 18:11:48 +0100 | [diff] [blame] | 258 | |
| 259 | try { |
| 260 | return (UserGroup) q.getSingleResult(); |
| 261 | } |
| 262 | catch (NoResultException e) { |
| 263 | throw new KustvaktException(StatusCodes.NO_RESULT_FOUND, |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 264 | "No hidden group for query with id " + queryId |
| margaretha | b5e1e0a | 2019-01-29 22:11:57 +0100 | [diff] [blame] | 265 | + " is found", |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 266 | String.valueOf(queryId), e); |
| margaretha | 71e6fca | 2018-01-18 18:11:48 +0100 | [diff] [blame] | 267 | } |
| 268 | |
| 269 | } |
| margaretha | 45dde68 | 2018-01-04 21:33:46 +0100 | [diff] [blame] | 270 | |
| margaretha | 398f472 | 2019-01-09 19:07:20 +0100 | [diff] [blame] | 271 | /** |
| 272 | * This is an admin function. It retrieves all groups given the |
| 273 | * userId |
| margaretha | 293ee03 | 2018-03-20 20:11:52 +0100 | [diff] [blame] | 274 | * and status. |
| 275 | * |
| 276 | * @param userId |
| 277 | * @param status |
| 278 | * @return a list of {@link UserGroup}s |
| 279 | * @throws KustvaktException |
| 280 | */ |
| margaretha | dc51507 | 2018-08-03 17:01:19 +0200 | [diff] [blame] | 281 | @SuppressWarnings("unchecked") |
| margaretha | 293ee03 | 2018-03-20 20:11:52 +0100 | [diff] [blame] | 282 | 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); |
| margaretha | 18533fd | 2018-03-28 16:01:06 +0200 | [diff] [blame] | 297 | restrictions = criteriaBuilder.and(criteriaBuilder |
| 298 | .equal(members.get(UserGroupMember_.userId), userId)); |
| 299 | |
| 300 | if (status != null) { |
| margaretha | 293ee03 | 2018-03-20 20:11:52 +0100 | [diff] [blame] | 301 | restrictions = criteriaBuilder.and(restrictions, criteriaBuilder |
| 302 | .equal(root.get(UserGroup_.status), status)); |
| 303 | } |
| 304 | } |
| 305 | else if (status != null) { |
| margaretha | 18533fd | 2018-03-28 16:01:06 +0200 | [diff] [blame] | 306 | restrictions = |
| 307 | criteriaBuilder.equal(root.get(UserGroup_.status), status); |
| 308 | |
| margaretha | 293ee03 | 2018-03-20 20:11:52 +0100 | [diff] [blame] | 309 | } |
| 310 | |
| 311 | query.select(root); |
| margaretha | 18533fd | 2018-03-28 16:01:06 +0200 | [diff] [blame] | 312 | if (restrictions != null) { |
| margaretha | 293ee03 | 2018-03-20 20:11:52 +0100 | [diff] [blame] | 313 | 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, |
| margaretha | b5e1e0a | 2019-01-29 22:11:57 +0100 | [diff] [blame] | 322 | "No group with status " + status + " is found", |
| 323 | status.toString()); |
| margaretha | 293ee03 | 2018-03-20 20:11:52 +0100 | [diff] [blame] | 324 | } |
| 325 | |
| 326 | } |
| 327 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 328 | public void addQueryToGroup (QueryDO query, String createdBy, |
| 329 | QueryAccessStatus status, UserGroup group) { |
| 330 | QueryAccess accessGroup = new QueryAccess(); |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 331 | accessGroup.setCreatedBy(createdBy); |
| 332 | accessGroup.setStatus(status); |
| 333 | accessGroup.setUserGroup(group); |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 334 | accessGroup.setQuery(query);; |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 335 | entityManager.persist(accessGroup); |
| 336 | } |
| 337 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 338 | public void addQueryToGroup (List<QueryDO> queries, |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 339 | String createdBy, UserGroup group, |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 340 | QueryAccessStatus status) { |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 341 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 342 | for (QueryDO q : queries) { |
| 343 | addQueryToGroup(q, createdBy, status, group); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 344 | } |
| 345 | } |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 346 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 347 | public void deleteQueryFromGroup (int queryId, int groupId) |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 348 | throws KustvaktException { |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 349 | ParameterChecker.checkIntegerValue(queryId, "queryId"); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 350 | ParameterChecker.checkIntegerValue(groupId, "groupId"); |
| 351 | |
| 352 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 353 | CriteriaQuery<QueryAccess> criteriaQuery = |
| 354 | criteriaBuilder.createQuery(QueryAccess.class); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 355 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 356 | 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); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 361 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 362 | Predicate query = criteriaBuilder |
| 363 | .equal(queryAccess.get(QueryDO_.id), queryId); |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 364 | Predicate userGroup = |
| 365 | criteriaBuilder.equal(group.get(UserGroup_.id), groupId); |
| 366 | |
| margaretha | b097fb0 | 2021-02-22 19:28:33 +0100 | [diff] [blame] | 367 | 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); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 373 | } |
| 374 | |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 375 | } |