blob: 059335c5da4f8e0a606b15c625e8c076ccd507af [file] [log] [blame]
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +01001package eu.mulk.mulkcms2.benki.bookmarks;
2
Matthias Andreas Benkard593765d2020-04-18 20:44:07 +02003import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +01004import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
Matthias Andreas Benkard593765d2020-04-18 20:44:07 +02005import static javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +01006import static javax.ws.rs.core.MediaType.TEXT_HTML;
Matthias Andreas Benkard593765d2020-04-18 20:44:07 +02007import static javax.ws.rs.core.MediaType.WILDCARD;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +01008
Matthias Andreas Benkard06e6c812020-04-13 17:01:35 +02009import eu.mulk.mulkcms2.benki.posts.Post;
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +020010import eu.mulk.mulkcms2.benki.posts.PostFilter;
11import eu.mulk.mulkcms2.benki.posts.PostResource;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010012import io.quarkus.qute.Template;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010013import io.quarkus.qute.TemplateInstance;
14import io.quarkus.qute.api.ResourcePath;
Matthias Andreas Benkardf20e9b92020-02-10 21:14:57 +010015import io.quarkus.security.Authenticated;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010016import java.io.IOException;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010017import java.net.URI;
18import java.net.URISyntaxException;
Matthias Andreas Benkardcf0fe882020-04-19 18:33:37 +020019import java.security.NoSuchAlgorithmException;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010020import java.time.OffsetDateTime;
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020021import java.util.Objects;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010022import java.util.Set;
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010023import javax.annotation.CheckForNull;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010024import javax.inject.Inject;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010025import javax.json.JsonObject;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010026import javax.transaction.Transactional;
27import javax.validation.constraints.NotEmpty;
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020028import javax.validation.constraints.NotNull;
Matthias Andreas Benkard593765d2020-04-18 20:44:07 +020029import javax.ws.rs.Consumes;
Matthias Andreas Benkardbbac0c72020-04-19 19:38:49 +020030import javax.ws.rs.ForbiddenException;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010031import javax.ws.rs.FormParam;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010032import javax.ws.rs.GET;
Matthias Andreas Benkardbbac0c72020-04-19 19:38:49 +020033import javax.ws.rs.NotFoundException;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010034import javax.ws.rs.POST;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010035import javax.ws.rs.Path;
Matthias Andreas Benkardbbac0c72020-04-19 19:38:49 +020036import javax.ws.rs.PathParam;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010037import javax.ws.rs.Produces;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010038import javax.ws.rs.QueryParam;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010039import javax.ws.rs.core.Response;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010040import org.jsoup.Jsoup;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010041
42@Path("/bookmarks")
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +020043public class BookmarkResource extends PostResource {
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010044
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010045 @ResourcePath("benki/bookmarks/newBookmark.html")
46 @Inject
47 Template newBookmark;
48
Matthias Andreas Benkardcf0fe882020-04-19 18:33:37 +020049 public BookmarkResource() throws NoSuchAlgorithmException {
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +020050 super(PostFilter.BOOKMARKS_ONLY, "Bookmarks");
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010051 }
52
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010053 @POST
54 @Transactional
Matthias Andreas Benkardf20e9b92020-02-10 21:14:57 +010055 @Authenticated
Matthias Andreas Benkard593765d2020-04-18 20:44:07 +020056 @Produces(WILDCARD)
57 @Consumes({APPLICATION_FORM_URLENCODED, MULTIPART_FORM_DATA})
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010058 public Response postBookmark(
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020059 @FormParam("uri") @NotNull URI uri,
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010060 @FormParam("title") @NotEmpty String title,
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020061 @FormParam("description") @CheckForNull String description,
62 @FormParam("visibility") @NotNull Post.Visibility visibility)
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010063 throws URISyntaxException {
64
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020065 var user = Objects.requireNonNull(getCurrentUser());
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010066
67 var bookmark = new Bookmark();
68 bookmark.uri = uri.toString();
69 bookmark.title = title;
70 bookmark.tags = Set.of();
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020071 bookmark.description = description;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010072 bookmark.owner = user;
73 bookmark.date = OffsetDateTime.now();
74
Matthias Andreas Benkard06e6c812020-04-13 17:01:35 +020075 assignPostTargets(visibility, user, bookmark);
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010076
77 bookmark.persistAndFlush();
78
79 return Response.seeOther(new URI("/bookmarks")).build();
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010080 }
81
Matthias Andreas Benkardbbac0c72020-04-19 19:38:49 +020082 @POST
83 @Transactional
84 @Authenticated
85 @Produces(WILDCARD)
86 @Consumes({APPLICATION_FORM_URLENCODED, MULTIPART_FORM_DATA})
87 @Path("{id}/edit")
88 public Response patchMessage(
89 @PathParam("id") int id,
90 @FormParam("uri") @NotNull URI uri,
91 @FormParam("title") @NotEmpty String title,
92 @FormParam("description") @CheckForNull String description,
93 @FormParam("visibility") Post.Visibility visibility)
94 throws URISyntaxException {
95
96 var user = Objects.requireNonNull(getCurrentUser());
97
98 var bookmark = getSession().byId(Bookmark.class).load(id);
99
100 if (bookmark == null) {
101 throw new NotFoundException();
102 }
103
104 if (bookmark.owner == null || !Objects.equals(bookmark.owner.id, user.id)) {
105 throw new ForbiddenException();
106 }
107
108 bookmark.uri = uri.toString();
109 bookmark.title = title;
110 bookmark.tags = Set.of();
111 bookmark.description = description;
112 bookmark.owner = user;
113
114 assignPostTargets(visibility, user, bookmark);
115
116 return Response.seeOther(new URI("/bookmarks")).build();
117 }
118
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +0100119 @GET
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +0200120 @Authenticated
121 @Path("new")
122 @Produces(TEXT_HTML)
123 public TemplateInstance getNewBookmarkForm(
124 @QueryParam("uri") @CheckForNull String uri,
125 @QueryParam("title") @CheckForNull String title,
126 @QueryParam("description") @CheckForNull String description) {
127 return newBookmark.data("uri", uri).data("title", title).data("description", description);
128 }
129
130 @GET
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +0100131 @Path("page-info")
132 @Authenticated
133 @Produces(APPLICATION_JSON)
134 public JsonObject getPageInfo(@QueryParam("uri") URI uri) throws IOException {
135 var document = Jsoup.connect(uri.toString()).get();
136 return jsonProvider.createObjectBuilder().add("title", document.title()).build();
137 }
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +0100138}