blob: 47fef03814173d6dbf8652c9034f981956bf7213 [file] [log] [blame]
package de.ids_mannheim.korap.dao;
import java.util.HashSet;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import de.ids_mannheim.korap.constant.GroupMemberStatus;
import de.ids_mannheim.korap.entity.Role;
import de.ids_mannheim.korap.entity.Role_;
import de.ids_mannheim.korap.entity.UserGroupMember;
import de.ids_mannheim.korap.entity.UserGroupMember_;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
import de.ids_mannheim.korap.utils.ParameterChecker;
/** Manages database transactions regarding {@link UserGroupMember} entity and
* database table.
*
* @author margaretha
* @see UserGroupMember
*
*/
@Transactional
@Repository
public class UserGroupMemberDao {
@PersistenceContext
private EntityManager entityManager;
public void addMember (UserGroupMember member) throws KustvaktException {
ParameterChecker.checkObjectValue(member, "userGroupMember");
entityManager.persist(member);
}
public void updateMember (UserGroupMember member) throws KustvaktException {
ParameterChecker.checkObjectValue(member, "UserGroupMember");
entityManager.merge(member);
}
public void deleteMember (UserGroupMember member, String deletedBy,
boolean isSoftDelete) throws KustvaktException {
ParameterChecker.checkObjectValue(member, "UserGroupMember");
ParameterChecker.checkStringValue(deletedBy, "deletedBy");
if (!entityManager.contains(member)) {
member = entityManager.merge(member);
}
if (isSoftDelete) {
member.setStatus(GroupMemberStatus.DELETED);
member.setDeletedBy(deletedBy);
member.setRoles(new HashSet<>());
entityManager.persist(member);
}
else {
member.setRoles(new HashSet<>());
entityManager.remove(member);
}
}
public UserGroupMember retrieveMemberById (String userId, int groupId)
throws KustvaktException {
ParameterChecker.checkStringValue(userId, "userId");
ParameterChecker.checkIntegerValue(groupId, "groupId");
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupMember> query =
criteriaBuilder.createQuery(UserGroupMember.class);
Root<UserGroupMember> root = query.from(UserGroupMember.class);
Predicate predicate = criteriaBuilder.and(
criteriaBuilder.equal(root.get(UserGroupMember_.group),
groupId),
criteriaBuilder.equal(root.get(UserGroupMember_.userId),
userId));
query.select(root);
query.where(predicate);
Query q = entityManager.createQuery(query);
try {
return (UserGroupMember) q.getSingleResult();
}
catch (NoResultException e) {
throw new KustvaktException(StatusCodes.GROUP_MEMBER_NOT_FOUND,
userId + " is not found in the group", userId);
}
}
public List<UserGroupMember> retrieveMemberByRole (int groupId, int roleId)
throws KustvaktException {
ParameterChecker.checkIntegerValue(roleId, "roleId");
ParameterChecker.checkIntegerValue(groupId, "groupId");
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupMember> query =
criteriaBuilder.createQuery(UserGroupMember.class);
Root<UserGroupMember> root = query.from(UserGroupMember.class);
Join<UserGroupMember, Role> memberRole = root.join("roles");
Predicate predicate = criteriaBuilder.and(
criteriaBuilder.equal(root.get(UserGroupMember_.group),
groupId),
criteriaBuilder.equal(root.get(UserGroupMember_.status),
GroupMemberStatus.ACTIVE),
criteriaBuilder.equal(memberRole.get(Role_.id), roleId));
query.select(root);
query.where(predicate);
Query q = entityManager.createQuery(query);
try {
return q.getResultList();
}
catch (NoResultException e) {
throw new KustvaktException(
StatusCodes.NO_RESULT_FOUND, "No member with role " + roleId
+ " is found in group " + groupId,
String.valueOf(roleId));
}
}
public List<UserGroupMember> retrieveMemberByGroupId (int groupId)
throws KustvaktException {
return retrieveMemberByGroupId(groupId, false);
}
public List<UserGroupMember> retrieveMemberByGroupId (int groupId,
boolean isAdmin) throws KustvaktException {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserGroupMember> query =
criteriaBuilder.createQuery(UserGroupMember.class);
Root<UserGroupMember> root = query.from(UserGroupMember.class);
Predicate predicate = criteriaBuilder.and(criteriaBuilder
.equal(root.get(UserGroupMember_.group), groupId));
if (!isAdmin) {
predicate = criteriaBuilder.and(predicate,
criteriaBuilder.notEqual(root.get(UserGroupMember_.status),
GroupMemberStatus.DELETED));
}
query.select(root);
query.where(predicate);
Query q = entityManager.createQuery(query);
try {
return q.getResultList();
}
catch (NoResultException e) {
throw new KustvaktException(StatusCodes.NO_RESULT_FOUND,
"No member is found in group " + groupId,
String.valueOf(groupId));
}
}
}