blob: 35bc6cc5bbaf2b42d2ff26eff1545a9d0d2ffe55 [file] [log] [blame]
margarethabf11d8d2017-10-24 19:31:44 +02001package de.ids_mannheim.korap.dao;
2
3import java.util.List;
4
5import javax.persistence.EntityManager;
margaretha9d3eb042017-12-22 11:02:30 +01006import javax.persistence.NoResultException;
margarethabf11d8d2017-10-24 19:31:44 +02007import javax.persistence.PersistenceContext;
8import javax.persistence.Query;
9import javax.persistence.criteria.CriteriaBuilder;
10import javax.persistence.criteria.CriteriaQuery;
margarethad3c0fc92017-10-25 15:03:32 +020011import javax.persistence.criteria.Join;
margarethabf11d8d2017-10-24 19:31:44 +020012import javax.persistence.criteria.Predicate;
13import javax.persistence.criteria.Root;
14
margarethad3c0fc92017-10-25 15:03:32 +020015import org.springframework.stereotype.Repository;
margarethabf11d8d2017-10-24 19:31:44 +020016import org.springframework.transaction.annotation.Transactional;
17
margarethaf438c592017-10-25 15:23:50 +020018import de.ids_mannheim.korap.constant.GroupMemberStatus;
margarethad3c0fc92017-10-25 15:03:32 +020019import de.ids_mannheim.korap.entity.Role;
margaretha0b63de42017-12-20 18:48:09 +010020import de.ids_mannheim.korap.entity.Role_;
margarethabf11d8d2017-10-24 19:31:44 +020021import de.ids_mannheim.korap.entity.UserGroupMember;
margarethad3c0fc92017-10-25 15:03:32 +020022import de.ids_mannheim.korap.entity.UserGroupMember_;
margarethabf11d8d2017-10-24 19:31:44 +020023import de.ids_mannheim.korap.exceptions.KustvaktException;
margaretha9d3eb042017-12-22 11:02:30 +010024import de.ids_mannheim.korap.exceptions.StatusCodes;
margarethabf11d8d2017-10-24 19:31:44 +020025import de.ids_mannheim.korap.utils.ParameterChecker;
26
27@Transactional
margarethad3c0fc92017-10-25 15:03:32 +020028@Repository
margaretha61966dd2017-10-26 19:32:21 +020029public class UserGroupMemberDao {
margarethabf11d8d2017-10-24 19:31:44 +020030
31 @PersistenceContext
32 private EntityManager entityManager;
33
margaretha61966dd2017-10-26 19:32:21 +020034 public void addMember (UserGroupMember member) throws KustvaktException {
margarethabf11d8d2017-10-24 19:31:44 +020035 ParameterChecker.checkObjectValue(member, "userGroupMember");
margarethad3c0fc92017-10-25 15:03:32 +020036 entityManager.persist(member);
margarethabf11d8d2017-10-24 19:31:44 +020037 }
margaretha61966dd2017-10-26 19:32:21 +020038
margarethad3c0fc92017-10-25 15:03:32 +020039 public void addMembers (List<UserGroupMember> members)
margarethabf11d8d2017-10-24 19:31:44 +020040 throws KustvaktException {
margarethad3c0fc92017-10-25 15:03:32 +020041 ParameterChecker.checkObjectValue(members, "List<UserGroupMember>");
margarethabf11d8d2017-10-24 19:31:44 +020042
margaretha61966dd2017-10-26 19:32:21 +020043 for (UserGroupMember member : members) {
margarethad3c0fc92017-10-25 15:03:32 +020044 addMember(member);
45 }
margarethabf11d8d2017-10-24 19:31:44 +020046 }
margaretha61966dd2017-10-26 19:32:21 +020047
margarethabf11d8d2017-10-24 19:31:44 +020048 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);
margaretha9d3eb042017-12-22 11:02:30 +010054 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
margarethabf11d8d2017-10-24 19:31:44 +020059 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
margaretha9d3eb042017-12-22 11:02:30 +010068 UserGroupMember member = retrieveMemberById(userId, groupId);
69
margarethabf11d8d2017-10-24 19:31:44 +020070 if (isSoftDelete) {
margaretha9d3eb042017-12-22 11:02:30 +010071 member.setStatus(GroupMemberStatus.DELETED);
72 entityManager.persist(member);
margarethabf11d8d2017-10-24 19:31:44 +020073 }
74 else {
margaretha9d3eb042017-12-22 11:02:30 +010075 entityManager.remove(member);
margarethabf11d8d2017-10-24 19:31:44 +020076 }
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(
margaretha61966dd2017-10-26 19:32:21 +020091 criteriaBuilder.equal(root.get(UserGroupMember_.group),
92 groupId),
93 criteriaBuilder.equal(root.get(UserGroupMember_.userId),
94 userId));
margarethabf11d8d2017-10-24 19:31:44 +020095
96 query.select(root);
97 query.where(predicate);
98 Query q = entityManager.createQuery(query);
margaretha9d3eb042017-12-22 11:02:30 +010099
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
margarethabf11d8d2017-10-24 19:31:44 +0200109 }
110
margaretha9d3eb042017-12-22 11:02:30 +0100111 public List<UserGroupMember> retrieveMemberByRole (int groupId, int roleId)
112 throws KustvaktException {
margarethacfea1ae2018-01-15 20:27:26 +0100113 ParameterChecker.checkIntegerValue(roleId, "roleId");
114 ParameterChecker.checkIntegerValue(groupId, "groupId");
115
margarethad3c0fc92017-10-25 15:03:32 +0200116 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");
margaretha61966dd2017-10-26 19:32:21 +0200122
margarethad3c0fc92017-10-25 15:03:32 +0200123 Predicate predicate = criteriaBuilder.and(
margaretha61966dd2017-10-26 19:32:21 +0200124 criteriaBuilder.equal(root.get(UserGroupMember_.group),
125 groupId),
margaretha0b63de42017-12-20 18:48:09 +0100126 criteriaBuilder.notEqual(root.get(UserGroupMember_.status),
127 GroupMemberStatus.DELETED),
128 criteriaBuilder.equal(memberRole.get(Role_.id), roleId));
margarethad3c0fc92017-10-25 15:03:32 +0200129
130 query.select(root);
131 query.where(predicate);
132 Query q = entityManager.createQuery(query);
margaretha9d3eb042017-12-22 11:02:30 +0100133 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 }
margarethad3c0fc92017-10-25 15:03:32 +0200142 }
margaretha61966dd2017-10-26 19:32:21 +0200143
margaretha9d3eb042017-12-22 11:02:30 +0100144 public List<UserGroupMember> retrieveMemberByGroupId (int groupId)
145 throws KustvaktException {
margaretha61966dd2017-10-26 19:32:21 +0200146 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
147 CriteriaQuery<UserGroupMember> query =
148 criteriaBuilder.createQuery(UserGroupMember.class);
149
150 Root<UserGroupMember> root = query.from(UserGroupMember.class);
151
margaretha0b63de42017-12-20 18:48:09 +0100152 Predicate predicate = criteriaBuilder.and(
153 criteriaBuilder.equal(root.get(UserGroupMember_.group),
154 groupId),
155 criteriaBuilder.notEqual(root.get(UserGroupMember_.status),
156 GroupMemberStatus.DELETED));
margaretha61966dd2017-10-26 19:32:21 +0200157
158 query.select(root);
159 query.where(predicate);
160 Query q = entityManager.createQuery(query);
margaretha9d3eb042017-12-22 11:02:30 +0100161
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 }
margaretha61966dd2017-10-26 19:32:21 +0200170 }
margarethabf11d8d2017-10-24 19:31:44 +0200171}