blob: 9f2cd5c2c98d011c665094c3882d98c6cd771f16 [file] [log] [blame]
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +01001package eu.mulk.mulkcms2.benki.users;
2
3import eu.mulk.mulkcms2.benki.accesscontrol.PageKey;
4import eu.mulk.mulkcms2.benki.accesscontrol.Role;
Matthias Andreas Benkarde28673d2020-02-09 10:51:24 +01005import eu.mulk.mulkcms2.benki.bookmarks.Bookmark;
Matthias Andreas Benkarde28673d2020-02-09 10:51:24 +01006import eu.mulk.mulkcms2.benki.lazychat.LazychatMessage;
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +02007import eu.mulk.mulkcms2.benki.posts.Post;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +01008import eu.mulk.mulkcms2.benki.wiki.WikiPageRevision;
9import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +020010import jakarta.persistence.CollectionTable;
11import jakarta.persistence.Column;
12import jakarta.persistence.ElementCollection;
13import jakarta.persistence.Entity;
14import jakarta.persistence.FetchType;
15import jakarta.persistence.GeneratedValue;
16import jakarta.persistence.GenerationType;
17import jakarta.persistence.Id;
18import jakarta.persistence.JoinColumn;
19import jakarta.persistence.JoinTable;
20import jakarta.persistence.ManyToMany;
21import jakarta.persistence.OneToMany;
22import jakarta.persistence.OneToOne;
23import jakarta.persistence.Table;
24import jakarta.persistence.Transient;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010025import java.util.Collection;
Matthias Andreas Benkard1937e6a2022-06-04 09:06:31 +020026import java.util.List;
Matthias Andreas Benkard6cfe16b2020-04-18 15:36:04 +020027import java.util.Objects;
Matthias Andreas Benkardb8027c62020-01-24 12:09:27 +010028import java.util.Set;
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020029import javax.annotation.CheckForNull;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010030
31@Entity(name = "BenkiUser")
Matthias Andreas Benkard57c9a8a2020-01-24 19:09:38 +010032@Table(name = "users", schema = "benki")
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010033public class User extends PanacheEntityBase {
34
35 @Id
Matthias Andreas Benkard0246c3e2020-01-27 05:39:08 +010036 @GeneratedValue(strategy = GenerationType.IDENTITY)
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010037 @Column(name = "id", nullable = false)
Matthias Andreas Benkard0246c3e2020-01-27 05:39:08 +010038 public Integer id;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010039
40 @Column(name = "first_name", nullable = true, length = -1)
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020041 @CheckForNull
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010042 public String firstName;
43
44 @Column(name = "middle_names", nullable = true, length = -1)
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020045 @CheckForNull
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010046 public String middleNames;
47
48 @Column(name = "last_name", nullable = true, length = -1)
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020049 @CheckForNull
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010050 public String lastName;
51
52 @Column(name = "email", nullable = true, length = -1)
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020053 @CheckForNull
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010054 public String email;
55
56 @Column(name = "website", nullable = true, length = -1)
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020057 @CheckForNull
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010058 public String website;
59
60 @Column(name = "status", nullable = true, length = -1)
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020061 @CheckForNull
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010062 public String status;
63
Matthias Andreas Benkardaa754802020-01-24 11:55:26 +010064 @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010065 public Collection<Bookmark> bookmarks;
66
Matthias Andreas Benkardaa754802020-01-24 11:55:26 +010067 @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010068 public Collection<LazychatMessage> lazychatMessages;
69
Matthias Andreas Benkard553de3e2020-01-27 05:33:15 +010070 @ElementCollection(fetch = FetchType.LAZY)
71 @CollectionTable(name = "openids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
72 @Column(name = "openid")
Matthias Andreas Benkard0c153642020-01-27 06:29:51 +010073 public Set<String> openids;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010074
Matthias Andreas Benkardaa754802020-01-24 11:55:26 +010075 @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010076 public Collection<PageKey> pageKeys;
77
Matthias Andreas Benkardaa754802020-01-24 11:55:26 +010078 @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010079 public Collection<Post> posts;
80
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010081 @ManyToMany(fetch = FetchType.LAZY)
82 @JoinTable(
83 name = "user_default_target",
84 schema = "benki",
85 joinColumns = @JoinColumn(name = "user"),
86 inverseJoinColumns = @JoinColumn(name = "target"))
87 public Set<Role> defaultTargets;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010088
Matthias Andreas Benkard553de3e2020-01-27 05:33:15 +010089 @ElementCollection(fetch = FetchType.LAZY)
90 @CollectionTable(
91 name = "user_email_addresses",
92 schema = "benki",
93 joinColumns = @JoinColumn(name = "user"))
94 @Column(name = "email")
Matthias Andreas Benkard0c153642020-01-27 06:29:51 +010095 public Set<String> emailAddresses;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +010096
Matthias Andreas Benkard553de3e2020-01-27 05:33:15 +010097 @ElementCollection(fetch = FetchType.LAZY)
98 @CollectionTable(name = "user_jids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
99 @Column(name = "jid")
Matthias Andreas Benkard0c153642020-01-27 06:29:51 +0100100 public Set<String> jids;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +0100101
Matthias Andreas Benkard553de3e2020-01-27 05:33:15 +0100102 @ElementCollection(fetch = FetchType.LAZY)
103 @CollectionTable(
104 name = "user_nicknames",
105 schema = "benki",
106 joinColumns = @JoinColumn(name = "user"))
107 @Column(name = "nickname")
Matthias Andreas Benkard0c153642020-01-27 06:29:51 +0100108 public Set<String> nicknames;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +0100109
Matthias Andreas Benkardaa754802020-01-24 11:55:26 +0100110 @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
Matthias Andreas Benkardb8027c62020-01-24 12:09:27 +0100111 public Collection<UserRole> directRoles;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +0100112
Matthias Andreas Benkardaa754802020-01-24 11:55:26 +0100113 @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
Matthias Andreas Benkard553de3e2020-01-27 05:33:15 +0100114 public Collection<RsaKey> rsaKeys;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +0100115
Matthias Andreas Benkardbe77d302020-01-24 14:08:52 +0100116 @OneToOne(fetch = FetchType.LAZY)
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +0100117 @JoinColumn(name = "role", referencedColumnName = "id", nullable = false)
118 public Role ownedRole;
119
Matthias Andreas Benkard553de3e2020-01-27 05:33:15 +0100120 @ElementCollection(fetch = FetchType.LAZY)
121 @CollectionTable(name = "webids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
122 @Column(name = "webid")
Matthias Andreas Benkard0c153642020-01-27 06:29:51 +0100123 public Set<String> webids;
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +0100124
Matthias Andreas Benkardaa754802020-01-24 11:55:26 +0100125 @OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +0100126 public Collection<WikiPageRevision> wikiPageRevisions;
Matthias Andreas Benkardf9c74272020-01-24 11:51:35 +0100127
Matthias Andreas Benkardaa754802020-01-24 11:55:26 +0100128 @ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY)
Matthias Andreas Benkard4ad837d2020-01-27 06:29:07 +0100129 public Set<Post> visiblePosts;
Matthias Andreas Benkardb8027c62020-01-24 12:09:27 +0100130
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +0100131 @ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY)
132 public Set<Bookmark> visibleBookmarks;
133
134 @ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY)
135 public Set<LazychatMessage> visibleLazychatMessages;
136
Matthias Andreas Benkardb8027c62020-01-24 12:09:27 +0100137 @ManyToMany(fetch = FetchType.LAZY)
138 @JoinTable(
139 name = "effective_user_roles",
Matthias Andreas Benkard553de3e2020-01-27 05:33:15 +0100140 schema = "benki",
Matthias Andreas Benkardb8027c62020-01-24 12:09:27 +0100141 joinColumns = @JoinColumn(name = "user"),
142 inverseJoinColumns = @JoinColumn(name = "role"))
143 public Set<Role> effectiveRoles;
Matthias Andreas Benkard04a50e62020-02-16 19:08:38 +0100144
145 @Transient
146 public String getFirstAndLastName() {
147 return String.format("%s %s", firstName, lastName);
148 }
Matthias Andreas Benkard088a21f2020-02-22 10:52:11 +0100149
150 public static User findByNickname(String nickname) {
151 return User.find("from BenkiUser u join u.nicknames n where ?1 = n", nickname).singleResult();
152 }
Matthias Andreas Benkard06e6c812020-04-13 17:01:35 +0200153
Matthias Andreas Benkard2f931de2021-06-28 20:56:50 +0200154 public static User findByNicknameWithRoles(String nickname) {
155 return User.find(
156 ""
157 + "from BenkiUser u "
158 + "join u.nicknames n "
159 + "left join fetch u.effectiveRoles r "
160 + "left join fetch r.tags "
161 + "where ?1 = n",
162 nickname)
163 .singleResult();
164 }
165
Matthias Andreas Benkard1937e6a2022-06-04 09:06:31 +0200166 public static List<User> findAdmins() {
167 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'")
168 .list();
169 }
170
Matthias Andreas Benkard6cfe16b2020-04-18 15:36:04 +0200171 public final boolean canSee(Post message) {
172 return message.isVisibleTo(this);
173 }
174
175 @Override
176 public boolean equals(Object o) {
177 if (this == o) {
178 return true;
179 }
180 if (!(o instanceof User)) {
181 return false;
182 }
183 User user = (User) o;
184 return Objects.equals(id, user.id);
185 }
186
187 @Override
188 public int hashCode() {
189 return Objects.hash(id);
Matthias Andreas Benkard06e6c812020-04-13 17:01:35 +0200190 }
Matthias Andreas Benkardd9b95882020-01-24 11:42:49 +0100191}