Skip to content

Commit

Permalink
REFACTOR : 리뷰 상세 조회 API 리팩토링 (#123)
Browse files Browse the repository at this point in the history
  • Loading branch information
choidongkuen committed Dec 22, 2023
1 parent 3e30c5c commit cbf9198
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.betteriter.fo_domain.review.dto;

import com.example.betteriter.fo_domain.review.domain.Review;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -25,12 +26,15 @@ public class GetReviewDetailResponseDto {
private LocalDate createdAt; // 작성일
private List<GetReviewImageResponseDto> reviewImages; // 리뷰 이미지
private long scrapedCount; // 리뷰 스크랩 갯수
private boolean isScrap; // 리뷰 스크랩 여부
private boolean isLike; // 리뷰 좋아요 여부


@Builder
public GetReviewDetailResponseDto(Long id, String productName, List<String> reviewSpecData, double starPoint,
String goodPoint, String badPoint, String shortReview, String manufacturer,
int storeName, LocalDate boughtAt, LocalDate createdAt, List<GetReviewImageResponseDto> reviewImages, long scrapedCount
int storeName, LocalDate boughtAt, LocalDate createdAt, List<GetReviewImageResponseDto> reviewImages,
long scrapedCount, boolean isScrap, boolean isLike
) {
this.id = id;
this.productName = productName;
Expand All @@ -45,9 +49,11 @@ public GetReviewDetailResponseDto(Long id, String productName, List<String> revi
this.createdAt = createdAt;
this.reviewImages = reviewImages;
this.scrapedCount = scrapedCount;
this.isScrap = isScrap;
this.isLike = isLike;
}

public static GetReviewDetailResponseDto from(Review review) {
public static GetReviewDetailResponseDto from(Review review, boolean isLike, boolean isScrap) {
return GetReviewDetailResponseDto.builder()
.id(review.getId())
.productName(review.getProductName())
Expand All @@ -62,6 +68,8 @@ public static GetReviewDetailResponseDto from(Review review) {
.createdAt(review.getCreatedAt() == null ? null : review.getCreatedAt().toLocalDate())
.reviewImages(GetReviewImageResponseDto.of(review.getReviewImages()))
.scrapedCount(review.getScrapedCount())
.isLike(isLike)
.isScrap(isScrap)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ public ReviewDetailResponse(GetReviewDetailResponseDto getReviewDetailResponseDt
}

public static ReviewDetailResponse of(Review review, List<Review> relatedReviews, Users currentUser) {
GetReviewDetailResponseDto reviewDetail = GetReviewDetailResponseDto.from(review); // 리뷰 상세
GetReviewDetailResponseDto reviewDetail
= GetReviewDetailResponseDto.from(review,isCurrentUserLikeReview(review,currentUser),isCurrentUserScrapReview(review,currentUser)); // 리뷰 상세
GetUserResponseDto writerInfo = GetUserResponseDto.from(review.getWriter()); // 리뷰 작성자 데이터
List<GetRelatedReviewResponseDto> getRelatedReviewResponseDto = GetRelatedReviewResponseDto.from(relatedReviews); // 연관 리뷰 데이터
ReviewLikeInfo reviewLikeInfo = ReviewLikeInfo.from(review); // 리뷰 좋아요 데이터
Expand Down Expand Up @@ -241,4 +242,15 @@ public static GetUserResponseForLikeAndComment from(Users users) {
.build();
}
}

private static boolean isCurrentUserLikeReview(Review review, Users currentUser) {
return review.getReviewLiked().stream()
.anyMatch(reviewLike -> reviewLike.getUsers().getId().equals(currentUser.getId()));
}


private static boolean isCurrentUserScrapReview(Review review, Users currentUser) {
return review.getReviewScraped().stream()
.anyMatch(reviewScrap -> reviewScrap.getUsers().getId().equals(currentUser.getId()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -109,13 +109,14 @@ public ReviewResponse getReviewBySearch(String name, String sort, int page) {
public ReviewDetailResponse getReviewDetail(Long reviewId) {
// 1. reviewId 에 해당하는 리뷰 조회
Review review = this.findReviewById(reviewId);
Users currentUser = this.getCurrentUser();

// 2. 동일한 제품명 리뷰 조회(4)
List<Review> relatedReviews
= this.reviewRepository.findTop4ByProductNameOrderByScrapedCntPlusLikedCntDesc(review.getProductName());

if (relatedReviews.size() == 4) {
return ReviewDetailResponse.of(review, relatedReviews, getCurrentUser());
return ReviewDetailResponse.of(review, relatedReviews, currentUser);
}
int remain = 4 - relatedReviews.size();
// 3. 동일한 카테고리 중 좋아요 + 스크랩 순 정렬 조회 (나머지)
Expand All @@ -125,7 +126,7 @@ public ReviewDetailResponse getReviewDetail(Long reviewId) {
List<Review> totalRelatedReviews = Stream.concat(relatedReviews.stream(), restRelatedReviews.stream())
.collect(Collectors.toList());

return ReviewDetailResponse.of(review, totalRelatedReviews, getCurrentUser());
return ReviewDetailResponse.of(review, totalRelatedReviews, currentUser);
}

/* 리뷰 좋아요 */
Expand All @@ -135,22 +136,21 @@ public void reviewLike(Long reviewId) {
Review review = this.findReviewById(reviewId);
// 2. 현재 로그인한 회원 조회
Users currentUser = this.getCurrentUser();
ReviewLike reviewLike = this.reviewLikeRepository.save(ReviewLike.builder().review(review).users(currentUser).build());
this.reviewLikeRepository.save(ReviewLike.builder().review(review).users(currentUser).build());
// 3. 리뷰 좋아요 카운트 증가
review.countReviewLikedCount();
}

/* 리뷰 스크랩 */
@Transactional
public ReviewScrap reviewScrap(Long reviewId) {
public void reviewScrap(Long reviewId) {
// 1. reviewId 에 해당하는 리뷰 조회
Review review = this.findReviewById(reviewId);
// 2. 현재 로그인한 회원 조회
Users currentUser = this.getCurrentUser();
ReviewScrap reviewScrap = this.reviewScrapRepository.save(ReviewScrap.builder().review(review).users(currentUser).build());
this.reviewScrapRepository.save(ReviewScrap.builder().review(review).users(currentUser).build());
// 3. 리뷰 스크랩 카운트 증가
review.countReviewScrapedCount();
return reviewScrap;
}

private Slice<Review> getReviews(String name, String sort, int page) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -433,10 +433,7 @@ void reviewScrapServiceTest(){
.willReturn(ReviewScrap.builder().review(review).users(users).build());

// when
ReviewScrap reviewScrap = this.reviewService.reviewScrap(1L);
// then
assertThat(reviewScrap.getReview()).isEqualTo(review);
assertThat(reviewScrap.getUsers()).isEqualTo(users);
verify(this.reviewRepository,times(1)).findById(anyLong());
verify(this.userService,times(1)).getCurrentUser();
verify(this.reviewScrapRepository,times(1)).save(any(ReviewScrap.class));
Expand Down

0 comments on commit cbf9198

Please sign in to comment.