blob: 80971b1e15e9eab034865a4e4520aabecf7f90f3 [file] [log] [blame]
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +02001package eu.mulk.mulkcms2.benki.posts;
2
Matthias Andreas Benkard0dfcd142022-03-19 13:19:20 +01003import com.vladmihalcea.hibernate.type.search.PostgreSQLTSVectorType;
Matthias Andreas Benkard0351a8f2022-05-26 08:05:00 +02004import eu.mulk.mulkcms2.benki.posts.Post.Scope;
5import eu.mulk.mulkcms2.common.markdown.MarkdownConverter;
6import eu.mulk.mulkcms2.common.markdown.MarkdownConverter.Mode;
Matthias Andreas Benkard299f5a52020-09-11 20:25:19 +02007import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +02008import javax.annotation.CheckForNull;
9import javax.json.bind.annotation.JsonbTransient;
10import javax.persistence.Column;
11import javax.persistence.Entity;
12import javax.persistence.FetchType;
13import javax.persistence.Id;
14import javax.persistence.IdClass;
15import javax.persistence.Inheritance;
16import javax.persistence.InheritanceType;
17import javax.persistence.JoinColumn;
18import javax.persistence.ManyToOne;
19import javax.persistence.Table;
Matthias Andreas Benkard8563a3c2020-09-16 17:57:24 +020020import org.hibernate.annotations.Generated;
21import org.hibernate.annotations.GenerationTime;
Matthias Andreas Benkard0dfcd142022-03-19 13:19:20 +010022import org.hibernate.annotations.Type;
23import org.hibernate.annotations.TypeDef;
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020024
25@Entity
26@Table(name = "post_texts", schema = "benki")
27@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
28@IdClass(PostTextPK.class)
Matthias Andreas Benkard0dfcd142022-03-19 13:19:20 +010029@TypeDef(name = "tsvector", typeClass = PostgreSQLTSVectorType.class)
Matthias Andreas Benkard299f5a52020-09-11 20:25:19 +020030public abstract class PostText<OwningPost extends Post<?>> extends PanacheEntityBase {
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020031
32 private static final int DESCRIPTION_CACHE_VERSION = 1;
33
34 @Id
35 @Column(name = "post", nullable = false, insertable = false, updatable = false)
36 public int postId;
37
38 @Id
39 @Column(name = "language", nullable = false, length = -1)
40 public String language;
41
42 @Column(name = "cached_description_version", nullable = true)
43 @CheckForNull
44 public Integer cachedDescriptionVersion;
45
46 @Column(name = "cached_description_html", nullable = true)
47 @CheckForNull
48 public String cachedDescriptionHtml;
49
Matthias Andreas Benkard8563a3c2020-09-16 17:57:24 +020050 @Column(name = "search_terms")
51 @Generated(GenerationTime.ALWAYS)
Matthias Andreas Benkard0dfcd142022-03-19 13:19:20 +010052 @Type(type = "tsvector")
Matthias Andreas Benkard8563a3c2020-09-16 17:57:24 +020053 public String searchTerms;
54
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020055 @ManyToOne(fetch = FetchType.LAZY, targetEntity = Post.class)
56 @JoinColumn(name = "post", referencedColumnName = "id", nullable = false)
57 @JsonbTransient
58 public OwningPost post;
59
60 @CheckForNull
61 public final String getDescriptionHtml() {
62 if (cachedDescriptionHtml != null
63 && cachedDescriptionVersion != null
64 && cachedDescriptionVersion >= DESCRIPTION_CACHE_VERSION) {
65 return cachedDescriptionHtml;
66 } else {
67 @CheckForNull var descriptionHtml = computeDescriptionHtml();
68 cachedDescriptionHtml = descriptionHtml;
69 cachedDescriptionVersion = DESCRIPTION_CACHE_VERSION;
70 return descriptionHtml;
71 }
72 }
73
74 @CheckForNull
Matthias Andreas Benkard0351a8f2022-05-26 08:05:00 +020075 protected abstract String getDescriptionMarkup();
76
77 @CheckForNull
78 private String computeDescriptionHtml() {
79 var markup = getDescriptionMarkup();
80 if (markup == null) {
81 return null;
82 }
83 return new MarkdownConverter(post.scope == Scope.top_level ? Mode.POST : Mode.COMMENT)
84 .htmlify(markup);
85 }
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020086}