package net.techreadiness.persistence.dao; import java.util.Collection; import java.util.List; import javax.persistence.TypedQuery; import net.techreadiness.persistence.domain.RoleDO; import net.techreadiness.persistence.domain.UserRoleDO; import net.techreadiness.service.exception.ValidationServiceException; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @Repository @Scope("prototype") public class UserRoleDAOImpl extends BaseDAOImpl<UserRoleDO> implements UserRoleDAO { @Override public void delete(UserRoleDO t) { TypedQuery<Long> query = em.createQuery( "select count(ur.userRoleId) from UserRoleDO ur where ur.user.userId = :userId", Long.class); query.setParameter("userId", t.getUser().getUserId()); Long count = query.getSingleResult(); if (count.compareTo(Long.valueOf(1)) > 0) { super.delete(t); } else { throw new ValidationServiceException( "Attempting to delete the last role for a user. A user must always have at least role."); } } @Override public UserRoleDO getUserRoleByUserIdAndRoleId(Long userId, Long roleId) { StringBuilder sb = new StringBuilder(); sb.append("select ur "); sb.append("from UserRoleDO ur "); sb.append("where ur.user.userId =:userId "); sb.append("and ur.role.roleId =:roleId "); TypedQuery<UserRoleDO> query = em.createQuery(sb.toString(), UserRoleDO.class); query.setParameter("userId", userId); query.setParameter("roleId", roleId); query.setMaxResults(1); query.setHint("org.hibernate.cacheable", Boolean.TRUE); return getSingleResult(query); } @Override public List<UserRoleDO> findUserRolesByUser(Long userId) { StringBuilder sb = new StringBuilder(); sb.append("select ur "); sb.append("from UserRoleDO ur "); sb.append("join fetch ur.role "); sb.append("where ur.user.userId =:userId "); TypedQuery<UserRoleDO> query = em.createQuery(sb.toString(), UserRoleDO.class); query.setParameter("userId", userId); query.setHint("org.hibernate.cacheable", Boolean.TRUE); return getResultList(query); } @Override public List<RoleDO> findRolesForUsers(Long scopeId, Collection<Long> userIds) { StringBuilder sb = new StringBuilder(); sb.append("select distinct r from RoleDO r "); sb.append("join r.userRoles ur "); sb.append("where ur.user.userId in (:userIds) "); sb.append("and ur.user.scope.scopeId in (select st.ancestorScope.scopeId from ScopeTreeDO st where st.scope.scopeId = :scopeId and st.ancestorScope.scopeType.allowUser = true) "); TypedQuery<RoleDO> query = em.createQuery(sb.toString(), RoleDO.class); query.setParameter("userIds", userIds); query.setParameter("scopeId", scopeId); return query.getResultList(); } }