blob: f2e3067590dc7a5f7b650dd0db81d1c8abf63fff [file] [log] [blame]
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +01001package eu.mulk.mulkcms2.benki.bookmarks;
2
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +01003import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +01004import static javax.ws.rs.core.MediaType.TEXT_HTML;
5
6import eu.mulk.mulkcms2.benki.accesscontrol.Role;
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +02007import eu.mulk.mulkcms2.benki.posts.PostFilter;
8import eu.mulk.mulkcms2.benki.posts.PostResource;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +01009import eu.mulk.mulkcms2.benki.users.User;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010010import io.quarkus.qute.Template;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010011import io.quarkus.qute.TemplateInstance;
12import io.quarkus.qute.api.ResourcePath;
Matthias Andreas Benkardf20e9b92020-02-10 21:14:57 +010013import io.quarkus.security.Authenticated;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010014import java.io.IOException;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010015import java.net.URI;
16import java.net.URISyntaxException;
17import java.time.OffsetDateTime;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010018import java.util.Set;
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010019import javax.annotation.CheckForNull;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010020import javax.inject.Inject;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010021import javax.json.JsonObject;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010022import javax.transaction.Transactional;
23import javax.validation.constraints.NotEmpty;
24import javax.validation.constraints.NotNull;
25import javax.validation.constraints.Pattern;
26import javax.ws.rs.BadRequestException;
27import javax.ws.rs.FormParam;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010028import javax.ws.rs.GET;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010029import javax.ws.rs.POST;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010030import javax.ws.rs.Path;
31import javax.ws.rs.Produces;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010032import javax.ws.rs.QueryParam;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010033import javax.ws.rs.core.Response;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010034import org.jsoup.Jsoup;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010035
36@Path("/bookmarks")
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +020037public class BookmarkResource extends PostResource {
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010038
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010039 @ResourcePath("benki/bookmarks/newBookmark.html")
40 @Inject
41 Template newBookmark;
42
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +020043 public BookmarkResource() {
44 super(PostFilter.BOOKMARKS_ONLY, "Bookmarks");
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010045 }
46
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010047 @POST
48 @Transactional
Matthias Andreas Benkardf20e9b92020-02-10 21:14:57 +010049 @Authenticated
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010050 public Response postBookmark(
51 @FormParam("uri") URI uri,
52 @FormParam("title") @NotEmpty String title,
53 @FormParam("description") String description,
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010054 @FormParam("visibility") @NotNull @Pattern(regexp = "public|semiprivate|private")
55 String visibility)
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010056 throws URISyntaxException {
57
58 var userName = identity.getPrincipal().getName();
Matthias Andreas Benkard088a21f2020-02-22 10:52:11 +010059 var user = User.findByNickname(userName);
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010060
61 var bookmark = new Bookmark();
62 bookmark.uri = uri.toString();
63 bookmark.title = title;
64 bookmark.tags = Set.of();
65 bookmark.description = description != null ? description : "";
66 bookmark.owner = user;
67 bookmark.date = OffsetDateTime.now();
68
69 if (visibility.equals("public")) {
70 Role world = Role.find("from Role r join r.tags tag where tag = 'world'").singleResult();
71 bookmark.targets = Set.of(world);
72 } else if (visibility.equals("semiprivate")) {
73 bookmark.targets = Set.copyOf(user.defaultTargets);
74 } else if (!visibility.equals("private")) {
75 throw new BadRequestException(String.format("invalid visibility ā€œ%sā€", visibility));
76 }
77
78 bookmark.persistAndFlush();
79
80 return Response.seeOther(new URI("/bookmarks")).build();
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010081 }
82
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010083 @GET
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +020084 @Authenticated
85 @Path("new")
86 @Produces(TEXT_HTML)
87 public TemplateInstance getNewBookmarkForm(
88 @QueryParam("uri") @CheckForNull String uri,
89 @QueryParam("title") @CheckForNull String title,
90 @QueryParam("description") @CheckForNull String description) {
91 return newBookmark.data("uri", uri).data("title", title).data("description", description);
92 }
93
94 @GET
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010095 @Path("page-info")
96 @Authenticated
97 @Produces(APPLICATION_JSON)
98 public JsonObject getPageInfo(@QueryParam("uri") URI uri) throws IOException {
99 var document = Jsoup.connect(uri.toString()).get();
100 return jsonProvider.createObjectBuilder().add("title", document.title()).build();
101 }
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +0100102}