1 package usecase.post;
2
3 import common.http.ParameterConverter;
4 import common.http.interceptor.InterceptableServlet;
5
6 import javax.inject.Inject;
7 import javax.servlet.ServletException;
8 import javax.servlet.annotation.WebServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.time.Instant;
13 import java.time.LocalDate;
14 import java.time.ZoneOffset;
15 import java.util.List;
16 import java.util.Map;
17 import java.util.function.Function;
18
19 import static usecase.post.PostSearchForm.SortCriteria.*;
20
21
22
23
24 @WebServlet("/loadposts")
25 class LoadPostsServlet extends InterceptableServlet {
26 @Inject private PostService postService;
27
28 private static final Function<LocalDate, Instant> LOCALDATE_TO_INSTANT =
29 x -> x.atStartOfDay().toInstant(ZoneOffset.UTC);
30
31 private static final Map<String, PostSearchForm.SortCriteria> SORT_CRITERIA = Map.of(
32 "oldest", OLDEST,
33 "newest", NEWEST,
34 "mostvoted", MOSTVOTED);
35
36 @Override
37 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
38 ParameterConverter converter = new ParameterConverter(req);
39 String content = req.getParameter("content");
40 String section = req.getParameter("section");
41 String author = req.getParameter("author");
42 Instant postedAfter = converter.getDateParameter("postedAfter")
43 .map(LOCALDATE_TO_INSTANT).orElse(null);
44 Instant postedBefore = converter.getDateParameter("postedBefore")
45 .map(LOCALDATE_TO_INSTANT).orElse(null);
46 PostSearchForm.SortCriteria orderBy = SORT_CRITERIA.get(req.getParameter("orderby"));
47 int page = converter.getIntParameter("page").orElse(1);
48 boolean onlyFollow = "on".equals(req.getParameter("onlyfollow"));
49 boolean includeBody = req.getParameter("includeBody") != null;
50
51 PostSearchForm postSearchForm = PostSearchForm.builder()
52 .content(content)
53 .onlyFollow(onlyFollow)
54 .includeBody(includeBody)
55 .sectionName(section)
56 .authorName(author)
57 .orderBy(orderBy)
58 .postedAfter(postedAfter)
59 .postedBefore(postedBefore)
60 .page(page)
61 .build();
62
63 List<PostPage> posts = postService.loadPosts(postSearchForm);
64 req.setAttribute("posts",posts);
65 req.getRequestDispatcher("/WEB-INF/views/partials/post-previews.jsp").forward(req,resp);
66 }
67
68 @Override
69 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
70 doGet(req, resp);
71 }
72 }