package models;
import models.utils.AppException;
import models.utils.Hash;
import play.data.format.Formats;
import play.data.validation.Constraints;
import com.avaje.ebean.Model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.Date;
/**
* User: yesnault
* Date: 20/01/12
*/
@Entity
public class User extends Model {
@Id
public Long id;
@Constraints.Required
@Formats.NonEmpty
@Column(unique = true)
public String email;
@Constraints.Required
@Formats.NonEmpty
@Column(unique = true)
public String fullname;
public String confirmationToken;
@Constraints.Required
@Formats.NonEmpty
public String passwordHash;
@Formats.DateTime(pattern = "yyyy-MM-dd HH:mm:ss")
public Date dateCreation;
@Formats.NonEmpty
public Boolean validated = false;
// -- Queries (long id, user.class)
public static Model.Finder<Long, User> find = new Model.Finder<Long, User>(Long.class, User.class);
/**
* Retrieve a user from an email.
*
* @param email email to search
* @return a user
*/
public static User findByEmail(String email) {
return find.where().eq("email", email).findUnique();
}
/**
* Retrieve a user from a fullname.
*
* @param fullname Full name
* @return a user
*/
public static User findByFullname(String fullname) {
return find.where().eq("fullname", fullname).findUnique();
}
/**
* Retrieves a user from a confirmation token.
*
* @param token the confirmation token to use.
* @return a user if the confirmation token is found, null otherwise.
*/
public static User findByConfirmationToken(String token) {
return find.where().eq("confirmationToken", token).findUnique();
}
/**
* Authenticate a User, from a email and clear password.
*
* @param email email
* @param clearPassword clear password
* @return User if authenticated, null otherwise
* @throws AppException App Exception
*/
public static User authenticate(String email, String clearPassword) throws AppException {
// get the user with email only to keep the salt password
User user = find.where().eq("email", email).findUnique();
if (user != null) {
// get the hash password from the salt + clear password
if (Hash.checkPassword(clearPassword, user.passwordHash)) {
return user;
}
}
return null;
}
public void changePassword(String password) throws AppException {
this.passwordHash = Hash.createPassword(password);
this.save();
}
/**
* Confirms an account.
*
* @return true if confirmed, false otherwise.
* @throws AppException App Exception
*/
public static boolean confirm(User user) throws AppException {
if (user == null) {
return false;
}
user.confirmationToken = null;
user.validated = true;
user.save();
return true;
}
}