Lazy Chat: Implement editing of messages.
Change-Id: I291201da1fbc7c2b6563f0837f7ce3e2f7f8555c
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatResource.java b/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatResource.java
index 8a4d2a3..fd672f8 100644
--- a/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatResource.java
+++ b/src/main/java/eu/mulk/mulkcms2/benki/lazychat/LazychatResource.java
@@ -1,21 +1,24 @@
package eu.mulk.mulkcms2.benki.lazychat;
-import eu.mulk.mulkcms2.benki.accesscontrol.Role;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+import eu.mulk.mulkcms2.benki.posts.Post;
import eu.mulk.mulkcms2.benki.posts.PostFilter;
import eu.mulk.mulkcms2.benki.posts.PostResource;
-import eu.mulk.mulkcms2.benki.users.User;
import io.quarkus.security.Authenticated;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.OffsetDateTime;
-import java.util.Set;
+import java.util.Objects;
import javax.transaction.Transactional;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Pattern;
-import javax.ws.rs.BadRequestException;
+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.core.Response;
@Path("/lazychat")
@@ -29,13 +32,10 @@
@Transactional
@Authenticated
public Response postMessage(
- @FormParam("text") String text,
- @FormParam("visibility") @NotNull @Pattern(regexp = "public|semiprivate|private")
- String visibility)
+ @FormParam("text") String text, @FormParam("visibility") Post.Visibility visibility)
throws URISyntaxException {
- var userName = identity.getPrincipal().getName();
- var user = User.findByNickname(userName);
+ var user = getCurrentUser();
var message = new LazychatMessage();
message.content = text;
@@ -43,17 +43,57 @@
message.owner = user;
message.date = OffsetDateTime.now();
- if (visibility.equals("public")) {
- Role world = Role.find("from Role r join r.tags tag where tag = 'world'").singleResult();
- message.targets = Set.of(world);
- } else if (visibility.equals("semiprivate")) {
- message.targets = Set.copyOf(user.defaultTargets);
- } else if (!visibility.equals("private")) {
- throw new BadRequestException(String.format("invalid visibility “%s”", visibility));
- }
+ assignPostTargets(visibility, user, message);
message.persistAndFlush();
return Response.seeOther(new URI("/lazychat")).build();
}
+
+ @POST
+ @Transactional
+ @Authenticated
+ @Path("/p/{id}/edit")
+ public Response patchMessage(
+ @PathParam("id") int id,
+ @FormParam("text") String text,
+ @FormParam("visibility") Post.Visibility visibility)
+ throws URISyntaxException {
+
+ var user = getCurrentUser();
+
+ var message = getSession().byId(LazychatMessage.class).load(id);
+
+ if (message == null) {
+ throw new NotFoundException();
+ }
+
+ if (!Objects.equals(message.owner.id, user.id)) {
+ throw new ForbiddenException();
+ }
+
+ message.content = text;
+ message.format = "markdown";
+
+ assignPostTargets(visibility, user, message);
+
+ return Response.seeOther(new URI("/lazychat")).build();
+ }
+
+ @GET
+ @Transactional
+ @Produces(APPLICATION_JSON)
+ @Path("/p/{id}")
+ public LazychatMessage getMessage(@PathParam("id") int id) {
+
+ var user = getCurrentUser();
+
+ var message = getSession().byId(LazychatMessage.class).load(id);
+
+ if (!user.canSee(message)) {
+ throw new ForbiddenException();
+ }
+
+ return message;
+ }
}