blob: 9f2cd5c2c98d011c665094c3882d98c6cd771f16 [file] [log] [blame]
package eu.mulk.mulkcms2.benki.users;
import eu.mulk.mulkcms2.benki.accesscontrol.PageKey;
import eu.mulk.mulkcms2.benki.accesscontrol.Role;
import eu.mulk.mulkcms2.benki.bookmarks.Bookmark;
import eu.mulk.mulkcms2.benki.lazychat.LazychatMessage;
import eu.mulk.mulkcms2.benki.posts.Post;
import eu.mulk.mulkcms2.benki.wiki.WikiPageRevision;
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 jakarta.persistence.Transient;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import javax.annotation.CheckForNull;
@Entity(name = "BenkiUser")
@Table(name = "users", schema = "benki")
public class User extends PanacheEntityBase {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
public Integer id;
@Column(name = "first_name", nullable = true, length = -1)
@CheckForNull
public String firstName;
@Column(name = "middle_names", nullable = true, length = -1)
@CheckForNull
public String middleNames;
@Column(name = "last_name", nullable = true, length = -1)
@CheckForNull
public String lastName;
@Column(name = "email", nullable = true, length = -1)
@CheckForNull
public String email;
@Column(name = "website", nullable = true, length = -1)
@CheckForNull
public String website;
@Column(name = "status", nullable = true, length = -1)
@CheckForNull
public String status;
@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
public Collection<Bookmark> bookmarks;
@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
public Collection<LazychatMessage> lazychatMessages;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "openids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
@Column(name = "openid")
public Set<String> openids;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
public Collection<PageKey> pageKeys;
@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
public Collection<Post> posts;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "user_default_target",
schema = "benki",
joinColumns = @JoinColumn(name = "user"),
inverseJoinColumns = @JoinColumn(name = "target"))
public Set<Role> defaultTargets;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(
name = "user_email_addresses",
schema = "benki",
joinColumns = @JoinColumn(name = "user"))
@Column(name = "email")
public Set<String> emailAddresses;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "user_jids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
@Column(name = "jid")
public Set<String> jids;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(
name = "user_nicknames",
schema = "benki",
joinColumns = @JoinColumn(name = "user"))
@Column(name = "nickname")
public Set<String> nicknames;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
public Collection<UserRole> directRoles;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
public Collection<RsaKey> rsaKeys;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role", referencedColumnName = "id", nullable = false)
public Role ownedRole;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "webids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
@Column(name = "webid")
public Set<String> webids;
@OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
public Collection<WikiPageRevision> wikiPageRevisions;
@ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY)
public Set<Post> visiblePosts;
@ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY)
public Set<Bookmark> visibleBookmarks;
@ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY)
public Set<LazychatMessage> visibleLazychatMessages;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "effective_user_roles",
schema = "benki",
joinColumns = @JoinColumn(name = "user"),
inverseJoinColumns = @JoinColumn(name = "role"))
public Set<Role> effectiveRoles;
@Transient
public String getFirstAndLastName() {
return String.format("%s %s", firstName, lastName);
}
public static User findByNickname(String nickname) {
return User.find("from BenkiUser u join u.nicknames n where ?1 = n", nickname).singleResult();
}
public static User findByNicknameWithRoles(String nickname) {
return User.find(
""
+ "from BenkiUser u "
+ "join u.nicknames n "
+ "left join fetch u.effectiveRoles r "
+ "left join fetch r.tags "
+ "where ?1 = n",
nickname)
.singleResult();
}
public static List<User> findAdmins() {
return find("select distinct u from BenkiUser u left join u.effectiveRoles r left join r.tags t where t = 'admin' or u.status = 'admin'")
.list();
}
public final boolean canSee(Post message) {
return message.isVisibleTo(this);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof User)) {
return false;
}
User user = (User) o;
return Objects.equals(id, user.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}