diff --git a/application/src/main/java/org/depromeet/spot/application/review/ReadReviewController.java b/application/src/main/java/org/depromeet/spot/application/review/ReadReviewController.java index d890193b..8a25e3a8 100644 --- a/application/src/main/java/org/depromeet/spot/application/review/ReadReviewController.java +++ b/application/src/main/java/org/depromeet/spot/application/review/ReadReviewController.java @@ -9,6 +9,7 @@ import org.depromeet.spot.application.common.annotation.CurrentMember; import org.depromeet.spot.application.review.dto.request.BlockReviewRequest; import org.depromeet.spot.application.review.dto.request.MyReviewRequest; +import org.depromeet.spot.application.review.dto.response.BaseReviewResponse; import org.depromeet.spot.application.review.dto.response.BlockReviewListResponse; import org.depromeet.spot.application.review.dto.response.MyRecentReviewResponse; import org.depromeet.spot.application.review.dto.response.MyReviewListResponse; @@ -112,4 +113,16 @@ public MyRecentReviewResponse findMyRecentReview(@Parameter(hidden = true) Long readReviewUsecase.findLastReviewByMemberId(memberId); return MyRecentReviewResponse.from(result); } + + @CurrentMember + @ResponseStatus(HttpStatus.OK) + @GetMapping("/reviews/{reviewId}") + @Operation(summary = "리뷰 id(pk)로 특정 리뷰를 조회한다.") + public BaseReviewResponse findReviewByReviewId( + @Parameter(hidden = true) Long memberId, + @PathVariable("reviewId") @NotNull @Parameter(description = "리뷰 PK", required = true) + Long reviewId) { + ReadReviewUsecase.ReviewResult reviewResult = readReviewUsecase.findReviewById(reviewId); + return BaseReviewResponse.from(reviewResult.review()); + } } diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/port/in/review/ReadReviewUsecase.java b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/review/ReadReviewUsecase.java index 55d09993..3c264555 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/port/in/review/ReadReviewUsecase.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/port/in/review/ReadReviewUsecase.java @@ -27,6 +27,8 @@ MyReviewListResult findMyReviewsByUserId( MyRecentReviewResult findLastReviewByMemberId(Long memberId); + ReviewResult findReviewById(Long reviewId); + @Builder record BlockReviewListResult( LocationInfo location, @@ -64,4 +66,7 @@ record MemberInfoOnMyReviewResult( @Builder record MyRecentReviewResult(Review review, Long reviewCount) {} + + @Builder + record ReviewResult(Review review) {} } diff --git a/usecase/src/main/java/org/depromeet/spot/usecase/service/review/ReadReviewService.java b/usecase/src/main/java/org/depromeet/spot/usecase/service/review/ReadReviewService.java index 981578f0..d862e901 100644 --- a/usecase/src/main/java/org/depromeet/spot/usecase/service/review/ReadReviewService.java +++ b/usecase/src/main/java/org/depromeet/spot/usecase/service/review/ReadReviewService.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.stream.Collectors; +import org.depromeet.spot.common.exception.review.ReviewException.ReviewNotFoundException; import org.depromeet.spot.domain.member.Member; import org.depromeet.spot.domain.member.enums.Level; import org.depromeet.spot.domain.review.Review; @@ -108,16 +109,18 @@ public List findReviewMonths(Long memberId) { return reviewRepository.findReviewMonthsByMemberId(memberId); } - private MemberInfoOnMyReviewResult createMemberInfoFromMember( - Member member, long totalReviewCount) { - return MemberInfoOnMyReviewResult.builder() - .userId(member.getId()) - .profileImageUrl(member.getProfileImage()) - .level(member.getLevel()) - .levelTitle(Level.getTitleFrom(member.getLevel())) - .nickname(member.getNickname()) - .reviewCount(totalReviewCount) - .build(); + @Override + public ReviewResult findReviewById(Long reviewId) { + Review review = + reviewRepository + .findById(reviewId) + .orElseThrow( + () -> + new ReviewNotFoundException( + "Review not found with id: " + reviewId)); + Review reviewWithKeywords = mapKeywordsToSingleReview(review); + + return ReviewResult.builder().review(reviewWithKeywords).build(); } @Override @@ -134,55 +137,60 @@ public MyRecentReviewResult findLastReviewByMemberId(Long memberId) { .build(); } - private List mapKeywordsToReviews(List reviews) { + private MemberInfoOnMyReviewResult createMemberInfoFromMember( + Member member, long totalReviewCount) { + return MemberInfoOnMyReviewResult.builder() + .userId(member.getId()) + .profileImageUrl(member.getProfileImage()) + .level(member.getLevel()) + .levelTitle(Level.getTitleFrom(member.getLevel())) + .nickname(member.getNickname()) + .reviewCount(totalReviewCount) + .build(); + } + + private Review mapKeywordsToSingleReview(Review review) { List keywordIds = - reviews.stream() - .flatMap(review -> review.getKeywords().stream()) + review.getKeywords().stream() .map(ReviewKeyword::getKeywordId) .distinct() .collect(Collectors.toList()); Map keywordMap = keywordRepository.findByIds(keywordIds); - return reviews.stream() - .map( - review -> { - List mappedKeywords = - review.getKeywords().stream() - .map( - reviewKeyword -> { - Keyword keyword = - keywordMap.get( - reviewKeyword - .getKeywordId()); - return ReviewKeyword.create( - reviewKeyword.getId(), - keyword.getId()); - }) - .collect(Collectors.toList()); - - Review mappedReview = - Review.builder() - .id(review.getId()) - .member(review.getMember()) - .stadium(review.getStadium()) - .section(review.getSection()) - .block(review.getBlock()) - .row(review.getRow()) - .seat(review.getSeat()) - .dateTime(review.getDateTime()) - .content(review.getContent()) - .deletedAt(review.getDeletedAt()) - .images(review.getImages()) - .keywords(mappedKeywords) - .build(); - - // Keyword 정보를 Review 객체에 추가 - mappedReview.setKeywordMap(keywordMap); - - return mappedReview; - }) - .collect(Collectors.toList()); + List mappedKeywords = + review.getKeywords().stream() + .map( + reviewKeyword -> { + Keyword keyword = keywordMap.get(reviewKeyword.getKeywordId()); + return ReviewKeyword.create( + reviewKeyword.getId(), keyword.getId()); + }) + .collect(Collectors.toList()); + + Review mappedReview = + Review.builder() + .id(review.getId()) + .member(review.getMember()) + .stadium(review.getStadium()) + .section(review.getSection()) + .block(review.getBlock()) + .row(review.getRow()) + .seat(review.getSeat()) + .dateTime(review.getDateTime()) + .content(review.getContent()) + .deletedAt(review.getDeletedAt()) + .images(review.getImages()) + .keywords(mappedKeywords) + .build(); + + mappedReview.setKeywordMap(keywordMap); + + return mappedReview; + } + + private List mapKeywordsToReviews(List reviews) { + return reviews.stream().map(this::mapKeywordsToSingleReview).collect(Collectors.toList()); } private Review mapKeywordsToReview(Review review) {