/* * Copyright @ 2013 CurisTEC, S.A.S. All Rights Reserved. */ package net.curisit.securis.db; import java.io.Serializable; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.JoinTable; import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.NamedQueries; import jakarta.persistence.NamedQuery; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; 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; /** * Organization *

* Represents a customer/tenant organization. Manages parent/children hierarchy * and user membership. * * Mapping details: * - Table: organization * - ManyToMany users via user_organization (ignored in default JSON). * - Self-referencing parent/children relation. * - Named queries for listing, filtering by ids, and children discovery. * * @author JRA * Last reviewed by JRA on Oct 5, 2025. */ @JsonAutoDetect @JsonInclude(Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) @Entity @Table(name = "organization") @NamedQueries({ @NamedQuery(name = "list-organizations", query = "SELECT o FROM Organization o"), @NamedQuery(name = "list-organizations-by-ids", query = "SELECT o FROM Organization o where id in :list_ids"), @NamedQuery(name = "find-children-org", query = "SELECT o FROM Organization o where o.parentOrganization = :parentOrganization") }) public class Organization implements Serializable { @SuppressWarnings("unused") private static final Logger LOG = LogManager.getLogger(Organization.class); private static final long serialVersionUID = 1L; @Id @GeneratedValue private Integer id; private String code; private String name; private String description; @Column(name = "creation_timestamp") @JsonProperty("creation_timestamp") private Date creationTimestamp; @JsonIgnore @ManyToMany(cascade = CascadeType.REMOVE) @JoinTable(name = "user_organization", joinColumns = { @JoinColumn(name = "organization_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "username", referencedColumnName = "username") }) private Set users; @JsonIgnore @ManyToOne @JoinColumn(name = "org_parent_id") private Organization parentOrganization; @JsonIgnore @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentOrganization") private Set childOrganizations; // ---------------- Getters & setters ---------------- /** * getId

* Return primary key. * * @return id */ public Integer getId() { return id; } /** * setId

* Set primary key. * * @param id */ public void setId(Integer id) { this.id = id; } /** * getName

* Return display name. * * @return name */ public String getName() { return name; } /** * setName

* Set display name. * * @param name */ public void setName(String name) { this.name = name; } /** * getDescription

* Return optional description. * * @return description */ public String getDescription() { return description; } /** * setDescription

* Set optional description. * * @param description */ public void setDescription(String description) { this.description = description; } /** * getCode

* Return short code. * * @return code */ public String getCode() { return code; } /** * setCode

* Set short code. * * @param code */ public void setCode(String code) { this.code = code; } /** * getCreationTimestamp

* Return creation timestamp. * * @return creationTimeStamp */ public Date getCreationTimestamp() { return creationTimestamp; } /** * setCreationTimestamp

* Set creation timestamp. * * @param creationTimestamp */ public void setCreationTimestamp(Date creationTimestamp) { this.creationTimestamp = creationTimestamp; } /** * getUsers

* Return member users (entity set). * * @return users */ public Set getUsers() { return users; } /** * setUsers

* Set member users. * * @param users */ public void setUsers(Set users) { this.users = users; } /** * getParentOrganization

* Return parent org (entity). * * @return parentOrganization */ public Organization getParentOrganization() { return parentOrganization; } /** * setParentOrganization

* Set parent org (entity). * * @param parentOrganization */ public void setParentOrganization(Organization parentOrganization) { this.parentOrganization = parentOrganization; } // JSON helpers for parent organization /** * setParentOrgId

* Setter by id (creates shallow Organization). * * @param orgId */ @JsonProperty("org_parent_id") public void setParentOrgId(Integer orgId) { if (orgId != null) { parentOrganization = new Organization(); parentOrganization.setId(orgId); } else { parentOrganization = null; } } /** * getParentOrgId

* Expose parent org id. * * @return parentOrgId */ @JsonProperty("org_parent_id") public Integer getParentOrgId() { return parentOrganization == null ? null : parentOrganization.getId(); } /** * getParentOrgName

* Expose parent org name. * * @return parentOrgName */ @JsonProperty("org_parent_name") public String getParentOrgName() { return parentOrganization == null ? null : parentOrganization.getName(); } // JSON helpers for users /** * setUsersIds

* Replace users set from a list of usernames. * * @param userId list */ @JsonProperty("users_ids") public void setUsersIds(List usersIds) { users = new HashSet<>(); if (usersIds != null) { for (String userid : usersIds) { User u = new User(); u.setUsername(userid); users.add(u); } } } /** * getUsersIds

* Expose member usernames. * * @return userId list */ @JsonProperty("users_ids") public Set getUsersIds() { if (users == null) return null; Set ids = new HashSet<>(); for (User user : users) { ids.add(user.getUsername()); } return ids; } /** getChildOrganizations

Return children (entity set). */ public Set getChildOrganizations() { return childOrganizations; } /** setChildOrganizations

Set children (entity set). */ public void setChildOrganizations(Set childOrganizations) { this.childOrganizations = childOrganizations; } }