blob: 40f71661a6d47644f98d8a9365592c90600fa9a0 [file] [log] [blame]
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +01001package eu.mulk.mulkcms2.benki.bookmarks;
2
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +02003import static jakarta.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
4import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
5import static jakarta.ws.rs.core.MediaType.MULTIPART_FORM_DATA;
6import static jakarta.ws.rs.core.MediaType.TEXT_HTML;
7import static jakarta.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 Benkard49b01512021-07-05 06:45:54 +020012import io.quarkus.qute.CheckedTemplate;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010013import io.quarkus.qute.TemplateInstance;
Matthias Andreas Benkardf20e9b92020-02-10 21:14:57 +010014import io.quarkus.security.Authenticated;
Matthias Andreas Benkard37dce402023-09-06 13:51:43 +020015import io.smallrye.common.annotation.Blocking;
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +020016import jakarta.json.JsonObject;
17import jakarta.transaction.Transactional;
18import jakarta.validation.constraints.NotEmpty;
19import jakarta.validation.constraints.NotNull;
20import jakarta.ws.rs.Consumes;
21import jakarta.ws.rs.ForbiddenException;
22import jakarta.ws.rs.FormParam;
23import jakarta.ws.rs.GET;
24import jakarta.ws.rs.NotFoundException;
25import jakarta.ws.rs.POST;
26import jakarta.ws.rs.Path;
27import jakarta.ws.rs.PathParam;
28import jakarta.ws.rs.Produces;
29import jakarta.ws.rs.QueryParam;
30import jakarta.ws.rs.core.Response;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010031import java.io.IOException;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010032import java.net.URI;
33import java.net.URISyntaxException;
Matthias Andreas Benkardcf0fe882020-04-19 18:33:37 +020034import java.security.NoSuchAlgorithmException;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010035import java.time.OffsetDateTime;
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020036import java.util.Objects;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010037import java.util.Set;
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010038import javax.annotation.CheckForNull;
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +010039import org.jsoup.Jsoup;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010040
41@Path("/bookmarks")
Matthias Andreas Benkard37dce402023-09-06 13:51:43 +020042@Blocking
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +020043public class BookmarkResource extends PostResource {
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010044
Matthias Andreas Benkard49b01512021-07-05 06:45:54 +020045 @CheckedTemplate(basePath = "benki/bookmarks")
46 static class Templates {
47
48 public static native TemplateInstance newBookmark(
49 @CheckForNull String uri, @CheckForNull String title, @CheckForNull String description);
50 }
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010051
Matthias Andreas Benkardcf0fe882020-04-19 18:33:37 +020052 public BookmarkResource() throws NoSuchAlgorithmException {
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +020053 super(PostFilter.BOOKMARKS_ONLY, "Bookmarks");
Matthias Andreas Benkardfc427e22020-02-13 05:00:54 +010054 }
55
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010056 @POST
57 @Transactional
Matthias Andreas Benkardf20e9b92020-02-10 21:14:57 +010058 @Authenticated
Matthias Andreas Benkard593765d2020-04-18 20:44:07 +020059 @Produces(WILDCARD)
60 @Consumes({APPLICATION_FORM_URLENCODED, MULTIPART_FORM_DATA})
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010061 public Response postBookmark(
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020062 @FormParam("uri") @NotNull URI uri,
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010063 @FormParam("title") @NotEmpty String title,
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020064 @FormParam("description") @CheckForNull String description,
65 @FormParam("visibility") @NotNull Post.Visibility visibility)
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010066 throws URISyntaxException {
67
Matthias Andreas Benkard1e7674c2020-04-18 20:28:51 +020068 var user = Objects.requireNonNull(getCurrentUser());
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010069
70 var bookmark = new Bookmark();
71 bookmark.uri = uri.toString();
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010072 bookmark.tags = Set.of();
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010073 bookmark.owner = user;
74 bookmark.date = OffsetDateTime.now();
75
Matthias Andreas Benkardb4a5bfd2023-08-06 21:57:45 +020076 bookmark.persist();
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010077
Matthias Andreas Benkardb4a5bfd2023-08-06 21:57:45 +020078 bookmark.setTitle(title);
79 bookmark.setDescription(description);
80
81 assignPostTargets(visibility, user, bookmark);
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010082
83 return Response.seeOther(new URI("/bookmarks")).build();
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010084 }
85
Matthias Andreas Benkardbbac0c72020-04-19 19:38:49 +020086 @POST
87 @Transactional
88 @Authenticated
89 @Produces(WILDCARD)
90 @Consumes({APPLICATION_FORM_URLENCODED, MULTIPART_FORM_DATA})
91 @Path("{id}/edit")
92 public Response patchMessage(
93 @PathParam("id") int id,
94 @FormParam("uri") @NotNull URI uri,
95 @FormParam("title") @NotEmpty String title,
96 @FormParam("description") @CheckForNull String description,
97 @FormParam("visibility") Post.Visibility visibility)
98 throws URISyntaxException {
99
100 var user = Objects.requireNonNull(getCurrentUser());
101
102 var bookmark = getSession().byId(Bookmark.class).load(id);
103
104 if (bookmark == null) {
105 throw new NotFoundException();
106 }
107
108 if (bookmark.owner == null || !Objects.equals(bookmark.owner.id, user.id)) {
109 throw new ForbiddenException();
110 }
111
112 bookmark.uri = uri.toString();
Matthias Andreas Benkardbbac0c72020-04-19 19:38:49 +0200113 bookmark.tags = Set.of();
Matthias Andreas Benkardd5498fc2020-08-23 21:51:00 +0200114 bookmark.setTitle(title);
115 bookmark.setDescription(description);
Matthias Andreas Benkardbbac0c72020-04-19 19:38:49 +0200116 bookmark.owner = user;
117
118 assignPostTargets(visibility, user, bookmark);
119
120 return Response.seeOther(new URI("/bookmarks")).build();
121 }
122
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +0100123 @GET
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +0200124 @Authenticated
125 @Path("new")
126 @Produces(TEXT_HTML)
127 public TemplateInstance getNewBookmarkForm(
128 @QueryParam("uri") @CheckForNull String uri,
129 @QueryParam("title") @CheckForNull String title,
130 @QueryParam("description") @CheckForNull String description) {
Matthias Andreas Benkard49b01512021-07-05 06:45:54 +0200131 return Templates.newBookmark(uri, title, description);
Matthias Andreas Benkard4940b292020-03-29 18:41:07 +0200132 }
133
134 @GET
Matthias Andreas Benkard35e14e42020-02-12 06:20:05 +0100135 @Path("page-info")
136 @Authenticated
137 @Produces(APPLICATION_JSON)
138 public JsonObject getPageInfo(@QueryParam("uri") URI uri) throws IOException {
139 var document = Jsoup.connect(uri.toString()).get();
140 return jsonProvider.createObjectBuilder().add("title", document.title()).build();
141 }
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +0100142}