From 10e595d3465dd4867a1ede22233ea7012e8e3ab6 Mon Sep 17 00:00:00 2001 From: Marco Cetica Date: Thu, 11 Jan 2024 17:08:07 +0100 Subject: [PATCH] Added 'getPostByTitle' method and improved query design --- .../ceticamarco/bits/post/PostController.java | 18 +++++++++++++++--- .../ceticamarco/bits/post/PostRepository.java | 6 ++++++ .../com/ceticamarco/bits/post/PostService.java | 17 +++++++++++++++-- .../ceticamarco/bits/user/UserRepository.java | 13 +++++++------ 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/ceticamarco/bits/post/PostController.java b/src/main/java/com/ceticamarco/bits/post/PostController.java index e1fb32b..a0c1cfc 100644 --- a/src/main/java/com/ceticamarco/bits/post/PostController.java +++ b/src/main/java/com/ceticamarco/bits/post/PostController.java @@ -63,11 +63,11 @@ public class PostController { * @return the content of the post */ @GetMapping("/posts/{postId}") - public ResponseEntity getPost(@PathVariable("postId") String postId) { + public ResponseEntity getPostById(@PathVariable("postId") String postId) { var objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - var res = postService.getPost(postId).map(post -> { + var res = postService.getPostById(postId).map(post -> { try { return objectMapper.writeValueAsString(post); } catch(JsonProcessingException e) { @@ -87,13 +87,25 @@ public class PostController { : new ResponseEntity<>(res.getLeft(), HttpStatus.BAD_REQUEST); } + /** + * Get posts by title + * + * @param req the body contains the title. + * Without the title, it acts the same as 'GET /posts' + * @return the list of posts + */ + @PostMapping("/posts") + public ResponseEntity> getPostByTitle(@RequestBody Post req) { + return new ResponseEntity<>(postService.getPostByTitle(req.getTitle()), HttpStatus.OK); + } + /** * Add a new post * * @param post the new post to be submitted * @return on success the new postId, on failure the error message */ - @PostMapping("/posts") + @PostMapping("/posts/new") public ResponseEntity submitPost(@Valid @RequestBody Post post) { var objectMapper = new ObjectMapper(); var res = postService.addNewPost(post).map(postId -> { diff --git a/src/main/java/com/ceticamarco/bits/post/PostRepository.java b/src/main/java/com/ceticamarco/bits/post/PostRepository.java index 1c20274..9f3f4b3 100644 --- a/src/main/java/com/ceticamarco/bits/post/PostRepository.java +++ b/src/main/java/com/ceticamarco/bits/post/PostRepository.java @@ -1,6 +1,12 @@ package com.ceticamarco.bits.post; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; public interface PostRepository extends JpaRepository { + @Query("SELECT p FROM Post p WHERE p.title LIKE %:title%") + List findPostByTitle(@Param("title") String title); } diff --git a/src/main/java/com/ceticamarco/bits/post/PostService.java b/src/main/java/com/ceticamarco/bits/post/PostService.java index 25e45e1..6760f6d 100644 --- a/src/main/java/com/ceticamarco/bits/post/PostService.java +++ b/src/main/java/com/ceticamarco/bits/post/PostService.java @@ -43,8 +43,8 @@ public class PostService { }).collect(Collectors.toList()); } - Either getPost(String postId) { - Optional post = postRepository.findById(postId); + Either getPostById(String postId) { + var post = postRepository.findById(postId); // Check whether the post exists or not if(post.isEmpty()) { @@ -58,7 +58,20 @@ public class PostService { } return Either.right(post.get()); + } + List getPostByTitle(String title) { + var postList = postRepository.findPostByTitle(title); + + // Conceal user information + postList.forEach(post -> { + if(post.getUser() != null) { + post.getUser().setId(null); + post.getUser().setPassword(null); + } + }); + + return postList; } Either addNewPost(Post post) { diff --git a/src/main/java/com/ceticamarco/bits/user/UserRepository.java b/src/main/java/com/ceticamarco/bits/user/UserRepository.java index 416dc22..1ae45ae 100644 --- a/src/main/java/com/ceticamarco/bits/user/UserRepository.java +++ b/src/main/java/com/ceticamarco/bits/user/UserRepository.java @@ -2,18 +2,19 @@ package com.ceticamarco.bits.user; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.Optional; public interface UserRepository extends JpaRepository { - @Query("SELECT u FROM User u WHERE u.email = ?1") - Optional findUserByEmail(String email); + @Query("SELECT u FROM User u WHERE u.email = :email") + Optional findUserByEmail(@Param("email") String email); - @Query("SELECT u FROM User u WHERE u.username = ?1") - Optional findUserByUsername(String username); + @Query("SELECT u FROM User u WHERE u.username = :username") + Optional findUserByUsername(@Param("username") String username); - @Query("SELECT u.password FROM User u WHERE u.email = ?1") - Optional findPasswordByEmail(String email); + @Query("SELECT u.password FROM User u WHERE u.email = :email") + Optional findPasswordByEmail(@Param("email") String email); void deleteUserByEmail(String email); } \ No newline at end of file