blob: 463551c48386a9c177cf98b1f7581d43c5b8b1f3 [file] [log] [blame]
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +01001package eu.mulk.mulkcms2.benki.bookmarks;
2
3import static javax.ws.rs.core.MediaType.TEXT_HTML;
4
5import eu.mulk.mulkcms2.benki.accesscontrol.Role;
6import eu.mulk.mulkcms2.benki.users.User;
7import io.quarkus.panache.common.Sort;
8import io.quarkus.qute.Template;
9import io.quarkus.qute.TemplateExtension;
10import io.quarkus.qute.TemplateInstance;
11import io.quarkus.qute.api.ResourcePath;
12import io.quarkus.security.identity.SecurityIdentity;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010013import java.net.URI;
14import java.net.URISyntaxException;
15import java.time.OffsetDateTime;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010016import java.time.format.DateTimeFormatter;
17import java.time.format.FormatStyle;
18import java.time.temporal.TemporalAccessor;
19import java.util.List;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010020import java.util.Set;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010021import javax.inject.Inject;
22import javax.json.spi.JsonProvider;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010023import javax.transaction.Transactional;
24import javax.validation.constraints.NotEmpty;
25import javax.validation.constraints.NotNull;
26import javax.validation.constraints.Pattern;
27import javax.ws.rs.BadRequestException;
28import javax.ws.rs.FormParam;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010029import javax.ws.rs.GET;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010030import javax.ws.rs.POST;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010031import javax.ws.rs.Path;
32import javax.ws.rs.Produces;
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010033import javax.ws.rs.core.Response;
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010034import org.jboss.logging.Logger;
35
36@Path("/bookmarks")
37public class BookmarkResource {
38
39 private static Logger log = Logger.getLogger(BookmarkResource.class);
40
41 private static DateTimeFormatter htmlDateFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
42
43 private static DateTimeFormatter humanDateFormatter =
44 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT);
45
46 private static JsonProvider jsonProvider = JsonProvider.provider();
47
48 @ResourcePath("benki/bookmarks/bookmarkList.html")
49 @Inject
50 Template bookmarkList;
51
52 @Inject SecurityIdentity identity;
53
54 @GET
55 @Produces(TEXT_HTML)
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010056 public TemplateInstance getIndex() {
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +010057 List<Bookmark> bookmarks;
58 if (identity.isAnonymous()) {
59 Role world = Role.find("from Role r join r.tags tag where tag = 'world'").singleResult();
60 bookmarks =
61 Bookmark.find(
62 "select bm from Bookmark bm join bm.targets target left join fetch bm.owner where target = ?1",
63 Sort.by("date").descending(),
64 world)
65 .list();
66 } else {
67 var userName = identity.getPrincipal().getName();
68 User user =
69 User.find("from BenkiUser u join u.nicknames n where ?1 = n", userName).singleResult();
70 bookmarks =
71 Bookmark.find(
72 "select bm from BenkiUser u inner join u.visibleBookmarks bm left join fetch bm.owner where u.id = ?1",
73 Sort.by("date").descending(),
74 user.id)
75 .list();
76 }
Matthias Andreas Benkardbca94612020-02-10 20:58:13 +010077 return bookmarkList
78 .data("bookmarks", bookmarks)
79 .data("authenticated", !identity.isAnonymous());
80 }
81
82 @POST
83 @Transactional
84 public Response postBookmark(
85 @FormParam("uri") URI uri,
86 @FormParam("title") @NotEmpty String title,
87 @FormParam("description") String description,
88 @FormParam("visibility") @NotNull @Pattern(regexp = "public|semiprivate|private") String visibility)
89 throws URISyntaxException {
90
91 var userName = identity.getPrincipal().getName();
92 User user =
93 User.find("from BenkiUser u join u.nicknames n where ?1 = n", userName).singleResult();
94
95 var bookmark = new Bookmark();
96 bookmark.uri = uri.toString();
97 bookmark.title = title;
98 bookmark.tags = Set.of();
99 bookmark.description = description != null ? description : "";
100 bookmark.owner = user;
101 bookmark.date = OffsetDateTime.now();
102
103 if (visibility.equals("public")) {
104 Role world = Role.find("from Role r join r.tags tag where tag = 'world'").singleResult();
105 bookmark.targets = Set.of(world);
106 } else if (visibility.equals("semiprivate")) {
107 bookmark.targets = Set.copyOf(user.defaultTargets);
108 } else if (!visibility.equals("private")) {
109 throw new BadRequestException(String.format("invalid visibility ā€œ%sā€", visibility));
110 }
111
112 bookmark.persistAndFlush();
113
114 return Response.seeOther(new URI("/bookmarks")).build();
Matthias Andreas Benkard2d4f92e2020-02-09 16:15:07 +0100115 }
116
117 @TemplateExtension
118 static String humanDateTime(TemporalAccessor x) {
119 return humanDateFormatter.format(x);
120 }
121
122 @TemplateExtension
123 static String htmlDateTime(TemporalAccessor x) {
124 return htmlDateFormatter.format(x);
125 }
126}