Skip to content

Commit

Permalink
Feat: 멤버가 작성한 한줄요약 조회 API 구현 (#168)
Browse files Browse the repository at this point in the history
* #155 - refactor: profileStatus 에서 status 로 바꾸지 않은 변수명들 변경

* #155 - feat: 멤버가 작성한 한줄요약 조회 API 구현

* #155 - feat: 멤버가 작성한 한줄요약 조회 API 테스트 구현

* #155 - fix: 한줄요약 상세 조회 시 where 절 구현 오류 수정
  • Loading branch information
morenow98 authored Feb 19, 2024
1 parent 1fae160 commit 4308871
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/main/java/cotato/bookitlist/member/dto/MemberDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public record MemberDto(
String email,
String name,
String profileLink,
ProfileStatus profileStatus,
ProfileStatus status,
boolean isMe
) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public record MemberResponse(
String email,
String name,
String profileLink,
ProfileStatus profileStatus,
ProfileStatus status,
boolean isMe
) {

Expand All @@ -21,7 +21,7 @@ public static MemberResponse from(MemberDto dto) {
dto.email(),
dto.name(),
dto.profileLink(),
dto.profileStatus(),
dto.status(),
true
);
}
Expand All @@ -31,7 +31,7 @@ public static MemberResponse from(MemberDto dto) {
null,
dto.name(),
dto.profileLink(),
dto.profileStatus(),
dto.status(),
false
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,10 @@ public PostListResponse getAllPost(Pageable pageable, Long memberId) {

@Transactional(readOnly = true)
public PostListResponse searchPost(String isbn13, Long memberId, Long loginMemberId, Pageable pageable) {
return PostListResponse.fromDto(postRepository.findPublicPostWithLikedByIsbn13(isbn13, memberId, loginMemberId, pageable), loginMemberId);
return PostListResponse.fromDto(
postRepository.findPublicPostWithLikedByIsbn13(isbn13, memberId, loginMemberId, pageable),
loginMemberId
);
}

@Transactional(readOnly = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,14 +94,15 @@ public ResponseEntity<ReviewListResponse> getAllReview(

@GetMapping
public ResponseEntity<ReviewListResponse> searchReview(
@IsValidIsbn @RequestParam String isbn13,
@IsValidIsbn @RequestParam(required = false) String isbn13,
@RequestParam(name = "member-id", required = false) Long memberId,
@PageableDefault(sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable,
@AuthenticationPrincipal AuthDetails details
) {
if (details == null) {
return ResponseEntity.ok(reviewService.searchReview(isbn13, DEFAULT_USER_ID, pageable));
return ResponseEntity.ok(reviewService.searchReview(isbn13, memberId, DEFAULT_USER_ID, pageable));
}
return ResponseEntity.ok(reviewService.searchReview(isbn13, details.getId(), pageable));
return ResponseEntity.ok(reviewService.searchReview(isbn13, memberId, details.getId(), pageable));
}

@GetMapping("/count")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
import java.util.Optional;

public interface ReviewRepositoryCustom {
Page<ReviewDto> findPublicReviewWithLikedByIsbn13(String isbn13, Long memberId, Pageable pageable);
Page<ReviewDto> findPublicReviewWithLikedByIsbn13(String isbn13, Long memberId, Long loginMemberId, Pageable pageable);
Optional<ReviewDetailDto> findPublicReviewDetailByReviewId(Long reviewId, Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public class ReviewRepositoryCustomImpl implements ReviewRepositoryCustom {
private final JPAQueryFactory queryFactory;

@Override
public Page<ReviewDto> findPublicReviewWithLikedByIsbn13(String isbn13, Long memberId, Pageable pageable) {
public Page<ReviewDto> findPublicReviewWithLikedByIsbn13(String isbn13, Long memberId, Long loginMemberId, Pageable pageable) {
List<ReviewDto> result = queryFactory
.select(
Projections.constructor(
Expand All @@ -41,7 +41,7 @@ public Page<ReviewDto> findPublicReviewWithLikedByIsbn13(String isbn13, Long mem
review.likeCount,
review.viewCount,
Expressions.cases()
.when(isLikedByMember(memberId, review.id))
.when(isLikedByMember(loginMemberId, review.id))
.then(true)
.otherwise(false)
.as("liked"),
Expand All @@ -50,7 +50,7 @@ public Page<ReviewDto> findPublicReviewWithLikedByIsbn13(String isbn13, Long mem
)
.from(review)
.join(review.member, member)
.where(review.book.isbn13.eq(isbn13), review.status.eq(ReviewStatus.PUBLIC), review.member.status.eq(ProfileStatus.PUBLIC))
.where(isbnEq(isbn13), memberIdEq(memberId), review.status.eq(ReviewStatus.PUBLIC), review.member.status.eq(ProfileStatus.PUBLIC))
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.orderBy(review.createdAt.desc())
Expand All @@ -59,7 +59,7 @@ public Page<ReviewDto> findPublicReviewWithLikedByIsbn13(String isbn13, Long mem
JPAQuery<Long> countQuery = queryFactory
.select(review.count())
.from(review)
.where(review.book.isbn13.eq(isbn13))
.where(isbnEq(isbn13), memberIdEq(memberId))
.from(review);

return PageableExecutionUtils.getPage(result, pageable, countQuery::fetchOne);
Expand Down Expand Up @@ -89,7 +89,7 @@ public Optional<ReviewDetailDto> findPublicReviewDetailByReviewId(Long reviewId,
)
.from(review)
.join(review.member, member)
.where(review.id.eq(reviewId), review.status.eq(ReviewStatus.PUBLIC), review.member.status.eq(ProfileStatus.PUBLIC))
.where(review.id.eq(reviewId), buildReviewAccessCondition(review.member.id, memberId))
.fetchOne());
}

Expand All @@ -100,4 +100,26 @@ private BooleanExpression isLikedByMember(Long memberId, NumberPath<Long> review
.and(reviewLike.review.id.eq(reviewId)))
.exists();
}

private BooleanExpression isbnEq(String isbn13) {
if (isbn13 == null) {
return null;
}
return review.book.isbn13.eq(isbn13);
}

private BooleanExpression memberIdEq(Long memberId) {
if (memberId == null) {
return null;
}
return review.member.id.eq(memberId);
}

private BooleanExpression buildReviewAccessCondition(NumberPath<Long> reviewMemberId, Long memberId) {
return Expressions.cases()
.when(reviewMemberId.eq(memberId))
.then(true)
.otherwise(review.status.eq(ReviewStatus.PUBLIC)
.and(review.member.status.eq(ProfileStatus.PUBLIC)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,11 @@ public ReviewListResponse getAllReview(Pageable pageable, Long memberId) {
}

@Transactional(readOnly = true)
public ReviewListResponse searchReview(String isbn13, Long memberId, Pageable pageable) {
return ReviewListResponse.fromDto(reviewRepository.findPublicReviewWithLikedByIsbn13(isbn13, memberId, pageable), memberId);
public ReviewListResponse searchReview(String isbn13, Long memberId, Long loginMemberId, Pageable pageable) {
return ReviewListResponse.fromDto(
reviewRepository.findPublicReviewWithLikedByIsbn13(isbn13, memberId, loginMemberId, pageable),
loginMemberId
);
}

@Transactional(readOnly = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -438,10 +438,11 @@ void givenPostIdNonPrivate_whenDeletingPost_thenDeletePost() throws Exception {
@DisplayName("로그인한 유저가 memberId를 이용해 게시글을 조회한다.")
void givenMemberIdWithLogin_whenSearchingPost_thenReturnPostListResponse() throws Exception {
//given
Long memberId = 2L;

//when & then
mockMvc.perform(get("/posts")
.param("member-id", "2")
.param("member-id", String.valueOf(memberId))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.totalResults").value(6))
Expand All @@ -451,13 +452,14 @@ void givenMemberIdWithLogin_whenSearchingPost_thenReturnPostListResponse() throw


@Test
@DisplayName("유저가 memberId를 이용해 게시글을 조회한다.")
@DisplayName("로그인 하지 않은 유저가 memberId를 이용해 게시글을 조회한다.")
void givenMemberId_whenSearchingPost_thenReturnPostListResponse() throws Exception {
//given
Long memberId = 2L;

//when & then
mockMvc.perform(get("/posts")
.param("member-id", "2")
.param("member-id", String.valueOf(memberId))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.totalResults").value(6))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,38 @@ void givenPrivateReviewId_whenDeletingReview_thenDeleteReview() throws Exception
;
}

@Test
@WithCustomMockUser
@DisplayName("로그인한 유저가 memberId를 이용해 한줄요약을 조회한다.")
void givenMemberIdWithLogin_whenSearchingReview_thenReturnReviewListResponse() throws Exception {
//given
Long memberId = 2L;

//when & then
mockMvc.perform(get("/reviews")
.param("member-id", String.valueOf(memberId))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.totalResults").value(5))
.andExpect(jsonPath("$.reviewList[0].liked").value(true))
;
}

@Test
@DisplayName("로그인하지 않은 유저가 memberId를 이용해 한줄요약을 조회한다.")
void givenMemberId_whenSearchingReview_thenReturnReviewListResponse() throws Exception {
//given
Long memberId = 2L;

//when & then
mockMvc.perform(get("/reviews")
.param("member-id", String.valueOf(memberId))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.totalResults").value(5))
.andExpect(jsonPath("$.reviewList[0].liked").value(false))
;
}

@Test
@DisplayName("좋아요가 많은 순으로 한줄요약을 4개 반환한다.")
void givenPageStartAndRecommendType_whenGettingMostLikeReviews_thenReturnMostLikeReviews() throws Exception {
Expand Down

0 comments on commit 4308871

Please sign in to comment.