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