package net.techreadiness.persistence.dao;
import java.util.Collection;
import java.util.List;
import javax.persistence.TypedQuery;
import net.techreadiness.persistence.domain.OrgDO;
import net.techreadiness.persistence.domain.UserOrgDO;
import net.techreadiness.service.exception.ValidationServiceException;
import org.springframework.stereotype.Repository;
@Repository
public class UserOrgDAOImpl extends BaseDAOImpl<UserOrgDO> implements UserOrgDAO {
@Override
public void delete(UserOrgDO t) {
TypedQuery<Long> query = em.createQuery(
"select count(uo.userOrgId) from UserOrgDO uo where uo.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 authorized organization for a user. A user must always have at least one authorized org.");
}
}
@Override
public UserOrgDO getUserOrgByUserIdAndOrgId(Long userId, Long orgId) {
StringBuilder sb = new StringBuilder();
sb.append("select uo ");
sb.append("from UserOrgDO uo ");
sb.append("where uo.user.userId =:userId ");
sb.append("and uo.org.orgId =:orgId ");
TypedQuery<UserOrgDO> query = em.createQuery(sb.toString(), UserOrgDO.class);
query.setParameter("userId", userId);
query.setParameter("orgId", orgId);
query.setMaxResults(1);
return getSingleResult(query);
}
@Override
public List<UserOrgDO> getUserOrgByUserId(Long scopeId, Long userId) {
StringBuilder sb = new StringBuilder();
sb.append("select uo ");
sb.append("from UserOrgDO uo ");
sb.append("join fetch uo.org o ");
sb.append("join fetch uo.user ");
sb.append("join fetch o.scope s ");
sb.append("where uo.user.userId =:userId and s.scopeId = :scopeId");
TypedQuery<UserOrgDO> query = em.createQuery(sb.toString(), UserOrgDO.class);
query.setParameter("userId", userId);
query.setParameter("scopeId", scopeId);
return getResultList(query);
}
@Override
public boolean isOrgModifiable(Long userId, Long orgId, Long scopeId) {
TypedQuery<OrgDO> query = em.createQuery("select o from OrgDO o join o.orgTrees ot, UserOrgDO uo, ScopeTreeDO st "
+ "where ot.ancestorOrg.orgId = uo.org.orgId "
+ "and ot.ancestorOrg.scope.scopeId = st.ancestorScope.scopeId " + "and st.scope.scopeId = :scopeId "
+ "and uo.user.userId = :userId and o.orgId = :orgId", OrgDO.class);
query.setParameter("scopeId", scopeId);
query.setParameter("userId", userId);
query.setParameter("orgId", orgId);
OrgDO org = getSingleResult(query);
return org != null;
}
@Override
public List<OrgDO> findOrgsForUsers(Long scopeId, Long orgId, Collection<Long> userIds) {
StringBuilder sb = new StringBuilder();
sb.append("select distinct o from OrgDO o ");
sb.append("join o.userOrgs uo ");
sb.append("where uo.user.userId in (:userIds) ");
sb.append("and uo.org.orgId in (select ot.org.orgId from OrgTreeDO ot where ot.ancestorOrg.orgId = :orgId) ");
sb.append("and uo.user.scope.scopeId in (select st.ancestorScope.scopeId from ScopeTreeDO st where st.scope.scopeId = :scopeId and st.ancestorScope.scopeType.allowUser = true) ");
TypedQuery<OrgDO> query = em.createQuery(sb.toString(), OrgDO.class);
query.setParameter("userIds", userIds);
query.setParameter("scopeId", scopeId);
query.setParameter("orgId", orgId);
return query.getResultList();
}
}