package bo.gotthardt.model;
import bo.gotthardt.AccessibleBy;
import bo.gotthardt.Persistable;
import com.avaje.ebean.annotation.CreatedTimestamp;
import com.avaje.ebean.annotation.UpdatedTimestamp;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.security.Principal;
import java.time.LocalDateTime;
import java.util.UUID;
/**
* @author Bo Gotthardt
*/
@Entity
@Table(name = "users") // Avoid warnings about "user" being a reserved word.
@Getter
@Setter
@ToString(of = {"id", "username"})
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class User implements Persistable, AccessibleBy<User>, Principal {
@Id
private UUID id;
private String username;
private String email;
private String name;
@Embedded
@AttributeOverrides({@AttributeOverride(name = "hashedValue", column = @Column(name = "password"))})
@JsonIgnore
private HashedValue password;
@CreatedTimestamp
private LocalDateTime createdDate;
@UpdatedTimestamp
private LocalDateTime updatedDate;
public User(String username, String password, String fullName) {
this.username = username;
this.password = new HashedValue(password);
this.name = fullName;
}
@Override
public boolean isAccessibleBy(User principal) {
return id.equals(principal.getId());
}
}