Lazy Chat: Implement editing of messages.

Change-Id: I291201da1fbc7c2b6563f0837f7ce3e2f7f8555c
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java b/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java
index 20aec05..356461c 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/posts/Post.java
@@ -13,6 +13,7 @@
 import java.util.Objects;
 import java.util.Set;
 import javax.annotation.CheckForNull;
+import javax.json.bind.annotation.JsonbTransient;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
@@ -57,6 +58,7 @@
 
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "owner", referencedColumnName = "id")
+  @JsonbTransient
   public User owner;
 
   @ManyToMany(fetch = FetchType.LAZY)
@@ -65,6 +67,7 @@
       schema = "benki",
       joinColumns = @JoinColumn(name = "message"),
       inverseJoinColumns = @JoinColumn(name = "user"))
+  @JsonbTransient
   public Set<User> visibleTo;
 
   @ManyToMany(fetch = FetchType.LAZY)
@@ -73,6 +76,7 @@
       schema = "benki",
       joinColumns = @JoinColumn(name = "message"),
       inverseJoinColumns = @JoinColumn(name = "target"))
+  @JsonbTransient
   public Set<Role> targets;
 
   public abstract boolean isBookmark();
@@ -88,6 +92,18 @@
   @CheckForNull
   public abstract String getUri();
 
+  public Visibility getVisibility() {
+    if (targets.isEmpty()) {
+      return Visibility.PRIVATE;
+    } else if (targets.contains(Role.getWorld())) {
+      return Visibility.PUBLIC;
+    } else {
+      // FIXME: There should really be a check whether targets.equals(owner.defaultTargets) here.
+      // Otherwise the actual visibility is DISCRETIONARY.
+      return Visibility.SEMIPRIVATE;
+    }
+  }
+
   protected static <T extends Post> CriteriaQuery<T> queryViewable(
       Class<T> entityClass,
       SecurityIdentity readerIdentity,
@@ -236,4 +252,28 @@
 
     return new PostPage<T>(prevCursor, cursor, nextCursor, forwardResults);
   }
+
+  public enum Visibility {
+    PUBLIC,
+    SEMIPRIVATE,
+    DISCRETIONARY,
+    PRIVATE,
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof Post)) {
+      return false;
+    }
+    Post post = (Post) o;
+    return Objects.equals(id, post.id);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id);
+  }
 }