blob: e07765a4a9ba0ef63e1cc26f0eb5075a53f25292 [file] [log] [blame]
package eu.mulk.mulkcms2.benki.accesscontrol;
import eu.mulk.mulkcms2.benki.posts.PostTarget;
import eu.mulk.mulkcms2.benki.users.User;
import eu.mulk.mulkcms2.benki.users.UserRole;
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.util.Collection;
import java.util.Objects;
import java.util.Set;
import javax.annotation.CheckForNull;
import org.hibernate.annotations.LazyToOne;
import org.hibernate.annotations.LazyToOneOption;
@Entity
@Table(name = "roles", schema = "benki")
public class Role extends PanacheEntityBase {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
public Integer id;
@Column(name = "name", nullable = true, length = -1)
@CheckForNull
public String name;
@OneToMany(mappedBy = "target", fetch = FetchType.LAZY)
public Collection<PostTarget> targetedPosts;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "role_subroles",
schema = "benki",
joinColumns = @JoinColumn(name = "superrole"),
inverseJoinColumns = @JoinColumn(name = "subrole"))
public Set<Role> directSubroles;
@ManyToMany(mappedBy = "directSubroles", fetch = FetchType.LAZY)
public Set<Role> directSuperroles;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "effective_role_subroles",
schema = "benki",
joinColumns = @JoinColumn(name = "superrole"),
inverseJoinColumns = @JoinColumn(name = "subrole"))
public Set<Role> effectiveSubroles;
@ManyToMany(mappedBy = "effectiveSubroles", fetch = FetchType.LAZY)
public Set<Role> effectiveSuperroles;
@ManyToMany(mappedBy = "defaultTargets", fetch = FetchType.LAZY)
public Set<User> usersUsedByAsDefaultTarget;
@OneToMany(mappedBy = "role", fetch = FetchType.LAZY)
public Collection<UserRole> directUsers;
@OneToOne(mappedBy = "ownedRole", fetch = FetchType.LAZY)
@LazyToOne(LazyToOneOption.NO_PROXY)
public User owningUsers;
@ManyToMany(mappedBy = "effectiveRoles", fetch = FetchType.LAZY)
public Set<User> effectiveUsers;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "role_tags", schema = "benki", joinColumns = @JoinColumn(name = "role"))
@Column(name = "tag")
public Set<String> tags;
public static Role getWorld() {
return find("from Role r join r.tags tag where tag = 'world'").singleResult();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Role)) {
return false;
}
Role role = (Role) o;
return Objects.equals(id, role.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}