feat(wiki): Implement new Wiki page creation.

Change-Id: I807147f3a4d105c08a9ffda130afec36dc13228a
diff --git a/build.xml b/build.xml
index 49e7beb..d80c6b2 100644
--- a/build.xml
+++ b/build.xml
@@ -89,6 +89,7 @@
       <arg value="cms2"/>
       <arg value="lazychat"/>
       <arg value="posts"/>
+      <arg value="wiki"/>
       <arg value="--color"/>
     </exec>
   </target>
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java b/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
index 4100dc2..cd10267 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/wiki/WikiResource.java
@@ -13,6 +13,7 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.time.format.FormatStyle;
 import java.time.temporal.TemporalAccessor;
@@ -59,16 +60,28 @@
   @Produces(TEXT_HTML)
   @Authenticated
   public TemplateInstance getPage(@PathParam("pageName") String pageName) {
+    WikiPageRevision page;
+
     Optional<WikiPageRevision> maybePage =
         WikiPageRevision.find(
                 "from WikiPageRevision rev join fetch rev.author where rev.title = ?1",
                 Sort.by("date").descending(),
                 pageName)
             .firstResultOptional();
-    if (maybePage.isEmpty()) {
-      throw new NotFoundException();
+    if (maybePage.isPresent()) {
+      page = maybePage.get();
+    } else {
+      var userName = identity.getPrincipal().getName();
+      User user =
+          User.find("from BenkiUser u join u.nicknames n where ?1 = n", userName).singleResult();
+      page = new WikiPageRevision();
+      page.content = "";
+      page.title = pageName;
+      page.date = OffsetDateTime.now(ZoneOffset.UTC);
+      page.format = "html5";
+      page.author = user;
     }
-    var page = maybePage.get();
+
     return Templates.wikiPage(page);
   }
 
@@ -96,6 +109,8 @@
     }
 
     var userName = identity.getPrincipal().getName();
+    User user =
+        User.find("from BenkiUser u join u.nicknames n where ?1 = n", userName).singleResult();
 
     Optional<WikiPageRevision> maybeCurrentRevision =
         WikiPageRevision.find(
@@ -103,26 +118,33 @@
                 Sort.by("date").descending(),
                 pageName)
             .firstResultOptional();
-    if (maybeCurrentRevision.isEmpty()) {
-      throw new NotFoundException();
+
+    final WikiPage page;
+    if (maybeCurrentRevision.isPresent()) {
+      // Update the existing page.
+      var currentRevision = maybeCurrentRevision.get();
+      page = currentRevision.page;
+
+      title = title != null ? title : currentRevision.title;
+      content = content != null ? content : currentRevision.content;
+    } else {
+      // Create a new page.
+      page = new WikiPage();
+      page.persist();
+
+      title = title != null ? title : pageName;
+      content = content != null ? content : "";
     }
-    var currentRevision = maybeCurrentRevision.get();
 
     var pageRevision =
-        new WikiPageRevision(
-            OffsetDateTime.now(),
-            title != null ? title : currentRevision.title,
-            content != null ? content : currentRevision.content,
-            "html5",
-            currentRevision.page,
-            User.find("from BenkiUser u join u.nicknames n where ?1 = n", userName).singleResult());
-
-    pageRevision.persistAndFlush();
+        new WikiPageRevision(OffsetDateTime.now(), title, content, "html5", page, user);
+    pageRevision.persist();
 
     return jsonProvider
         .createObjectBuilder()
         .add("status", "ok")
         .add("content", pageRevision.enrichedContent())
+        .add("title", pageRevision.title)
         .build();
   }
 
diff --git a/src/main/resources/META-INF/resources/wiki/wikiPage.js b/src/main/resources/META-INF/resources/wiki/wikiPage.js
index 9f96732..0e35d44 100644
--- a/src/main/resources/META-INF/resources/wiki/wikiPage.js
+++ b/src/main/resources/META-INF/resources/wiki/wikiPage.js
@@ -4,6 +4,8 @@
   let editor = ContentTools.EditorApp.get();
   editor.init('*[data-editable]', 'data-name');
 
+  let {pageTitle} = document.getElementById('wiki-page').dataset;
+
   editor.addEventListener('saved', async function (ev) {
     document.getElementById("warning-panel").close();
 
@@ -20,8 +22,6 @@
       requestParams.append(name, regions[name]);
     }
 
-    let {pageTitle} = document.getElementById('wiki-page').dataset;
-
     let response = await fetch(`/wiki/${pageTitle}`, {
       method: 'POST',
       body: requestParams
@@ -32,7 +32,7 @@
       document.getElementById("warning-text").innerText = `Failed to save page: ${response.statusText}`;
       this.busy(false);
 
-return;
+      return;
     }
 
     let status = await response.json();
@@ -41,13 +41,17 @@
       document.getElementById("warning-text").innerText = `Failed to save page: ${JSON.stringify(status)}`;
       this.busy(false);
 
-return;
+      return;
     }
 
     if (status.hasOwnProperty("content")) {
       document.getElementById("wiki-content").innerHTML = status.content;
     }
 
+    if (status.hasOwnProperty("title")) {
+      pageTitle = status.title;
+    }
+
     this.busy(false);
   });
 });