package de.rwth.idsg.bikeman.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Set;
/**
* A user.
*/
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "user_type")
@Table(name = "T_USER",
indexes = {
@Index(columnList = "login", unique = true)})
@TableGenerator(name = "user_gen", initialValue = 0, allocationSize = 1)
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@ToString(includeFieldNames = true)
@EqualsAndHashCode(callSuper = false, of = {"userId", "login"})
@Getter
@Setter
public class User extends AbstractTimestampClass implements Serializable {
private static final long serialVersionUID = 9070882912934376688L;
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_gen")
@Column(name = "user_id")
private long userId;
@NotNull
//@Email removed because of bug (allowed for test@test-com)
@Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.(?:[a-zA-Z]{2,6})$")
@Size(min = 0, max = 100)
@Column(name = "login", unique = true)
private String login;
@JsonIgnore
@Size(min = 0, max = 100)
private String password;
@JsonIgnore
@ManyToMany
@JoinTable(
name = "T_USER_AUTHORITY",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "name", referencedColumnName = "name")})
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<Authority> authorities;
@JsonIgnore
@OneToMany(mappedBy = "user")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<PersistentToken> persistentTokens;
// // TODO: Create ENUM for UserType?
// @JsonIgnore
// @Column(name = "user_type")
// private String userType;
}