GroupMembershipFacade.java 4 KB
package fi.insomnia.bortal.facade;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.GroupMembership_;
import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.PlaceGroup_;
import fi.insomnia.bortal.model.Place_;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.utilities.PasswordFunctions;

@Stateless
@LocalBean
public class GroupMembershipFacade extends IntegerPkGenericFacade<GroupMembership> {

	private static final Logger logger = LoggerFactory.getLogger(GroupMembershipFacade.class);
	@PersistenceContext
	private EntityManager em;

	@EJB
	private EventBeanLocal eventbean;

	public GroupMembershipFacade() {
		super(GroupMembership.class);
	}

	@Override
	protected EntityManager getEm() {
		return em;
	}

	public String createInviteToken() {
		String token = null;
		GroupMembership gm = null;
		do {
			if (token != null) {
				logger.info("Generated token {} found from GoupMembership: {} Generating new!", token, gm);
			}
			token = eventbean.getCurrentEvent().getId().toString();
			token += PasswordFunctions.generateRandomString(15);
			gm = findByToken(token);
		} while (gm != null);
		return token;
	}

	public GroupMembership findByToken(String token) {
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<GroupMembership> cq = cb.createQuery(GroupMembership.class);
		Root<GroupMembership> root = cq.from(GroupMembership.class);

		cq.where(cb.equal(root.get(GroupMembership_.inviteToken), token),
				cb.equal(root.get(GroupMembership_.placeGroup).get(PlaceGroup_.event), eventbean.getCurrentEvent())
				);

		// TypedQuery<GroupMembership> q =
		// em.createQuery("Select gm from GroupMembership gm where gm.inviteToken = :token ",
		// GroupMembership.class);
		// q.setParameter("token", token);
		return getSingleNullableResult(em.createQuery(cq));
	}

	public List<GroupMembership> findMemberOrCreator(User user) {
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<GroupMembership> cq = cb.createQuery(GroupMembership.class);
		Root<GroupMembership> root = cq.from(GroupMembership.class);
		Path<PlaceGroup> pg = root.get(GroupMembership_.placeGroup);

		cq.where(
				cb.or(cb.equal(root.get(GroupMembership_.user), user),
						cb.equal(pg.get(PlaceGroup_.creator), user)
						),
				cb.equal(pg.get(PlaceGroup_.event), eventbean.getCurrentEvent())
				);
		cq.orderBy(cb.asc(root.get(GroupMembership_.placeReservation).get(Place_.name)));
		// TypedQuery<GroupMembership> p =
		// em.createQuery("select gm from GroupMembership gm where gm.id.eventId = :eventid and (gm.placeGroup.creator = :user or gm.user = :user) order by gm.placeReservation.name",
		// GroupMembership.class);
		// p.setParameter("eventid", event.getId());
		// p.setParameter("user", user);
		return em.createQuery(cq).getResultList();
	}

	public List<GroupMembership> findMemberships(User user) {
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<GroupMembership> cq = cb.createQuery(GroupMembership.class);
		Root<GroupMembership> root = cq.from(GroupMembership.class);

		Path<PlaceGroup> pg = root.get(GroupMembership_.placeGroup);

		cq.where(cb.equal(root.get(GroupMembership_.user), user),
				cb.equal(pg.get(PlaceGroup_.event), eventbean.getCurrentEvent())
				);
		return em.createQuery(cq).getResultList();

		// TypedQuery<GroupMembership> p =
		// em.createQuery("select gm from GroupMembership gm where gm.id.eventId = :eventid and gm.user = :user",
		// GroupMembership.class);
		// p.setParameter("eventid", event.getId());
		// p.setParameter("user", user);
		// return p.getResultList();
	}

}