package com.lyndir.omicron.webapp.data.service.impl.jpa;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import com.lyndir.lhunath.opal.jpa.Persist;
import com.lyndir.lhunath.opal.system.logging.Logger;
import com.lyndir.omicron.webapp.data.*;
import com.lyndir.omicron.webapp.data.service.*;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.persistence.EntityManager;
/**
* @author lhunath
*/
public class UserDAOImpl implements UserDAO {
private static final Logger logger = Logger.get( UserDAOImpl.class );
private final EntityManager db;
private final EmailAddressDAO emailAddressDAO;
@Inject
public UserDAOImpl(final Persist persist, final EmailAddressDAO emailAddressDAO) {
db = persist.getEntityManager();
this.emailAddressDAO = emailAddressDAO;
}
@Nonnull
@Override
public User newUser(final String emailAddress, final String name)
throws EmailAddressUnavailableException {
User user = new User( emailAddressDAO.newAddress( emailAddress ), name );
db.persist( user );
return user;
}
@Override
@Nullable
public User findUser(final String emailAddress) {
return Iterables.getFirst( db.createQuery( "SELECT u FROM OEmailAddress e JOIN e.user u " + //
"WHERE u.mode = :mode AND e.address = :emailAddress", User.class )
.setParameter( "emailAddress", emailAddress )
.getResultList(), null );
}
@Nonnull
@Override
public List<User> listUsers() {
return db.createQuery( "SELECT u FROM OUser u", User.class ).getResultList();
}
}