ArenMg/src/main/java/fr/lirmm/aren/model/User.java

501 lines
10 KiB
Java

package fr.lirmm.aren.model;
import java.io.Serializable;
import java.util.TreeSet;
import java.util.SortedSet;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlTransient;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import javax.persistence.JoinTable;
import fr.lirmm.aren.model.vm.VMTeam;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.Filters;
import org.hibernate.annotations.SortNatural;
/**
* Model for Users with anotations for storage and serialization
*
* @author Florent Descroix {@literal <florentdescroix@posteo.net>}
*/
@Entity
@Table(name = "users")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = User.class)
@Filters({
@Filter(name = "isActive", condition = "active = true")
})
public class User extends AbstractEntEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = 9143251821521688592L;
/**
*
*/
public enum Authority {
/**
*
*/
DELETED,
/**
*
*/
GUEST,
/**
*
*/
USER,
/**
*
*/
MODO,
/**
*
*/
ADMIN,
/**
*
*/
SUPERADMIN
}
@Size(max = 255)
@Column(name = "username", unique = true)
private String username;
@Size(max = 255)
@Column(name = "first_name")
private String firstName;
@Size(max = 255)
@Column(name = "last_name")
private String lastName;
@Pattern(regexp = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message = "Invalid email")//if the field contains email address consider using this annotation to enforce field validation
@Size(max = 255)
@Column(name = "email", unique = true)
private String email;
@Column(name = "last_login")
private ZonedDateTime lastLogin;
@JsonIgnore
@Column(name = "token_validity")
private ZonedDateTime tokenValidity = ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS);
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@Column(name = "password")
private String password;
@JsonIgnore
@Column(name = "is_active")
private boolean active = true;
@ManyToMany(mappedBy = "guests")
@SortNatural
private SortedSet<Debate> invitedDebates = new TreeSet<>();
@OneToMany(mappedBy = "owner")
@SortNatural
private SortedSet<Comment> comments = new TreeSet<>();
@OneToMany(mappedBy = "owner")
@SortNatural
private SortedSet<Debate> createdDebates = new TreeSet<>();
@JoinColumn(name = "institution_id", referencedColumnName = "id")
@ManyToOne(optional = false)
private Institution institution;
@JoinTable(name = "teams_users",
joinColumns = {
@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "team_id", referencedColumnName = "id")})
@ManyToMany
@SortNatural
private SortedSet<Team> teams = new TreeSet<>();
@JoinTable(name = "vm_teams_users",
joinColumns = {
@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "team_id", referencedColumnName = "id")})
@ManyToMany
@SortNatural
private SortedSet<VMTeam> vmTeams = new TreeSet<>();
@OneToMany(mappedBy = "owner")
@SortNatural
private SortedSet<Notification> notifications = new TreeSet<>();
@Enumerated(EnumType.STRING)
@Column(name = "authority", nullable = false)
private Authority authority = Authority.GUEST;
/**
*
* @return
*/
public String getUsername() {
return username;
}
/**
*
* @param username
*/
public void setUsername(String username) {
this.username = username;
}
/**
*
* @return
*/
public String getFirstName() {
return firstName;
}
/**
*
* @param firstName
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
*
* @return
*/
public String getLastName() {
return lastName;
}
/**
*
* @param lastName
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
*
* @return
*/
public String getEmail() {
return email;
}
/**
*
* @param email
*/
public void setEmail(String email) {
this.email = email;
}
/**
*
* @return
*/
public ZonedDateTime getLastLogin() {
return lastLogin;
}
/**
*
* @param lastLogin
*/
public void setLastLogin(ZonedDateTime lastLogin) {
this.lastLogin = lastLogin;
}
/**
*
* @return
*/
public ZonedDateTime getTokenValidity() {
return tokenValidity;
}
/**
*
* @param tokenValidity
*/
public void setTokenValidity(ZonedDateTime tokenValidity) {
this.tokenValidity = tokenValidity;
}
/**
*
* @return
*/
public String getPassword() {
return password;
}
/**
*
* @param password
*/
public void setPassword(String password) {
this.password = password;
}
/**
*
* @return
*/
public boolean isActive() {
return active;
}
/**
*
* @param active
*/
public void setActive(boolean active) {
this.active = active;
}
/**
*
* @return
*/
@XmlTransient
public SortedSet<Debate> getInvitedDebates() {
return invitedDebates;
}
/**
*
* @param invitedDebates
*/
public void setInvitedDebates(SortedSet<Debate> invitedDebates) {
this.invitedDebates = invitedDebates;
}
/**
*
* @return
*/
@XmlTransient
public SortedSet<Comment> getComments() {
return comments;
}
/**
*
* @param comments
*/
public void setComments(SortedSet<Comment> comments) {
this.comments = comments;
}
/**
*
* @return
*/
@XmlTransient
public SortedSet<Debate> getCreatedDebates() {
return createdDebates;
}
/**
*
* @param createdDebates
*/
public void setCreatedDebates(SortedSet<Debate> createdDebates) {
this.createdDebates = createdDebates;
}
/**
*
* @return
*/
public Institution getInstitution() {
return institution;
}
/**
*
* @param institution
*/
public void setInstitution(Institution institution) {
this.institution = institution;
}
/**
*
* @return
*/
public SortedSet<Team> getTeams() {
return teams;
}
/**
*
* @param teams
*/
public void setTeams(SortedSet<Team> teams) {
this.teams = teams;
}
/**
*
* @param team
*/
public void addTeam(Team team) {
teams.add(team);
team.getUsers().add(this);
}
/**
*
* @param team
*/
public void removeTeams(Team team) {
teams.remove(team);
team.getUsers().remove(this);
}
/**
*
* @return
*/
public SortedSet<VMTeam> getVmTeams() {
return vmTeams;
}
/**
*
* @param vmTeams
*/
public void setVmTeams(SortedSet<VMTeam> vmTeams) {
this.vmTeams = vmTeams;
}
/**
*
* @param team
*/
public void addMember(VMTeam team) {
vmTeams.add(team);
team.getMembers().add(this);
}
/**
*
* @param team
*/
public void removeMember(VMTeam team) {
vmTeams.remove(team);
team.getMembers().remove(this);
}
/**
*
* @return
*/
@XmlTransient
public SortedSet<Notification> getNotifications() {
return notifications;
}
/**
*
* @param notifications
*/
public void setNotifications(SortedSet<Notification> notifications) {
this.notifications = notifications;
}
/**
*
* @return
*/
public Authority getAuthority() {
return authority;
}
/**
*
* @param authority
*/
public void setAuthority(Authority authority) {
this.authority = authority;
}
/**
*
* @param other
* @return
*/
public boolean hasSameOrMoreRightThan(User other) {
return authority.compareTo(other.getAuthority()) >= 0;
}
/**
*
* @return
*/
@Override
public boolean isEditable() {
return institution == null;
}
/**
*
* @return
*/
@Override
public boolean isRemovable() {
return this.getInstitution().getId() == 0L && this.getComments().size() == 0;
}
/**
*
* @param auth
* @return
*/
public boolean is(Authority auth) {
if (this.getAuthority() == null) {
return Authority.GUEST.compareTo(auth) >= 0;
}
return this.getAuthority().compareTo(auth) >= 0;
}
/**
*
* @param auth
* @return
*/
public boolean is(String auth) {
return this.is(Authority.valueOf(auth));
}
}