User.java
package com.edtech.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.persistence.Table;
import java.time.Instant;
import java.util.UUID;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ParamDef;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLRestriction;
/** Documentação para User. */
@Entity
@Table(name = "users")
@FilterDef(name = "tenantFilter", parameters = @ParamDef(name = "institutionId", type = UUID.class))
@Filter(name = "tenantFilter", condition = "institution_id = :institutionId")
@SQLDelete(sql = "UPDATE users SET deleted = true WHERE id=?")
@SQLRestriction("deleted = false")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(updatable = false, nullable = false)
private UUID id;
@Column(name = "institution_id", nullable = false, updatable = false)
private UUID institutionId;
@Column(nullable = false, length = 120)
private String name;
@Column(nullable = false, unique = true, length = 180)
private String email;
@Column(name = "password_hash", nullable = false)
private String passwordHash;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private UserRole role = UserRole.RESEARCHER;
@Column(nullable = false)
private boolean active = true;
@Column(name = "created_at", nullable = false, updatable = false)
private Instant createdAt;
@Column(name = "updated_at", nullable = false)
private Instant updatedAt;
@Column(nullable = false)
private boolean deleted = false;
@Column(name = "mfa_enabled", nullable = false)
private boolean mfaEnabled = false;
@Column(name = "mfa_secret", length = 32)
private String mfaSecret;
protected User() {}
/** Documentação para o método User. */
public User(String name, String email, String passwordHash, UserRole role, UUID institutionId) {
this.name = name;
this.email = email;
this.passwordHash = passwordHash;
this.role = role;
this.institutionId = institutionId;
}
@PrePersist
void prePersist() {
Instant now = Instant.now();
createdAt = now;
updatedAt = now;
}
@PreUpdate
void preUpdate() {
updatedAt = Instant.now();
}
/** Documentação para o método getId. */
public UUID getId() {
return id;
}
/** Documentação para o método getInstitutionId. */
public UUID getInstitutionId() {
return institutionId;
}
/** Documentação para o método setInstitutionId. */
public void setInstitutionId(UUID institutionId) {
this.institutionId = institutionId;
}
/** Documentação para o método getName. */
public String getName() {
return name;
}
/** Documentação para o método getEmail. */
public String getEmail() {
return email;
}
/** Documentação para o método getPasswordHash. */
public String getPasswordHash() {
return passwordHash;
}
/** Documentação para o método setPasswordHash. */
public void setPasswordHash(String passwordHash) {
this.passwordHash = passwordHash;
}
/** Documentação para o método getRole. */
public UserRole getRole() {
return role;
}
/** Documentação para o método setRole. */
public void setRole(UserRole role) {
this.role = role;
}
/** Documentação para o método isActive. */
public boolean isActive() {
return active;
}
/** Documentação para o método setActive. */
public void setActive(boolean active) {
this.active = active;
}
/** Documentação para o método getCreatedAt. */
public Instant getCreatedAt() {
return createdAt;
}
/** Documentação para o método getUpdatedAt. */
public Instant getUpdatedAt() {
return updatedAt;
}
public boolean isDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
public boolean isMfaEnabled() {
return mfaEnabled;
}
public void setMfaEnabled(boolean mfaEnabled) {
this.mfaEnabled = mfaEnabled;
}
public String getMfaSecret() {
return mfaSecret;
}
public void setMfaSecret(String mfaSecret) {
this.mfaSecret = mfaSecret;
}
}