package ru.ulstu.user.model; import org.hibernate.annotations.BatchSize; import org.hibernate.validator.constraints.Email; import ru.ulstu.configuration.Constants; import ru.ulstu.core.model.BaseEntity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.Set; @Entity @Table(name = "users") public class User extends BaseEntity { private final static String USER_ABBREVIATE_TEMPLATE = "%s %s%s"; @NotNull @Pattern(regexp = Constants.LOGIN_REGEX) @Size(min = 1, max = 50) @Column(length = 50, unique = true, nullable = false) private String login; @NotNull @Size(min = 60, max = 60) @Column(name = "password_hash", length = 60, nullable = false) private String password; @NotNull @Size(max = 50) @Column(name = "first_name", length = 50, nullable = false) private String firstName; @NotNull @Size(max = 50) @Column(name = "last_name", length = 50, nullable = false) private String lastName; @Size(max = 50) @Column(name = "patronymic", length = 50) private String patronymic; @NotNull @Email @Size(min = 5, max = 100) @Column(length = 100, nullable = false, unique = true) private String email; @NotNull @Column(nullable = false) private boolean activated; @Size(max = 20) @Column(name = "activation_key", length = 20) private String activationKey; @Column(name = "activation_date") @Temporal(TemporalType.TIMESTAMP) private Date activationDate; @Size(max = 20) @Column(name = "reset_key", length = 20) private String resetKey; @Column(name = "reset_date") @Temporal(TemporalType.TIMESTAMP) private Date resetDate; @ManyToMany @JoinTable( name = "user_role", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "user_role_name", referencedColumnName = "name")}) @BatchSize(size = 20) private Set roles; @Column(name = "birth_date") @Temporal(TemporalType.TIMESTAMP) private Date birthDate; public enum UserDegree { CANDIDATE("Кандидат технических наук"), DOCTOR("Доктор технических наук"); private String degreeName; UserDegree(String degreeName) { this.degreeName = degreeName; } public String getDegreeName() { return degreeName; } } @Enumerated(value = EnumType.STRING) private UserDegree degree; public User() { roles = new HashSet<>(); activated = false; activationDate = new Date(); resetDate = null; } public String getLogin() { return login; } public void setLogin(String login) { this.login = login.toLowerCase(); } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public boolean getActivated() { return activated; } public void setActivated(boolean activated) { this.activated = activated; } public String getActivationKey() { return activationKey; } public void setActivationKey(String activationKey) { this.activationKey = activationKey; } public Date getActivationDate() { return activationDate; } public void setActivationDate(Date activationDate) { this.activationDate = activationDate; } public String getResetKey() { return resetKey; } public void setResetKey(String resetKey) { this.resetKey = resetKey; } public Date getResetDate() { return resetDate; } public void setResetDate(Date resetDate) { this.resetDate = resetDate; } public Set getRoles() { return roles; } public void setRoles(Collection roles) { this.roles.clear(); this.roles.addAll(roles); } public String getPatronymic() { return patronymic; } public void setPatronymic(String patronymic) { this.patronymic = patronymic; } public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } public UserDegree getDegree() { return degree; } public void setDegree(UserDegree degree) { this.degree = degree; } public String getUserAbbreviate() { return String.format(USER_ABBREVIATE_TEMPLATE, lastName == null ? "" : lastName, firstName == null ? "" : firstName.substring(0, 1) + ".", patronymic == null ? "" : patronymic.substring(0, 1) + "."); } }