| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 1 | package de.ids_mannheim.korap.dao; |
| 2 | |
| 3 | import java.util.List; |
| 4 | |
| 5 | import javax.persistence.EntityManager; |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 6 | import javax.persistence.NoResultException; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 7 | import javax.persistence.PersistenceContext; |
| 8 | import javax.persistence.Query; |
| 9 | import javax.persistence.criteria.CriteriaBuilder; |
| 10 | import javax.persistence.criteria.CriteriaQuery; |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 11 | import javax.persistence.criteria.Join; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 12 | import javax.persistence.criteria.Predicate; |
| 13 | import javax.persistence.criteria.Root; |
| 14 | |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 15 | import org.springframework.stereotype.Repository; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 16 | import org.springframework.transaction.annotation.Transactional; |
| 17 | |
| margaretha | f438c59 | 2017-10-25 15:23:50 +0200 | [diff] [blame] | 18 | import de.ids_mannheim.korap.constant.GroupMemberStatus; |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 19 | import de.ids_mannheim.korap.entity.Role; |
| margaretha | 0b63de4 | 2017-12-20 18:48:09 +0100 | [diff] [blame] | 20 | import de.ids_mannheim.korap.entity.Role_; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 21 | import de.ids_mannheim.korap.entity.UserGroupMember; |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 22 | import de.ids_mannheim.korap.entity.UserGroupMember_; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 23 | import de.ids_mannheim.korap.exceptions.KustvaktException; |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 24 | import de.ids_mannheim.korap.exceptions.StatusCodes; |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 25 | import de.ids_mannheim.korap.utils.ParameterChecker; |
| 26 | |
| 27 | @Transactional |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 28 | @Repository |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 29 | public class UserGroupMemberDao { |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 30 | |
| 31 | @PersistenceContext |
| 32 | private EntityManager entityManager; |
| 33 | |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 34 | public void addMember (UserGroupMember member) throws KustvaktException { |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 35 | ParameterChecker.checkObjectValue(member, "userGroupMember"); |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 36 | entityManager.persist(member); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 37 | } |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 38 | |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 39 | public void addMembers (List<UserGroupMember> members) |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 40 | throws KustvaktException { |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 41 | ParameterChecker.checkObjectValue(members, "List<UserGroupMember>"); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 42 | |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 43 | for (UserGroupMember member : members) { |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 44 | addMember(member); |
| 45 | } |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 46 | } |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 47 | |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 48 | public void approveMember (String userId, int groupId) |
| 49 | throws KustvaktException { |
| 50 | ParameterChecker.checkStringValue(userId, "userId"); |
| 51 | ParameterChecker.checkIntegerValue(groupId, "groupId"); |
| 52 | |
| 53 | UserGroupMember member = retrieveMemberById(userId, groupId); |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 54 | if (member.getStatus().equals(GroupMemberStatus.DELETED)) { |
| 55 | throw new KustvaktException(StatusCodes.NOTHING_CHANGED, "Username " |
| 56 | + userId + " had been deleted in group " + groupId, userId); |
| 57 | } |
| 58 | |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 59 | member.setStatus(GroupMemberStatus.ACTIVE); |
| 60 | entityManager.persist(member); |
| 61 | } |
| 62 | |
| 63 | public void deleteMember (String userId, int groupId, boolean isSoftDelete) |
| 64 | throws KustvaktException { |
| 65 | ParameterChecker.checkStringValue(userId, "userId"); |
| 66 | ParameterChecker.checkIntegerValue(groupId, "groupId"); |
| 67 | |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 68 | UserGroupMember member = retrieveMemberById(userId, groupId); |
| 69 | |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 70 | if (isSoftDelete) { |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 71 | member.setStatus(GroupMemberStatus.DELETED); |
| 72 | entityManager.persist(member); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 73 | } |
| 74 | else { |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 75 | entityManager.remove(member); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 76 | } |
| 77 | } |
| 78 | |
| 79 | public UserGroupMember retrieveMemberById (String userId, int groupId) |
| 80 | throws KustvaktException { |
| 81 | ParameterChecker.checkStringValue(userId, "userId"); |
| 82 | ParameterChecker.checkIntegerValue(groupId, "groupId"); |
| 83 | |
| 84 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); |
| 85 | CriteriaQuery<UserGroupMember> query = |
| 86 | criteriaBuilder.createQuery(UserGroupMember.class); |
| 87 | |
| 88 | Root<UserGroupMember> root = query.from(UserGroupMember.class); |
| 89 | |
| 90 | Predicate predicate = criteriaBuilder.and( |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 91 | criteriaBuilder.equal(root.get(UserGroupMember_.group), |
| 92 | groupId), |
| 93 | criteriaBuilder.equal(root.get(UserGroupMember_.userId), |
| 94 | userId)); |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 95 | |
| 96 | query.select(root); |
| 97 | query.where(predicate); |
| 98 | Query q = entityManager.createQuery(query); |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 99 | |
| 100 | try { |
| 101 | return (UserGroupMember) q.getSingleResult(); |
| 102 | } |
| 103 | catch (NoResultException e) { |
| 104 | throw new KustvaktException(StatusCodes.NO_RESULT_FOUND, |
| 105 | "Username " + userId + " is not found in group " + groupId, |
| 106 | userId); |
| 107 | } |
| 108 | |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 109 | } |
| 110 | |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 111 | public List<UserGroupMember> retrieveMemberByRole (int groupId, int roleId) |
| 112 | throws KustvaktException { |
| margaretha | cfea1ae | 2018-01-15 20:27:26 +0100 | [diff] [blame^] | 113 | ParameterChecker.checkIntegerValue(roleId, "roleId"); |
| 114 | ParameterChecker.checkIntegerValue(groupId, "groupId"); |
| 115 | |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 116 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); |
| 117 | CriteriaQuery<UserGroupMember> query = |
| 118 | criteriaBuilder.createQuery(UserGroupMember.class); |
| 119 | |
| 120 | Root<UserGroupMember> root = query.from(UserGroupMember.class); |
| 121 | Join<UserGroupMember, Role> memberRole = root.join("roles"); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 122 | |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 123 | Predicate predicate = criteriaBuilder.and( |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 124 | criteriaBuilder.equal(root.get(UserGroupMember_.group), |
| 125 | groupId), |
| margaretha | 0b63de4 | 2017-12-20 18:48:09 +0100 | [diff] [blame] | 126 | criteriaBuilder.notEqual(root.get(UserGroupMember_.status), |
| 127 | GroupMemberStatus.DELETED), |
| 128 | criteriaBuilder.equal(memberRole.get(Role_.id), roleId)); |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 129 | |
| 130 | query.select(root); |
| 131 | query.where(predicate); |
| 132 | Query q = entityManager.createQuery(query); |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 133 | try { |
| 134 | return q.getResultList(); |
| 135 | } |
| 136 | catch (NoResultException e) { |
| 137 | throw new KustvaktException( |
| 138 | StatusCodes.NO_RESULT_FOUND, "No member with role " + roleId |
| 139 | + " is found in group " + groupId, |
| 140 | String.valueOf(roleId)); |
| 141 | } |
| margaretha | d3c0fc9 | 2017-10-25 15:03:32 +0200 | [diff] [blame] | 142 | } |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 143 | |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 144 | public List<UserGroupMember> retrieveMemberByGroupId (int groupId) |
| 145 | throws KustvaktException { |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 146 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); |
| 147 | CriteriaQuery<UserGroupMember> query = |
| 148 | criteriaBuilder.createQuery(UserGroupMember.class); |
| 149 | |
| 150 | Root<UserGroupMember> root = query.from(UserGroupMember.class); |
| 151 | |
| margaretha | 0b63de4 | 2017-12-20 18:48:09 +0100 | [diff] [blame] | 152 | Predicate predicate = criteriaBuilder.and( |
| 153 | criteriaBuilder.equal(root.get(UserGroupMember_.group), |
| 154 | groupId), |
| 155 | criteriaBuilder.notEqual(root.get(UserGroupMember_.status), |
| 156 | GroupMemberStatus.DELETED)); |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 157 | |
| 158 | query.select(root); |
| 159 | query.where(predicate); |
| 160 | Query q = entityManager.createQuery(query); |
| margaretha | 9d3eb04 | 2017-12-22 11:02:30 +0100 | [diff] [blame] | 161 | |
| 162 | try { |
| 163 | return q.getResultList(); |
| 164 | } |
| 165 | catch (NoResultException e) { |
| 166 | throw new KustvaktException(StatusCodes.NO_RESULT_FOUND, |
| 167 | "No member is found in group " + groupId, |
| 168 | String.valueOf(groupId)); |
| 169 | } |
| margaretha | 61966dd | 2017-10-26 19:32:21 +0200 | [diff] [blame] | 170 | } |
| margaretha | bf11d8d | 2017-10-24 19:31:44 +0200 | [diff] [blame] | 171 | } |