Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 1 | package eu.mulk.mulkcms2.benki.users; |
| 2 | |
| 3 | import eu.mulk.mulkcms2.benki.accesscontrol.PageKey; |
| 4 | import eu.mulk.mulkcms2.benki.accesscontrol.Role; |
Matthias Andreas Benkard | e28673d | 2020-02-09 10:51:24 +0100 | [diff] [blame] | 5 | import eu.mulk.mulkcms2.benki.bookmarks.Bookmark; |
Matthias Andreas Benkard | e28673d | 2020-02-09 10:51:24 +0100 | [diff] [blame] | 6 | import eu.mulk.mulkcms2.benki.lazychat.LazychatMessage; |
Matthias Andreas Benkard | 4940b29 | 2020-03-29 18:41:07 +0200 | [diff] [blame] | 7 | import eu.mulk.mulkcms2.benki.posts.Post; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 8 | import eu.mulk.mulkcms2.benki.wiki.WikiPageRevision; |
| 9 | import io.quarkus.hibernate.orm.panache.PanacheEntityBase; |
Matthias Andreas Benkard | e3bc3ee | 2023-08-06 16:21:11 +0200 | [diff] [blame] | 10 | import jakarta.persistence.CollectionTable; |
| 11 | import jakarta.persistence.Column; |
| 12 | import jakarta.persistence.ElementCollection; |
| 13 | import jakarta.persistence.Entity; |
| 14 | import jakarta.persistence.FetchType; |
| 15 | import jakarta.persistence.GeneratedValue; |
| 16 | import jakarta.persistence.GenerationType; |
| 17 | import jakarta.persistence.Id; |
| 18 | import jakarta.persistence.JoinColumn; |
| 19 | import jakarta.persistence.JoinTable; |
| 20 | import jakarta.persistence.ManyToMany; |
| 21 | import jakarta.persistence.OneToMany; |
| 22 | import jakarta.persistence.OneToOne; |
| 23 | import jakarta.persistence.Table; |
| 24 | import jakarta.persistence.Transient; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 25 | import java.util.Collection; |
Matthias Andreas Benkard | 1937e6a | 2022-06-04 09:06:31 +0200 | [diff] [blame] | 26 | import java.util.List; |
Matthias Andreas Benkard | 6cfe16b | 2020-04-18 15:36:04 +0200 | [diff] [blame] | 27 | import java.util.Objects; |
Matthias Andreas Benkard | b8027c6 | 2020-01-24 12:09:27 +0100 | [diff] [blame] | 28 | import java.util.Set; |
Matthias Andreas Benkard | 1e7674c | 2020-04-18 20:28:51 +0200 | [diff] [blame] | 29 | import javax.annotation.CheckForNull; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 30 | |
| 31 | @Entity(name = "BenkiUser") |
Matthias Andreas Benkard | 57c9a8a | 2020-01-24 19:09:38 +0100 | [diff] [blame] | 32 | @Table(name = "users", schema = "benki") |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 33 | public class User extends PanacheEntityBase { |
| 34 | |
| 35 | @Id |
Matthias Andreas Benkard | 0246c3e | 2020-01-27 05:39:08 +0100 | [diff] [blame] | 36 | @GeneratedValue(strategy = GenerationType.IDENTITY) |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 37 | @Column(name = "id", nullable = false) |
Matthias Andreas Benkard | 0246c3e | 2020-01-27 05:39:08 +0100 | [diff] [blame] | 38 | public Integer id; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 39 | |
| 40 | @Column(name = "first_name", nullable = true, length = -1) |
Matthias Andreas Benkard | 1e7674c | 2020-04-18 20:28:51 +0200 | [diff] [blame] | 41 | @CheckForNull |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 42 | public String firstName; |
| 43 | |
| 44 | @Column(name = "middle_names", nullable = true, length = -1) |
Matthias Andreas Benkard | 1e7674c | 2020-04-18 20:28:51 +0200 | [diff] [blame] | 45 | @CheckForNull |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 46 | public String middleNames; |
| 47 | |
| 48 | @Column(name = "last_name", nullable = true, length = -1) |
Matthias Andreas Benkard | 1e7674c | 2020-04-18 20:28:51 +0200 | [diff] [blame] | 49 | @CheckForNull |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 50 | public String lastName; |
| 51 | |
| 52 | @Column(name = "email", nullable = true, length = -1) |
Matthias Andreas Benkard | 1e7674c | 2020-04-18 20:28:51 +0200 | [diff] [blame] | 53 | @CheckForNull |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 54 | public String email; |
| 55 | |
| 56 | @Column(name = "website", nullable = true, length = -1) |
Matthias Andreas Benkard | 1e7674c | 2020-04-18 20:28:51 +0200 | [diff] [blame] | 57 | @CheckForNull |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 58 | public String website; |
| 59 | |
| 60 | @Column(name = "status", nullable = true, length = -1) |
Matthias Andreas Benkard | 1e7674c | 2020-04-18 20:28:51 +0200 | [diff] [blame] | 61 | @CheckForNull |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 62 | public String status; |
| 63 | |
Matthias Andreas Benkard | aa75480 | 2020-01-24 11:55:26 +0100 | [diff] [blame] | 64 | @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY) |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 65 | public Collection<Bookmark> bookmarks; |
| 66 | |
Matthias Andreas Benkard | aa75480 | 2020-01-24 11:55:26 +0100 | [diff] [blame] | 67 | @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY) |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 68 | public Collection<LazychatMessage> lazychatMessages; |
| 69 | |
Matthias Andreas Benkard | 553de3e | 2020-01-27 05:33:15 +0100 | [diff] [blame] | 70 | @ElementCollection(fetch = FetchType.LAZY) |
| 71 | @CollectionTable(name = "openids", schema = "benki", joinColumns = @JoinColumn(name = "user")) |
| 72 | @Column(name = "openid") |
Matthias Andreas Benkard | 0c15364 | 2020-01-27 06:29:51 +0100 | [diff] [blame] | 73 | public Set<String> openids; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 74 | |
Matthias Andreas Benkard | aa75480 | 2020-01-24 11:55:26 +0100 | [diff] [blame] | 75 | @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 76 | public Collection<PageKey> pageKeys; |
| 77 | |
Matthias Andreas Benkard | aa75480 | 2020-01-24 11:55:26 +0100 | [diff] [blame] | 78 | @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY) |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 79 | public Collection<Post> posts; |
| 80 | |
Matthias Andreas Benkard | bca9461 | 2020-02-10 20:58:13 +0100 | [diff] [blame] | 81 | @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 Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 88 | |
Matthias Andreas Benkard | 553de3e | 2020-01-27 05:33:15 +0100 | [diff] [blame] | 89 | @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 Benkard | 0c15364 | 2020-01-27 06:29:51 +0100 | [diff] [blame] | 95 | public Set<String> emailAddresses; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 96 | |
Matthias Andreas Benkard | 553de3e | 2020-01-27 05:33:15 +0100 | [diff] [blame] | 97 | @ElementCollection(fetch = FetchType.LAZY) |
| 98 | @CollectionTable(name = "user_jids", schema = "benki", joinColumns = @JoinColumn(name = "user")) |
| 99 | @Column(name = "jid") |
Matthias Andreas Benkard | 0c15364 | 2020-01-27 06:29:51 +0100 | [diff] [blame] | 100 | public Set<String> jids; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 101 | |
Matthias Andreas Benkard | 553de3e | 2020-01-27 05:33:15 +0100 | [diff] [blame] | 102 | @ElementCollection(fetch = FetchType.LAZY) |
| 103 | @CollectionTable( |
| 104 | name = "user_nicknames", |
| 105 | schema = "benki", |
| 106 | joinColumns = @JoinColumn(name = "user")) |
| 107 | @Column(name = "nickname") |
Matthias Andreas Benkard | 0c15364 | 2020-01-27 06:29:51 +0100 | [diff] [blame] | 108 | public Set<String> nicknames; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 109 | |
Matthias Andreas Benkard | aa75480 | 2020-01-24 11:55:26 +0100 | [diff] [blame] | 110 | @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) |
Matthias Andreas Benkard | b8027c6 | 2020-01-24 12:09:27 +0100 | [diff] [blame] | 111 | public Collection<UserRole> directRoles; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 112 | |
Matthias Andreas Benkard | aa75480 | 2020-01-24 11:55:26 +0100 | [diff] [blame] | 113 | @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) |
Matthias Andreas Benkard | 553de3e | 2020-01-27 05:33:15 +0100 | [diff] [blame] | 114 | public Collection<RsaKey> rsaKeys; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 115 | |
Matthias Andreas Benkard | be77d30 | 2020-01-24 14:08:52 +0100 | [diff] [blame] | 116 | @OneToOne(fetch = FetchType.LAZY) |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 117 | @JoinColumn(name = "role", referencedColumnName = "id", nullable = false) |
| 118 | public Role ownedRole; |
| 119 | |
Matthias Andreas Benkard | 553de3e | 2020-01-27 05:33:15 +0100 | [diff] [blame] | 120 | @ElementCollection(fetch = FetchType.LAZY) |
| 121 | @CollectionTable(name = "webids", schema = "benki", joinColumns = @JoinColumn(name = "user")) |
| 122 | @Column(name = "webid") |
Matthias Andreas Benkard | 0c15364 | 2020-01-27 06:29:51 +0100 | [diff] [blame] | 123 | public Set<String> webids; |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 124 | |
Matthias Andreas Benkard | aa75480 | 2020-01-24 11:55:26 +0100 | [diff] [blame] | 125 | @OneToMany(mappedBy = "author", fetch = FetchType.LAZY) |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 126 | public Collection<WikiPageRevision> wikiPageRevisions; |
Matthias Andreas Benkard | f9c7427 | 2020-01-24 11:51:35 +0100 | [diff] [blame] | 127 | |
Matthias Andreas Benkard | aa75480 | 2020-01-24 11:55:26 +0100 | [diff] [blame] | 128 | @ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY) |
Matthias Andreas Benkard | 4ad837d | 2020-01-27 06:29:07 +0100 | [diff] [blame] | 129 | public Set<Post> visiblePosts; |
Matthias Andreas Benkard | b8027c6 | 2020-01-24 12:09:27 +0100 | [diff] [blame] | 130 | |
Matthias Andreas Benkard | 2d4f92e | 2020-02-09 16:15:07 +0100 | [diff] [blame] | 131 | @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 Benkard | b8027c6 | 2020-01-24 12:09:27 +0100 | [diff] [blame] | 137 | @ManyToMany(fetch = FetchType.LAZY) |
| 138 | @JoinTable( |
| 139 | name = "effective_user_roles", |
Matthias Andreas Benkard | 553de3e | 2020-01-27 05:33:15 +0100 | [diff] [blame] | 140 | schema = "benki", |
Matthias Andreas Benkard | b8027c6 | 2020-01-24 12:09:27 +0100 | [diff] [blame] | 141 | joinColumns = @JoinColumn(name = "user"), |
| 142 | inverseJoinColumns = @JoinColumn(name = "role")) |
| 143 | public Set<Role> effectiveRoles; |
Matthias Andreas Benkard | 04a50e6 | 2020-02-16 19:08:38 +0100 | [diff] [blame] | 144 | |
| 145 | @Transient |
| 146 | public String getFirstAndLastName() { |
| 147 | return String.format("%s %s", firstName, lastName); |
| 148 | } |
Matthias Andreas Benkard | 088a21f | 2020-02-22 10:52:11 +0100 | [diff] [blame] | 149 | |
| 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 Benkard | 06e6c81 | 2020-04-13 17:01:35 +0200 | [diff] [blame] | 153 | |
Matthias Andreas Benkard | 2f931de | 2021-06-28 20:56:50 +0200 | [diff] [blame] | 154 | 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 Benkard | 1937e6a | 2022-06-04 09:06:31 +0200 | [diff] [blame] | 166 | 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 Benkard | 6cfe16b | 2020-04-18 15:36:04 +0200 | [diff] [blame] | 171 | 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 Benkard | 06e6c81 | 2020-04-13 17:01:35 +0200 | [diff] [blame] | 190 | } |
Matthias Andreas Benkard | d9b9588 | 2020-01-24 11:42:49 +0100 | [diff] [blame] | 191 | } |