Skip to content

Commit

Permalink
Feat: 한줄요약 리스트 조회 API 구현 (#72)
Browse files Browse the repository at this point in the history
* #53 - feat: isbn13 을 활용하여 해당 책의 한줄요약 리스트 조회 구현. 또한 한줄요약 리스트 조회 구현

* #53 - feat: 책과 관련된 한줄요약 수 가져오는 기능 구현

* #53 - feat: 전체 한줄요약, 해당 책의 한줄요약, 책의 한줄요약 개수 조회하는 테스트 코드 구현
  • Loading branch information
morenow98 authored Feb 5, 2024
1 parent 65238e9 commit 82452de
Show file tree
Hide file tree
Showing 7 changed files with 134 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
package cotato.bookitlist.review.controller;

import cotato.bookitlist.book.controller.IsValidIsbn;
import cotato.bookitlist.config.security.jwt.AuthDetails;
import cotato.bookitlist.review.dto.request.ReviewRegisterRequest;
import cotato.bookitlist.review.dto.request.ReviewUpdateRequest;
import cotato.bookitlist.review.dto.response.ReviewCountResponse;
import cotato.bookitlist.review.dto.response.ReviewListResponse;
import cotato.bookitlist.review.dto.response.ReviewResponse;
import cotato.bookitlist.review.service.ReviewService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
Expand Down Expand Up @@ -53,4 +59,26 @@ public ResponseEntity<ReviewResponse> getReview(
) {
return ResponseEntity.ok(ReviewResponse.from(reviewService.getReview(reviewId)));
}

@GetMapping("/all")
public ResponseEntity<ReviewListResponse> getAllReview(
@PageableDefault(sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable
) {
return ResponseEntity.ok(reviewService.getAllReview(pageable));
}

@GetMapping
public ResponseEntity<ReviewListResponse> searchReview(
@IsValidIsbn @RequestParam String isbn13,
@PageableDefault(sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable
) {
return ResponseEntity.ok(reviewService.searchReview(isbn13, pageable));
}

@GetMapping("/count")
public ResponseEntity<ReviewCountResponse> getReviewCount(
@IsValidIsbn @RequestParam String isbn13
) {
return ResponseEntity.ok(reviewService.getReviewCount(isbn13));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package cotato.bookitlist.review.dto.response;

public record ReviewCountResponse(
int count
) {
public static ReviewCountResponse of(int count) {
return new ReviewCountResponse(count);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package cotato.bookitlist.review.dto.response;

import cotato.bookitlist.review.domain.Review;
import cotato.bookitlist.review.dto.ReviewDto;
import org.springframework.data.domain.Page;

import java.util.List;

public record ReviewListResponse(
int totalResults,
int totalPages,
int startIndex,
int itemsPerPage,
List<ReviewDto> reviewDtoList
) {
public static ReviewListResponse from(Page<Review> page) {
return new ReviewListResponse(
(int) page.getTotalElements(),
page.getTotalPages(),
page.getNumber(),
page.getSize(),
page.stream().map(ReviewDto::from).toList()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package cotato.bookitlist.review.repository;

import cotato.bookitlist.book.domain.entity.Book;
import cotato.bookitlist.review.domain.Review;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ReviewRepository extends JpaRepository<Review, Long> {

List<Review> findAllByBook(Book book);
Page<Review> findByBook_Isbn13(String isbn13, Pageable pageable);
int countByBook_Isbn13(String isbn13);
}
18 changes: 18 additions & 0 deletions src/main/java/cotato/bookitlist/review/service/ReviewService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
import cotato.bookitlist.review.dto.ReviewDto;
import cotato.bookitlist.review.dto.request.ReviewRegisterRequest;
import cotato.bookitlist.review.dto.request.ReviewUpdateRequest;
import cotato.bookitlist.review.dto.response.ReviewCountResponse;
import cotato.bookitlist.review.dto.response.ReviewListResponse;
import cotato.bookitlist.review.repository.ReviewRepository;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -49,4 +52,19 @@ public ReviewDto getReview(Long reviewId) {

return ReviewDto.from(review);
}

@Transactional(readOnly = true)
public ReviewListResponse getAllReview(Pageable pageable) {
return ReviewListResponse.from(reviewRepository.findAll(pageable));
}

@Transactional(readOnly = true)
public ReviewListResponse searchReview(String isbn13, Pageable pageable) {
return ReviewListResponse.from(reviewRepository.findByBook_Isbn13(isbn13, pageable));
}

@Transactional(readOnly = true)
public ReviewCountResponse getReviewCount(String isbn13) {
return ReviewCountResponse.of(reviewRepository.countByBook_Isbn13(isbn13));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;

@Transactional
@SpringBootTest
Expand Down Expand Up @@ -172,4 +172,47 @@ void givenNonExistedReviewId_whenGettingReview_thenErrorResponse() throws Except
.andExpect(status().isNotFound())
;
}

@Test
@DisplayName("isbn13을 이용해 한줄요약을 조회한다.")
void givenIsbn13_whenSearchingReview_thenReturnReviewListResponse() throws Exception {
//given
String isbn13 = "9788931514810";

//when & then
mockMvc.perform(get("/reviews")
.param("isbn13", isbn13)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.totalResults").value(4))
;
}

@Test
@DisplayName("전체 게시글을 조회한다.")
void givenNothing_whenSearchingPost_thenReturnPostListResponse() throws Exception {
//given

//when & then
mockMvc.perform(get("/posts/all")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.totalResults").value(6))
;
}

@Test
@DisplayName("isbn13을 이용해 게시글 count를 조회한다.")
void givenIsbn13_whenCountingPost_thenReturnPostCountResponse() throws Exception {
//given
String isbn13 = "9788931514810";

//when & then
mockMvc.perform(get("/posts/count")
.param("isbn13", isbn13)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.count").value(4))
;
}
}
6 changes: 5 additions & 1 deletion src/test/resources/data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,11 @@ VALUES (1, 1, 'postTitle', 'postContent', 1, 0, false),

INSERT INTO review (member_id, book_id, content, like_count, view_count, deleted)
VALUES (1, 1, 'reviewContent', 0, 0, false),
(2, 1, 'reviewContent', 0, 0, false);
(2, 1, 'reviewContent1', 0, 0, false),
(2, 1, 'rContent', 0, 0, false),
(2, 1, 'rContent2', 0, 0, false),
(2, 2, 'rContent3', 0, 0, false),
(2, 2, 'reContent2', 0, 0, false);

INSERT INTO post_like (member_id, post_id)
VALUES (1, 2),
Expand Down

0 comments on commit 82452de

Please sign in to comment.