Benki: Sort into a sane folder structure, fix mapping bugs.

Change-Id: I55f5c0349dc580a24506648284ce6483dd952d8a
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/generic/Post.java b/src/main/java/eu/mulk/mulkcms2/benki/generic/Post.java
new file mode 100644
index 0000000..050cdcb
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/generic/Post.java
@@ -0,0 +1,30 @@
+package eu.mulk.mulkcms2.benki.generic;
+
+import eu.mulk.mulkcms2.benki.users.User;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.time.OffsetDateTime;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "posts", schema = "public", catalog = "benki")
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public abstract class Post extends PanacheEntityBase {
+
+  @Id
+  @Column(name = "id", nullable = false)
+  public int id;
+
+  @Column(name = "date", nullable = true)
+  public OffsetDateTime date;
+
+  @ManyToOne
+  @JoinColumn(name = "owner", referencedColumnName = "id")
+  public User owner;
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/generic/PostTarget.java b/src/main/java/eu/mulk/mulkcms2/benki/generic/PostTarget.java
new file mode 100644
index 0000000..3a3f6b2
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/generic/PostTarget.java
@@ -0,0 +1,29 @@
+package eu.mulk.mulkcms2.benki.generic;
+
+import eu.mulk.mulkcms2.benki.accesscontrol.Role;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "post_targets", schema = "public", catalog = "benki")
+@IdClass(PostTargetPK.class)
+public class PostTarget extends PanacheEntityBase {
+
+  @Id
+  @Column(name = "message", nullable = false)
+  public int message;
+
+  @Id
+  @Column(name = "target", nullable = false)
+  public int targetId;
+
+  @ManyToOne
+  @JoinColumn(name = "target", referencedColumnName = "id", nullable = false)
+  public Role target;
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/generic/PostTargetPK.java b/src/main/java/eu/mulk/mulkcms2/benki/generic/PostTargetPK.java
new file mode 100644
index 0000000..13c660d
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/generic/PostTargetPK.java
@@ -0,0 +1,59 @@
+package eu.mulk.mulkcms2.benki.generic;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+public class PostTargetPK implements Serializable {
+
+  private int message;
+  private int targetId;
+
+  @Column(name = "message", nullable = false)
+  @Id
+  public int getMessage() {
+    return message;
+  }
+
+  public void setMessage(int message) {
+    this.message = message;
+  }
+
+  @Column(name = "target", nullable = false)
+  @Id
+  public int getTargetId() {
+    return targetId;
+  }
+
+  public void setTargetId(int targetId) {
+    this.targetId = targetId;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+
+    PostTargetPK that = (PostTargetPK) o;
+
+    if (message != that.message) {
+      return false;
+    }
+    if (targetId != that.targetId) {
+      return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    int result = message;
+    result = 31 * result + targetId;
+    return result;
+  }
+}
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/generic/UserVisiblePost.java b/src/main/java/eu/mulk/mulkcms2/benki/generic/UserVisiblePost.java
new file mode 100644
index 0000000..2b09120
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/generic/UserVisiblePost.java
@@ -0,0 +1,41 @@
+package eu.mulk.mulkcms2.benki.generic;
+
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import org.hibernate.annotations.Immutable;
+
+@Entity
+@Immutable
+@Table(name = "user_visible_posts", schema = "public", catalog = "benki")
+public class UserVisiblePost extends PanacheEntityBase implements Serializable {
+
+  @Id
+  @Column(name = "user", nullable = true)
+  public Integer userId;
+
+  @Id
+  @Column(name = "message", nullable = true)
+  public Integer messageId;
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof UserVisiblePost)) {
+      return false;
+    }
+    UserVisiblePost that = (UserVisiblePost) o;
+    return Objects.equals(userId, that.userId) && Objects.equals(messageId, that.messageId);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(userId, messageId);
+  }
+}