package br.gov.mj.sislegis.app.service.ejbs;
import java.math.BigInteger;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import br.gov.mj.sislegis.app.model.Comentario;
import br.gov.mj.sislegis.app.model.Usuario;
import br.gov.mj.sislegis.app.service.AbstractPersistence;
import br.gov.mj.sislegis.app.service.ComentarioService;
@Stateless
public class ComentarioServiceEjb extends AbstractPersistence<Comentario, Long> implements ComentarioService {
@PersistenceContext
private EntityManager em;
public ComentarioServiceEjb() {
super(Comentario.class);
}
@Override
protected EntityManager getEntityManager() {
return em;
}
@Override
public List<Comentario> findByIdProposicao(Integer id) {
return findByIdProposicao(id, false);
}
@Override
public List<Comentario> findByIdProposicao(Integer id, boolean incluiOcultos) {
StringBuilder query = new StringBuilder(
"SELECT DISTINCT c FROM Comentario c INNER JOIN FETCH c.autor a INNER JOIN FETCH c.proposicao p WHERE p.idProposicao = :entityId ");
if (!incluiOcultos) {
query.append("AND c.oculto = FALSE");
}
query.append(" ORDER BY c.dataCriacao ");
TypedQuery<Comentario> findByIdQuery = em.createQuery(query.toString(), Comentario.class);
findByIdQuery.setParameter("entityId", id);
final List<Comentario> results = findByIdQuery.getResultList();
return results;
}
@Override
public List<Comentario> findByProposicaoId(Long id) {
return findByProposicaoId(id, false);
}
@Override
public List<Comentario> findByProposicaoId(Long id, boolean incluiOcultos) {
StringBuilder query = new StringBuilder(
"SELECT DISTINCT c FROM Comentario c INNER JOIN FETCH c.autor a INNER JOIN FETCH c.proposicao p WHERE p.id = :entityId ");
if (!incluiOcultos) {
query.append("AND c.oculto = FALSE");
}
TypedQuery<Comentario> findByIdQuery = em.createQuery(query.toString(), Comentario.class);
findByIdQuery.setParameter("entityId", id);
final List<Comentario> results = findByIdQuery.getResultList();
return results;
}
@Override
public void salvarComentario(Comentario comentario, Usuario autor) throws IllegalAccessException {
if (comentario.getId() != null) {
if (comentario.getAutor() != null) {
if (!comentario.getAutor().getEmail().equals(autor.getEmail())) {
throw new IllegalAccessException("Somente autor do comentário pode alterá-lo.");
}
}
}
comentario.setAutor(autor);
save(comentario);
}
@Override
public Integer totalByProposicao(Long idProposicao) {
Query query = em
.createNativeQuery("SELECT COUNT(1) FROM comentario WHERE proposicao_id = :idProposicao AND oculto = FALSE ");
query.setParameter("idProposicao", idProposicao);
BigInteger total = (BigInteger) query.getSingleResult();
return total.intValue();
}
@Override
public void ocultar(Long idComentario) {
Comentario comentario = findById(idComentario);
comentario.setOculto(true);
save(comentario);
}
}