diff --git a/src/main/java/ru/ulstu/is/labwork/Lab4/mvc/Feed.java b/src/main/java/ru/ulstu/is/labwork/Lab4/mvc/Feed.java index 2698c68..36d731d 100644 --- a/src/main/java/ru/ulstu/is/labwork/Lab4/mvc/Feed.java +++ b/src/main/java/ru/ulstu/is/labwork/Lab4/mvc/Feed.java @@ -29,33 +29,18 @@ public class Feed { } @GetMapping - public String getPosts(@RequestParam(required = false) String search, HttpServletRequest request, HttpSession session, Model model) { + public String getPosts(@RequestParam(required = false) String search, + HttpServletRequest request, + HttpSession session, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "5") int size, + Model model) { model.addAttribute("request", request); model.addAttribute("session", session); if (search == null) { model.addAttribute("posts", postService.findAllPosts().stream().map(PostDto::new).toList()); } else { - var posts = new ArrayList<>(postService.searchPosts(search)); - var comments = commentService.searchComments(search); - for (var post: posts) { - post.getComments().clear(); - } - for (var comment: comments) { - boolean found = false; - for (var post: posts) { - if (Objects.equals(comment.getPost().getId(), post.getId())) { - post.getComments().add(comment); - found = true; - break; - } - } - if (!found) { - var newPost = comment.getPost(); - newPost.getComments().clear(); - newPost.getComments().add(comment); - posts.add(newPost); - } - } + var posts = postService.searchPosts(page, size, search); model.addAttribute("posts", posts.stream().map(PostDto::new).toList()); } model.addAttribute("customers", customerService.findAllCustomers().stream().map(CustomerDto::new).toList()); diff --git a/src/main/java/ru/ulstu/is/labwork/Lab4/repositories/CommentRepository.java b/src/main/java/ru/ulstu/is/labwork/Lab4/repositories/CommentRepository.java index 701ebeb..5198093 100644 --- a/src/main/java/ru/ulstu/is/labwork/Lab4/repositories/CommentRepository.java +++ b/src/main/java/ru/ulstu/is/labwork/Lab4/repositories/CommentRepository.java @@ -1,5 +1,7 @@ package ru.ulstu.is.labwork.Lab4.repositories; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import ru.ulstu.is.labwork.Lab4.model.Comment; import org.springframework.data.jpa.repository.Query; @@ -11,5 +13,5 @@ import java.util.List; public interface CommentRepository extends JpaRepository<Comment, Long> { @Query("SELECT DISTINCT c FROM Comment c WHERE c.content LIKE %:tag%") - List<Comment> searchComments(@Param("tag") String tag); + Page<Comment> searchComments(@Param("tag") String tag, Pageable pageable); } \ No newline at end of file diff --git a/src/main/java/ru/ulstu/is/labwork/Lab4/repositories/PostRepository.java b/src/main/java/ru/ulstu/is/labwork/Lab4/repositories/PostRepository.java index dac2360..9fd26c0 100644 --- a/src/main/java/ru/ulstu/is/labwork/Lab4/repositories/PostRepository.java +++ b/src/main/java/ru/ulstu/is/labwork/Lab4/repositories/PostRepository.java @@ -1,5 +1,7 @@ package ru.ulstu.is.labwork.Lab4.repositories; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import ru.ulstu.is.labwork.Lab4.model.Post; @@ -7,9 +9,11 @@ import org.springframework.data.repository.query.Param; import java.util.List; -import java.util.List; - public interface PostRepository extends JpaRepository<Post, Long> { + //@Query("SELECT DISTINCT p FROM Post p WHERE p.title LIKE %:tag% OR p.content LIKE %:tag%") + //List<Post> searchPosts(@Param("tag") String tag); @Query("SELECT DISTINCT p FROM Post p WHERE p.title LIKE %:tag% OR p.content LIKE %:tag%") - List<Post> searchPosts(@Param("tag") String tag); + Page<Post> searchPosts(@Param("tag") String tag, Pageable pageable); + + //Page<Post> findDistinctByContentOrTitleLikeIgnoreCase } diff --git a/src/main/java/ru/ulstu/is/labwork/Lab4/services/CommentService.java b/src/main/java/ru/ulstu/is/labwork/Lab4/services/CommentService.java index 2814a2a..62c7bdc 100644 --- a/src/main/java/ru/ulstu/is/labwork/Lab4/services/CommentService.java +++ b/src/main/java/ru/ulstu/is/labwork/Lab4/services/CommentService.java @@ -1,6 +1,7 @@ package ru.ulstu.is.labwork.Lab4.services; import jakarta.persistence.EntityNotFoundException; import jakarta.transaction.Transactional; +import org.springframework.data.domain.PageRequest; import ru.ulstu.is.labwork.Lab4.model.Comment; import ru.ulstu.is.labwork.Lab4.model.Customer; import ru.ulstu.is.labwork.Lab4.model.Post; @@ -20,10 +21,10 @@ public class CommentService { this.commentRepository = commentRepository; } - @jakarta.transaction.Transactional - public List<Comment> searchComments(String tag) { - return commentRepository.searchComments(tag); - } + //@jakarta.transaction.Transactional + //public List<Comment> searchComments(String tag) { + // return commentRepository.searchComments(tag, PageRequest.of(0,10)).stream().toList(); + //} @Transactional diff --git a/src/main/java/ru/ulstu/is/labwork/Lab4/services/PostService.java b/src/main/java/ru/ulstu/is/labwork/Lab4/services/PostService.java index 5b05229..b343497 100644 --- a/src/main/java/ru/ulstu/is/labwork/Lab4/services/PostService.java +++ b/src/main/java/ru/ulstu/is/labwork/Lab4/services/PostService.java @@ -2,6 +2,9 @@ package ru.ulstu.is.labwork.Lab4.services; import jakarta.persistence.EntityNotFoundException; import jakarta.transaction.Transactional; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import ru.ulstu.is.labwork.Lab4.DTO.PostDto; import ru.ulstu.is.labwork.Lab4.model.Comment; import ru.ulstu.is.labwork.Lab4.model.Customer; import ru.ulstu.is.labwork.Lab4.model.Post; @@ -10,19 +13,45 @@ import org.springframework.util.StringUtils; import ru.ulstu.is.labwork.Lab4.repositories.CommentRepository; import ru.ulstu.is.labwork.Lab4.repositories.PostRepository; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; @Service public class PostService { private final PostRepository postRepository; + private final CommentRepository commentRepository; - public PostService(PostRepository postRepository) { + public PostService(PostRepository postRepository, CommentRepository commentRepository) { this.postRepository = postRepository; + this.commentRepository = commentRepository; } @Transactional - public List<Post> searchPosts(String tag) { - return postRepository.searchPosts(tag); + public List<Post> searchPosts(int page, int size, String tag) { + //var posts = postRepository.searchPosts(tag); + var posts = new ArrayList<>(postRepository.searchPosts(tag, PageRequest.of(page, size)).getContent().stream().toList()); + var comments = new ArrayList<>(commentRepository.searchComments(tag, PageRequest.of(page, size)).getContent().stream().toList()); + for (var post: posts) { + post.getComments().clear(); + } + for (var comment: comments) { + boolean found = false; + for (var post: posts) { + if (Objects.equals(comment.getPost().getId(), post.getId())) { + post.getComments().add(comment); + found = true; + break; + } + } + if (!found) { + var newPost = comment.getPost(); + newPost.getComments().clear(); + newPost.getComments().add(comment); + posts.add(newPost); + } + } + return posts; } @Transactional diff --git a/src/main/resources/templates/default.html b/src/main/resources/templates/default.html index e3eaa1d..6ed2ced 100644 --- a/src/main/resources/templates/default.html +++ b/src/main/resources/templates/default.html @@ -7,13 +7,13 @@ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <link rel="stylesheet" href="https://unpkg.com/chota@latest"> - <title>LabWork04 - Social Network</title> + <title>LabWork05 - Social Network</title> </head> <body class="container"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script> <div> <div> - <p class='text-center m-3 h3'>LabWork04 - Social Network</p> + <p class='text-center m-3 h3'>LabWork05 - Social Network</p> </div> <div class="nav row"> <div class="nav-left col-4" th:with="activeLink=${request.requestURI}">