package net.curisit.securis.db; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToMany; import jakarta.persistence.NamedQueries; import jakarta.persistence.NamedQuery; import jakarta.persistence.Table; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.annotation.JsonProperty; /** * Entity implementation class for Entity: Users * */ @JsonAutoDetect @JsonInclude(Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) @Entity @Table(name = "user") @NamedQueries({ @NamedQuery(name = "list-users", query = "SELECT u FROM User u"), @NamedQuery(name = "get-user", query = "SELECT u FROM User u where u.username = :username"), @NamedQuery(name = "auth-user", query = "SELECT u FROM User u where u.username = :username and u.password = :password"), @NamedQuery(name = "delete-all-users", query = "delete FROM User u") }) public class User implements Serializable { private static final long serialVersionUID = 1L; @Id private String username; private String password; @JsonProperty(value = "first_name") @Column(name = "first_name") private String firstName; @JsonProperty(value = "last_name") @Column(name = "last_name") private String lastName; private int roles; @Column(name = "last_login") private Date lastLogin; @Column(name = "modification_timestamp") private Date modificationTimestamp; @Column(name = "creation_timestamp") @JsonProperty("creation_timestamp") private Date creationTimestamp; private String lang; private String email; @JsonIgnore @ManyToMany @JoinTable(name = "user_organization", // joinColumns = { @JoinColumn(name = "username", referencedColumnName = "username") }, // inverseJoinColumns = { @JoinColumn(name = "organization_id", referencedColumnName = "id") } // ) private Set organizations; @JsonIgnore @ManyToMany @JoinTable(name = "user_application", // joinColumns = { @JoinColumn(name = "username", referencedColumnName = "username") }, // inverseJoinColumns = { @JoinColumn(name = "application_id", referencedColumnName = "id") } // ) private Set applications; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @JsonProperty("password") public String getDummyPassword() { return null; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public List getRoles() { if (roles == 0) { return null; } List aux = new ArrayList<>(); for (int rol : Rol.ALL) { if ((roles & rol) != 0) { // Each rol is a number with only 1 bit == // 1 in binary representation aux.add(rol); } } return aux; } public void setRoles(List roles) { this.roles = 0; if (roles != null) { for (Integer rol : roles) { this.roles |= rol; } } } 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 Date getLastLogin() { return lastLogin; } public void setLastLogin(Date lastLogin) { this.lastLogin = lastLogin; } public Date getModificationTimestamp() { return modificationTimestamp; } public void setModificationTimestamp(Date modificationTimestamp) { this.modificationTimestamp = modificationTimestamp; } public Date getCreationTimestamp() { return creationTimestamp; } public void setCreationTimestamp(Date creationTimestamp) { this.creationTimestamp = creationTimestamp; } @Override public String toString() { return "{User: " + username + " Name: " + firstName + " " + lastName + ", last login: " + lastLogin + "}"; } public String getLang() { return lang; } public void setLang(String lang) { this.lang = lang; } public Set getOrganizations() { return organizations; } public void setOrganizations(Set organizations) { this.organizations = organizations; } public Set getApplications() { return applications; } public void setApplications(Set applications) { this.applications = applications; } @JsonProperty("organizations_ids") public void setOrgsIds(List orgsIds) { organizations = new HashSet<>(); for (Integer orgid : orgsIds) { Organization o = new Organization(); o.setId(orgid); organizations.add(o); } } @JsonProperty("organizations_ids") public Set getOrgsIds() { if (organizations == null) { return null; } Set ids = new HashSet<>(); for (Organization org : organizations) { ids.add(org.getId()); } return ids; } @JsonProperty("applications_ids") public void setAppsIds(Collection appIds) { applications = new HashSet<>(); for (Integer appid : appIds) { Application a = new Application(); a.setId(appid); applications.add(a); } } @JsonProperty("applications_ids") public Set getAppsIds() { if (applications == null) { return null; } Set ids = new HashSet<>(); for (Application app : applications) { ids.add(app.getId()); } return ids; } @JsonIgnore public Set getAllOrgsIds() { if (organizations == null) { return null; } Set ids = new HashSet<>(); includeAllOrgs(this.organizations, ids); return ids; } @JsonIgnore public Set getAllAppsIds() { if (applications == null) { return null; } Set ids = this.applications.parallelStream().map(app -> app.getId()).collect(Collectors.toSet()); return ids; } /** * Walk into the organization hierarchy to include all descendants * * @param list * @param orgIds */ private void includeAllOrgs(Set list, Set orgIds) { for (Organization org : list) { orgIds.add(org.getId()); includeAllOrgs(org.getChildOrganizations(), orgIds); } } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } /** * Numeric rol mask. Be aware to use different bit position for each role * * @author rob */ public static class Rol { public static final int ADVANCE = 0x01; public static final int ADMIN = 0x02; public static final int BASIC = 0x04; public static final int API_CLIENT = 0x80; public static final int[] ALL = new int[] { ADVANCE, ADMIN, BASIC, API_CLIENT }; } }