blob: 177c590fac8bea79ccef4dced0dde9d2e7b227ad [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;
21import jakarta.persistence.Table;
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020022import javax.annotation.CheckForNull;
Matthias Andreas Benkard8563a3c2020-09-16 17:57:24 +020023import org.hibernate.annotations.Generated;
Matthias Andreas Benkard0dfcd142022-03-19 13:19:20 +010024import org.hibernate.annotations.Type;
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020025
26@Entity
27@Table(name = "post_texts", schema = "benki")
28@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
29@IdClass(PostTextPK.class)
Matthias Andreas Benkard475bf002023-08-06 20:56:30 +020030public abstract class PostText 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 Benkard2fa30292023-08-06 21:21:50 +020050 @Column(name = "search_terms", columnDefinition = "tsvector")
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +020051 @Generated(event = {INSERT, UPDATE})
52 @Type(value = PostgreSQLTSVectorType.class)
Matthias Andreas Benkard8563a3c2020-09-16 17:57:24 +020053 public String searchTerms;
54
Matthias Andreas Benkard475bf002023-08-06 20:56:30 +020055 @ManyToOne(fetch = FetchType.LAZY)
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020056 @JoinColumn(name = "post", referencedColumnName = "id", nullable = false)
57 @JsonbTransient
Matthias Andreas Benkard475bf002023-08-06 20:56:30 +020058 public Post post;
59
60 public Post getPost() {
61 return post;
62 }
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020063
64 @CheckForNull
65 public final String getDescriptionHtml() {
66 if (cachedDescriptionHtml != null
67 && cachedDescriptionVersion != null
68 && cachedDescriptionVersion >= DESCRIPTION_CACHE_VERSION) {
69 return cachedDescriptionHtml;
70 } else {
71 @CheckForNull var descriptionHtml = computeDescriptionHtml();
72 cachedDescriptionHtml = descriptionHtml;
73 cachedDescriptionVersion = DESCRIPTION_CACHE_VERSION;
74 return descriptionHtml;
75 }
76 }
77
78 @CheckForNull
Matthias Andreas Benkard0351a8f2022-05-26 08:05:00 +020079 protected abstract String getDescriptionMarkup();
80
81 @CheckForNull
82 private String computeDescriptionHtml() {
83 var markup = getDescriptionMarkup();
84 if (markup == null) {
85 return null;
86 }
87 return new MarkdownConverter(post.scope == Scope.top_level ? Mode.POST : Mode.COMMENT)
88 .htmlify(markup);
89 }
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +020090}