package femr.data.daos.system; import com.avaje.ebean.Ebean; import com.avaje.ebean.ExpressionList; import com.avaje.ebean.Query; import com.google.inject.Inject; import femr.business.helpers.QueryProvider; import femr.data.daos.core.IUserRepository; import femr.data.models.core.ILoginAttempt; import femr.data.models.core.IRole; import femr.data.models.core.IUser; import femr.data.models.mysql.Role; import femr.data.models.mysql.User; import femr.util.calculations.dateUtils; import femr.util.stringhelpers.StringUtils; import play.Logger; import javax.inject.Provider; import java.util.List; /** * Created by ajsaclayan on 11/20/16. */ public class UserRepository implements IUserRepository { private final Provider<ILoginAttempt> loginAttemptProvider; private final Provider<IRole> roleProvider; private final Provider<IUser> userProvider; @Inject public UserRepository(Provider<ILoginAttempt> loginAttemptProvider, Provider<IUser> userProvider, Provider<IRole> roleProvider) { this.loginAttemptProvider = loginAttemptProvider; this.roleProvider = roleProvider; this.userProvider = userProvider; } /** * {@inheritDoc} */ @Override public ILoginAttempt createLoginAttempt(String usernameValue, boolean isSuccessful, byte[] ipAddress, Integer userId) { ILoginAttempt loginAttempt = loginAttemptProvider.get(); if (StringUtils.isNullOrWhiteSpace(usernameValue) || ipAddress == null) { return null; } try { loginAttempt.setLoginDate(dateUtils.getCurrentDateTime()); loginAttempt.setIsSuccessful(isSuccessful); loginAttempt.setUsernameAttempt(usernameValue); loginAttempt.setIp_address(ipAddress); if (userId == null) loginAttempt.setUser(null); else loginAttempt.setUser(Ebean.getReference(userProvider.get().getClass(), userId)); Ebean.save(loginAttempt); } catch (Exception ex) { Logger.error("UserRepository-createLoginAttempt", ex); throw ex; } return loginAttempt; } /** * {@inheritDoc} */ @Override public IRole createRole(int id, String name){ if (StringUtils.isNullOrWhiteSpace(name)) { return null; } IRole role = roleProvider.get(); role.setId(id); role.setName(name); try { Ebean.save(role); } catch (Exception ex) { Logger.error("UserRepository-createRole", ex); throw ex; } return role; } /** * {@inheritDoc} */ @Override public IUser createUser(IUser user){ try { Ebean.save(user); } catch (Exception ex) { Logger.error("UserRepository-createUser", ex); throw ex; } return user; } /** * {@inheritDoc} */ @Override public Integer countUsers() { Integer count = 0; //get an empty user for ebean to specify the table IUser user = userProvider.get(); try { count = Ebean.find(user.getClass()).findCount(); } catch (Exception ex) { Logger.error("UserRepository-countUsers", ex); throw ex; } return count; } /** * {@inheritDoc} */ @Override public IUser updateUser(IUser user){ try { Ebean.update(user); } catch (Exception ex) { Logger.error("UserRepository-updateUser", ex); throw ex; } return user; } /** * {@inheritDoc} */ @Override public IUser retrieveUserById(Integer userId){ ExpressionList<User> userQuery = QueryProvider.getUserQuery().fetch("roles").where().eq("id", userId); IUser user = null; try { user = userQuery.findUnique(); } catch (Exception ex) { Logger.error("UserRepository-retrieveUserById", ex); throw ex; } return user; } /** * {@inheritDoc} */ @Override public IUser retrieveUserByEmail(String email){ ExpressionList<User> userQuery = QueryProvider.getUserQuery().fetch("roles").where().eq("email", email); IUser user = null; try{ user = userQuery.findUnique(); } catch (Exception ex) { Logger.error("UserRepository-retrieveUserByEmail", ex); throw ex; } return user; } /** * {@inheritDoc} */ @Override public List<?extends IUser> retrieveAllUsers() { Query<User> userQuery = QueryProvider.getUserQuery() .where() .ne("email", "superuser") .ne("email", "admin") .orderBy("lastName"); List<? extends IUser> users; try{ users = userQuery.findList(); }catch(Exception ex){ Logger.error("UserRepository-retrieveAllUsers", ex); throw ex; } return users; } /** * {@inheritDoc} */ @Override public List<?extends IUser> retrieveUsersByTripId(Integer tripId){ ExpressionList<User> userQuery = QueryProvider.getUserQuery() .fetch("missionTrips") .where() .eq("missionTrips.id", tripId); List<? extends IUser> users; try{ users = userQuery.findList(); }catch(Exception ex){ Logger.error("UserRepository-retrieveUsersByTripId", ex); throw ex; } return users; } /** * {@inheritDoc} */ @Override public List<? extends IRole> retrieveAllRoles(){ ExpressionList<Role> roleQuery = QueryProvider.getRoleQuery() .where() .ne("name", "SuperUser"); List<? extends IRole> allRoles; try{ allRoles = roleQuery.findList(); } catch (Exception ex){ Logger.error("UserRepository-retrieveAllRoles", ex); throw ex; } return allRoles; } /** * {@inheritDoc} */ @Override public List<? extends IRole> retrieveRolesByName(List<String> roleNames){ if (roleNames == null){ return null; } ExpressionList<Role> query = QueryProvider.getRoleQuery() .where() .in("name", roleNames); List<? extends IRole> roles; try{ roles = query.findList(); } catch(Exception ex){ Logger.error("UserRepository-retrieveRolesByName", ex); throw ex; } return roles; } /** * {@inheritDoc} */ @Override public IRole retrieveRoleByName(String roleName) { if (StringUtils.isNullOrWhiteSpace(roleName)) { return null; } IRole role = roleProvider.get(); try { role = Ebean.find(role.getClass()) .where() .eq("name", roleName) .findUnique(); } catch (Exception ex) { Logger.error("UserRepository-retrieveRoleByName", ex); throw ex; } return role; } }