KB53 Support bookmark edition.

Change-Id: Ieacbb5c448b9afa4bc9524167e0c73618de6db48
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkResource.java b/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkResource.java
index 495e511..059335c 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkResource.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/bookmarks/BookmarkResource.java
@@ -27,10 +27,13 @@
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import javax.ws.rs.Consumes;
+import javax.ws.rs.ForbiddenException;
 import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
+import javax.ws.rs.NotFoundException;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Response;
@@ -76,6 +79,43 @@
     return Response.seeOther(new URI("/bookmarks")).build();
   }
 
+  @POST
+  @Transactional
+  @Authenticated
+  @Produces(WILDCARD)
+  @Consumes({APPLICATION_FORM_URLENCODED, MULTIPART_FORM_DATA})
+  @Path("{id}/edit")
+  public Response patchMessage(
+      @PathParam("id") int id,
+      @FormParam("uri") @NotNull URI uri,
+      @FormParam("title") @NotEmpty String title,
+      @FormParam("description") @CheckForNull String description,
+      @FormParam("visibility") Post.Visibility visibility)
+      throws URISyntaxException {
+
+    var user = Objects.requireNonNull(getCurrentUser());
+
+    var bookmark = getSession().byId(Bookmark.class).load(id);
+
+    if (bookmark == null) {
+      throw new NotFoundException();
+    }
+
+    if (bookmark.owner == null || !Objects.equals(bookmark.owner.id, user.id)) {
+      throw new ForbiddenException();
+    }
+
+    bookmark.uri = uri.toString();
+    bookmark.title = title;
+    bookmark.tags = Set.of();
+    bookmark.description = description;
+    bookmark.owner = user;
+
+    assignPostTargets(visibility, user, bookmark);
+
+    return Response.seeOther(new URI("/bookmarks")).build();
+  }
+
   @GET
   @Authenticated
   @Path("new")