View Javadoc
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   * Classe che permette di visualizzare i post.
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  }