package io.lumify.sql.model.user;
import com.altamiracorp.bigtable.model.user.ModelUserContext;
import io.lumify.web.clientapi.model.UserStatus;
import io.lumify.web.clientapi.model.UserType;
import io.lumify.web.clientapi.model.Privilege;
import io.lumify.core.user.User;
import io.lumify.sql.model.workspace.SqlWorkspace;
import io.lumify.sql.model.workspace.SqlWorkspaceUser;
import org.apache.commons.codec.binary.Base64;
import org.json.JSONObject;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
import java.util.Set;
@Entity
@Table(name = "user")
public class SqlUser implements User {
private String userId;
private String username;
private String encodedPasswordHash;
private String encodedPasswordSalt;
private String displayName;
private String emailAddress;
private Date createDate;
private Date currentLoginDate;
private String currentLoginRemoteAddr;
private Date previousLoginDate;
private String previousLoginRemoteAddr;
private int loginCount;
private UserStatus userStatus;
private String privileges;
private String uiPreferencesString;
private SqlWorkspace currentWorkspace;
private List<SqlWorkspaceUser> sqlWorkspaceUserList;
private String passwordResetToken;
private Date passwordResetTokenExpirationDate;
@Override
@Id
@Column(name = "user_id", unique = true)
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
@Override
@Column(name = "username")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name = "password_hash")
public String getEncodedPasswordHash() {
return encodedPasswordHash;
}
@Transient
public byte[] getPasswordHash() {
return Base64.decodeBase64(encodedPasswordHash);
}
public void setEncodedPasswordHash(String encodedPasswordHash) {
this.encodedPasswordHash = encodedPasswordHash;
}
@Column(name = "password_salt")
public String getEncodedPasswordSalt() {
return encodedPasswordSalt;
}
@Transient
public byte[] getPasswordSalt() {
return Base64.decodeBase64(encodedPasswordSalt);
}
public void setEncodedPasswordSalt(String encodedPasswordSalt) {
this.encodedPasswordSalt = encodedPasswordSalt;
}
@Transient
public void setPassword(byte[] passwordSalt, byte[] passwordHash) {
setEncodedPasswordSalt(Base64.encodeBase64String(passwordSalt));
setEncodedPasswordHash(Base64.encodeBase64String(passwordHash));
}
@Override
@Column(name = "display_name")
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
@Override
@Column(name = "email_address")
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
@Override
@Column(name = "create_date")
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
@Override
@Column(name = "current_login_date")
public Date getCurrentLoginDate() {
return currentLoginDate;
}
public void setCurrentLoginDate(Date currentLoginDate) {
this.currentLoginDate = currentLoginDate;
}
@Override
@Column(name = "current_login_remote_addr")
public String getCurrentLoginRemoteAddr() {
return currentLoginRemoteAddr;
}
public void setCurrentLoginRemoteAddr(String currentLoginRemoteAddr) {
this.currentLoginRemoteAddr = currentLoginRemoteAddr;
}
@Override
@Column(name = "previous_login_date")
public Date getPreviousLoginDate() {
return previousLoginDate;
}
public void setPreviousLoginDate(Date previousLoginDate) {
this.previousLoginDate = previousLoginDate;
}
@Override
@Column(name = "previous_login_remote_addr")
public String getPreviousLoginRemoteAddr() {
return previousLoginRemoteAddr;
}
public void setPreviousLoginRemoteAddr(String previousLoginRemoteAddr) {
this.previousLoginRemoteAddr = previousLoginRemoteAddr;
}
@Override
@Column(name = "login_count")
public int getLoginCount() {
return loginCount;
}
public void setLoginCount(int loginCount) {
this.loginCount = loginCount;
}
@Override
@Transient
public UserType getUserType() {
return UserType.USER;
}
@Override
@Column(name = "user_status")
public UserStatus getUserStatus() {
return userStatus;
}
public void setUserStatus(UserStatus userStatus) {
this.userStatus = userStatus;
}
@Override
@Transient
public String getCurrentWorkspaceId() {
return currentWorkspace != null ? currentWorkspace.getWorkspaceId() : null;
}
@ManyToOne()
@JoinColumn(referencedColumnName = "workspace_id", name = "current_workspace_id")
public SqlWorkspace getCurrentWorkspace() {
return currentWorkspace;
}
public void setCurrentWorkspace(SqlWorkspace currentWorkspace) {
this.currentWorkspace = currentWorkspace;
}
@Override
@Transient
public JSONObject getUiPreferences() {
return uiPreferencesString != null ? new JSONObject(uiPreferencesString) : null;
}
public void setUiPreferences(JSONObject uiPreferences) {
uiPreferencesString = uiPreferences.toString();
}
@Column(name = "ui_preferences", length = 4000)
public String getUiPreferencesString() {
return uiPreferencesString;
}
public void setUiPreferencesString(String uiPreferencesString) {
this.uiPreferencesString = uiPreferencesString;
}
@Override
@Transient
public Set<Privilege> getPrivileges() {
return Privilege.stringToPrivileges(privileges);
}
@Column(name = "privileges")
public String getPrivilegesString() {
return privileges;
}
public void setPrivilegesString(String privileges) {
this.privileges = privileges;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "sqlWorkspaceUser.user")
public List<SqlWorkspaceUser> getSqlWorkspaceUserList() {
return sqlWorkspaceUserList;
}
public void setSqlWorkspaceUserList(List<SqlWorkspaceUser> sqlWorkspaceUserList) {
this.sqlWorkspaceUserList = sqlWorkspaceUserList;
}
@Column(name = "password_reset_token")
public String getPasswordResetToken() {
return passwordResetToken;
}
public void setPasswordResetToken(String passwordResetToken) {
this.passwordResetToken = passwordResetToken;
}
@Column(name = "password_reset_token_expiration_date")
public Date getPasswordResetTokenExpirationDate() {
return passwordResetTokenExpirationDate;
}
public void setPasswordResetTokenExpirationDate(Date passwordResetTokenExpirationDate) {
this.passwordResetTokenExpirationDate = passwordResetTokenExpirationDate;
}
@Override
public String toString() {
return "SqlUser{userId='" + getUserId() + "', displayName='" + getDisplayName() + "', privileges=" + getPrivilegesString() + "}";
}
@Override
@Transient
public ModelUserContext getModelUserContext() {
return null;
}
}