blob: 5e8dd2977c6c1807b342927355d9b34b19d042bf [file] [log] [blame]
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +02001package eu.mulk.mulkcms2.benki.posts;
2
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +02003import static org.hibernate.generator.EventType.INSERT;
4import static org.hibernate.generator.EventType.UPDATE;
5
Matthias Andreas Benkard0351a8f2022-05-26 08:05:00 +02006import eu.mulk.mulkcms2.benki.posts.Post.Scope;
7import eu.mulk.mulkcms2.common.markdown.MarkdownConverter;
8import eu.mulk.mulkcms2.common.markdown.MarkdownConverter.Mode;
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +02009import io.hypersistence.utils.hibernate.type.search.PostgreSQLTSVectorType;
Matthias Andreas Benkard299f5a52020-09-11 20:25:19 +020010import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +020011import jakarta.json.bind.annotation.JsonbTransient;
12import jakarta.persistence.Column;
13import jakarta.persistence.Entity;
14import jakarta.persistence.FetchType;
15import jakarta.persistence.Id;
16import jakarta.persistence.IdClass;
17import jakarta.persistence.Inheritance;
18import jakarta.persistence.InheritanceType;
19import jakarta.persistence.JoinColumn;
20import jakarta.persistence.ManyToOne;
Matthias Andreas Benkardb4a5bfd2023-08-06 21:57:45 +020021import jakarta.persistence.MapsId;
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +020022import jakarta.persistence.Table;
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020023import javax.annotation.CheckForNull;
Matthias Andreas Benkard8563a3c2020-09-16 17:57:24 +020024import org.hibernate.annotations.Generated;
Matthias Andreas Benkard0dfcd142022-03-19 13:19:20 +010025import org.hibernate.annotations.Type;
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020026
27@Entity
28@Table(name = "post_texts", schema = "benki")
29@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
30@IdClass(PostTextPK.class)
Matthias Andreas Benkard5326f5e2023-08-06 21:34:08 +020031public abstract class PostText<OwningPost extends Post<?>> extends PanacheEntityBase {
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020032
33 private static final int DESCRIPTION_CACHE_VERSION = 1;
34
35 @Id
Matthias Andreas Benkardb4a5bfd2023-08-06 21:57:45 +020036 @Column(name = "post", nullable = false)
37 public Integer postId;
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020038
39 @Id
40 @Column(name = "language", nullable = false, length = -1)
41 public String language;
42
43 @Column(name = "cached_description_version", nullable = true)
44 @CheckForNull
45 public Integer cachedDescriptionVersion;
46
47 @Column(name = "cached_description_html", nullable = true)
48 @CheckForNull
49 public String cachedDescriptionHtml;
50
Matthias Andreas Benkard2fa30292023-08-06 21:21:50 +020051 @Column(name = "search_terms", columnDefinition = "tsvector")
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +020052 @Generated(event = {INSERT, UPDATE})
53 @Type(value = PostgreSQLTSVectorType.class)
Matthias Andreas Benkard8563a3c2020-09-16 17:57:24 +020054 public String searchTerms;
55
Matthias Andreas Benkard5326f5e2023-08-06 21:34:08 +020056 @ManyToOne(fetch = FetchType.LAZY, targetEntity = Post.class)
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020057 @JoinColumn(name = "post", referencedColumnName = "id", nullable = false)
Matthias Andreas Benkardb4a5bfd2023-08-06 21:57:45 +020058 @MapsId("postId")
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020059 @JsonbTransient
Matthias Andreas Benkard5326f5e2023-08-06 21:34:08 +020060 public OwningPost post;
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020061
62 @CheckForNull
63 public final String getDescriptionHtml() {
64 if (cachedDescriptionHtml != null
65 && cachedDescriptionVersion != null
66 && cachedDescriptionVersion >= DESCRIPTION_CACHE_VERSION) {
67 return cachedDescriptionHtml;
68 } else {
69 @CheckForNull var descriptionHtml = computeDescriptionHtml();
70 cachedDescriptionHtml = descriptionHtml;
71 cachedDescriptionVersion = DESCRIPTION_CACHE_VERSION;
72 return descriptionHtml;
73 }
74 }
75
76 @CheckForNull
Matthias Andreas Benkard0351a8f2022-05-26 08:05:00 +020077 protected abstract String getDescriptionMarkup();
78
79 @CheckForNull
80 private String computeDescriptionHtml() {
81 var markup = getDescriptionMarkup();
82 if (markup == null) {
83 return null;
84 }
85 return new MarkdownConverter(post.scope == Scope.top_level ? Mode.POST : Mode.COMMENT)
86 .htmlify(markup);
87 }
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020088}