Skip to content

Commit

Permalink
feat: 전체 리뷰 조회 API (페이징 기술 적용)
Browse files Browse the repository at this point in the history
  • Loading branch information
JiinHong committed Oct 21, 2024
1 parent 11ddf81 commit 8272147
Show file tree
Hide file tree
Showing 11 changed files with 153 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.List;

public record ReviewGetRecentResponseDto(
public record ReviewGetResponseDto(
int reviewCount,
List<ReviewPreviewDto> reviews
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.pocket.domain.port.review;

import com.pocket.domain.dto.review.ReviewGetResponseDto;
import org.springframework.data.domain.Pageable;

import java.util.List;

public interface ReviewGetAllPort {

ReviewGetResponseDto getAllReviews(Long photoboothId, Pageable pageable);

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.pocket.domain.port.review;

import com.pocket.domain.dto.review.ReviewGetRecentResponseDto;
import com.pocket.domain.dto.review.ReviewGetResponseDto;

public interface ReviewGetRecentPort {

ReviewGetRecentResponseDto getRecentReview(Long photoboothId);
ReviewGetResponseDto getRecentReview(Long photoboothId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
import com.pocket.domain.port.review.*;
import com.pocket.domain.usecase.review.*;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;

import java.util.List;

@DomainService
@RequiredArgsConstructor
public class ReviewService implements ReviewRegisterUseCase, ReviewGet6ImagesUseCase, ReviewGetRecentUseCase, ReviewGetAllImagesUseCase, ReviewBoothFeatureCountUseCase, ReviewPhotoFeatureCountUseCase, ReviewGetBoothFeatureUseCase, ReviewGetPhotoFeatureUseCase
public class ReviewService implements ReviewRegisterUseCase, ReviewGet6ImagesUseCase, ReviewGetRecentUseCase, ReviewGetAllImagesUseCase, ReviewBoothFeatureCountUseCase, ReviewPhotoFeatureCountUseCase, ReviewGetBoothFeatureUseCase, ReviewGetPhotoFeatureUseCase, ReviewGetAllUseCase

{

Expand All @@ -23,6 +24,7 @@ public class ReviewService implements ReviewRegisterUseCase, ReviewGet6ImagesUse
private final ReviewPhotoFeatureCountPort reviewPhotoFeatureCountPort;
private final ReviewGetBoothFeaturePort reviewGetBoothFeaturePort;
private final ReviewGetPhotoFeaturePort reviewGetPhotoFeaturePort;
private final ReviewGetAllPort reviewGetAllPort;

@Override
public ReviewRegisterResponseDto registerReviewResponse(ReviewRegisterRequestDto reviewRegisterRequestDto, String name) {
Expand All @@ -35,7 +37,7 @@ public ReviewGet6ImagesResponseDto get6Images(Long photoboothId) {
}

@Override
public ReviewGetRecentResponseDto getRecentReview(Long photoboothId) {
public ReviewGetResponseDto getRecentReview(Long photoboothId) {
return reviewGetRecentPort.getRecentReview(photoboothId);
}

Expand Down Expand Up @@ -63,4 +65,9 @@ public List<BoothFeatureDto> getBoothFeatures() {
public List<PhotoFeatureDto> getPhotoFeatures() {
return reviewGetPhotoFeaturePort.getPhotoFeatures();
}

@Override
public ReviewGetResponseDto getAllReviews(Long photoboothId, Pageable pageable) {
return reviewGetAllPort.getAllReviews(photoboothId, pageable);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.pocket.domain.usecase.review;

import com.pocket.domain.dto.review.ReviewGetResponseDto;
import org.springframework.data.domain.Pageable;

import java.util.List;

public interface ReviewGetAllUseCase {

ReviewGetResponseDto getAllReviews(Long photoboothId, Pageable pageable);

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.pocket.domain.usecase.review;

import com.pocket.domain.dto.review.ReviewGetRecentResponseDto;
import com.pocket.domain.dto.review.ReviewGetResponseDto;


public interface ReviewGetRecentUseCase {

ReviewGetRecentResponseDto getRecentReview(Long photoboohtId);
ReviewGetResponseDto getRecentReview(Long photoboohtId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import com.pocket.domain.dto.user.UserInfoDTO;
import com.pocket.domain.usecase.review.*;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Pageable;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

Expand All @@ -23,6 +25,7 @@ public class ReviewController implements ReviewControllerDocs {
private final ReviewPhotoFeatureCountUseCase reviewPhotoFeatureCountUseCase;
private final ReviewGetBoothFeatureUseCase reviewGetBoothFeatureUseCase;
private final ReviewGetPhotoFeatureUseCase reviewGetPhotoFeatureUseCase;
private final ReviewGetAllUseCase reviewGetAllUseCase;

@PostMapping
public ApplicationResponse<ReviewRegisterResponseDto> postReview(
Expand All @@ -44,6 +47,7 @@ public ApplicationResponse<List<PhotoFeatureDto>> getAllPhotoFeature() {
return ApplicationResponse.ok(response);
}


@GetMapping("/images/{photobooth_id}")
public ApplicationResponse<ReviewGet6ImagesResponseDto> getReviewHomeImage(
@PathVariable("photobooth_id") Long photoboothId
Expand All @@ -53,10 +57,10 @@ public ApplicationResponse<ReviewGet6ImagesResponseDto> getReviewHomeImage(
}

@GetMapping("/reviews/{photobooth_id}")
public ApplicationResponse<ReviewGetRecentResponseDto> getRecentReview(
public ApplicationResponse<ReviewGetResponseDto> getRecentReview(
@PathVariable("photobooth_id") Long photoboothId
) {
ReviewGetRecentResponseDto response = reviewGetRecentUseCase.getRecentReview(photoboothId);
ReviewGetResponseDto response = reviewGetRecentUseCase.getRecentReview(photoboothId);
return ApplicationResponse.ok(response);
}

Expand Down Expand Up @@ -84,4 +88,13 @@ public ApplicationResponse<List<PhotoFeatureCountDto>> getReviewPhotoFeatures(
return ApplicationResponse.ok(response);
}

@GetMapping("/allreviews/{photobooth_id}")
public ApplicationResponse<ReviewGetResponseDto> getAllReviews(
@PathVariable("photobooth_id") Long photoboothId,
@ParameterObject final Pageable pageable
) {
ReviewGetResponseDto response = reviewGetAllUseCase.getAllReviews(photoboothId, pageable);
return ApplicationResponse.ok(response);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
import com.pocket.domain.dto.review.*;
import com.pocket.domain.dto.user.UserInfoDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Pageable;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
Expand Down Expand Up @@ -52,7 +55,7 @@ ApplicationResponse<ReviewGet6ImagesResponseDto> getReviewHomeImage(
content = {@Content(schema = @Schema(implementation = ErrorResponse.class))})
})
@Operation(summary = "최신 리뷰 조회", description = "특정 포토부스에 대한 최신 리뷰를 조회하는 API")
ApplicationResponse<ReviewGetRecentResponseDto> getRecentReview(
ApplicationResponse<ReviewGetResponseDto> getRecentReview(
@PathVariable("photobooth_id") Long photoboothId
);

Expand Down Expand Up @@ -111,4 +114,20 @@ ApplicationResponse<List<PhotoFeatureCountDto>> getReviewPhotoFeatures(
})
@Operation(summary = "포토부스의 모든 사진 특징 조회", description = "포토부스에서 찍힌 모든 사진의 특징을 가져오는 API")
ApplicationResponse<List<PhotoFeatureDto>> getAllPhotoFeature();

@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "400", description = "BAD REQUEST",
content = {@Content(schema = @Schema(implementation = ErrorResponse.class))}),
@ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR",
content = {@Content(schema = @Schema(implementation = ErrorResponse.class))})
})
@Operation(summary = "전체 리뷰 조회", description = "페이징을 이용한 전체 리뷰 조회 API (ex. /api/v1/review/allreviews/336?page=0&size=10&sort=id,desc)")
ApplicationResponse<ReviewGetResponseDto> getAllReviews(
@Parameter(description = "포토부스 ID", example = "336")
@PathVariable("photobooth_id") Long photoboothId,

@ParameterObject Pageable pageable
);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.pocket.outbound.adapter.review.adapter;


import com.pocket.core.aop.annotation.AdapterService;
import com.pocket.core.exception.review.ReviewCustomException;
import com.pocket.core.exception.review.ReviewErrorCode;
import com.pocket.domain.dto.review.ReviewGetResponseDto;
import com.pocket.domain.dto.review.ReviewPreviewDto;
import com.pocket.domain.port.review.ReviewGetAllPort;
import com.pocket.outbound.adapter.review.mapper.ReviewOutBoundMapper;
import com.pocket.outbound.entity.review.JpaBoothFeature;
import com.pocket.outbound.entity.review.JpaPhotoFeature;
import com.pocket.outbound.entity.review.JpaReview;
import com.pocket.outbound.entity.review.JpaReviewImage;
import com.pocket.outbound.repository.review.*;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@AdapterService
@RequiredArgsConstructor
public class ReviewGetAllAdapter implements ReviewGetAllPort {

private final ReviewRepository reviewRepository;
private final ReviewImageRepository reviewImageRepository;
private final ReviewBoothFeatureRepository reviewBoothFeatureRepository;
private final ReviewPhotoFeatureRepository reviewPhotoFeatureRepository;
private final BoothFeatureRepository boothFeatureRepository;
private final PhotoFeatureRepository photoFeatureRepository;
private final ReviewOutBoundMapper reviewOutBoundMapper;

@Override
public ReviewGetResponseDto getAllReviews(Long photoboothId, Pageable pageable) {
int totalReviewCount = reviewRepository.countByPhotoBoothId(photoboothId);

Page<JpaReview> reviews = reviewRepository.findByPhotoBoothId(photoboothId, pageable);

List<ReviewPreviewDto> reviewPreviews = reviews.stream().map(review -> {
List<JpaReviewImage> images = reviewImageRepository.findByReviewId(review.getId());
String imageUrl = images.isEmpty() ? "" : images.get(0).getImage().getImageUrl();
int imageCount = images.size();


// Booth Features 찾기
List<Long> boothFeatureIds = reviewBoothFeatureRepository.findBoothFeatureIdByReviewId(review.getId());
List<JpaBoothFeature> boothFeatures = boothFeatureIds.stream()
.map(boothFeatureId -> boothFeatureRepository.findById(boothFeatureId)
.orElseThrow(() -> new ReviewCustomException(ReviewErrorCode.BOOTH_FEATURE_NOT_FOUND)))
.toList();

// Photo Features 찾기
List<Long> photoFeatureIds = reviewPhotoFeatureRepository.findPhotoFeatureIdByReviewId(review.getId());
List<JpaPhotoFeature> photoFeatures = photoFeatureIds.stream()
.map(photoFeatureId -> photoFeatureRepository.findById(photoFeatureId)
.orElseThrow(() -> new ReviewCustomException(ReviewErrorCode.PHOTO_FEATURE_NOT_FOUND)))
.toList();

List<String> descriptions = new ArrayList<>();
// BoothFeature descriptions
boothFeatures.forEach(boothFeature -> descriptions.add(boothFeature.getBoothFeature().getDescription()));
// PhotoFeature descriptions
photoFeatures.forEach(photoFeature -> descriptions.add(photoFeature.getPhotoFeature().getDescription()));

return reviewOutBoundMapper.toReviewPreviewDto(descriptions, review, imageUrl, imageCount);
}).collect(Collectors.toList());

return new ReviewGetResponseDto(totalReviewCount, reviewPreviews);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.pocket.core.aop.annotation.AdapterService;
import com.pocket.core.exception.review.ReviewCustomException;
import com.pocket.core.exception.review.ReviewErrorCode;
import com.pocket.domain.dto.review.ReviewGetRecentResponseDto;
import com.pocket.domain.dto.review.ReviewGetResponseDto;
import com.pocket.domain.dto.review.ReviewPreviewDto;
import com.pocket.domain.port.review.ReviewGetRecentPort;
import com.pocket.outbound.adapter.review.mapper.ReviewOutBoundMapper;
Expand Down Expand Up @@ -32,7 +32,7 @@ public class ReviewGetRecentAdapter implements ReviewGetRecentPort {
private final ReviewOutBoundMapper reviewOutBoundMapper;

@Override
public ReviewGetRecentResponseDto getRecentReview(Long photoboothId) {
public ReviewGetResponseDto getRecentReview(Long photoboothId) {
int totalReviewCount = reviewRepository.countByPhotoBoothId(photoboothId);

List<JpaReview> recentReviews = reviewRepository.findTop2ByPhotoBoothIdOrderByIdDesc(photoboothId);
Expand Down Expand Up @@ -67,6 +67,6 @@ public ReviewGetRecentResponseDto getRecentReview(Long photoboothId) {
return reviewOutBoundMapper.toReviewPreviewDto(descriptions, review, imageUrl, imageCount);
}).collect(Collectors.toList());

return new ReviewGetRecentResponseDto(totalReviewCount, reviewPreviews);
return new ReviewGetResponseDto(totalReviewCount, reviewPreviews);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.pocket.outbound.repository.review;

import com.pocket.outbound.entity.review.JpaReview;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand All @@ -17,4 +19,5 @@ public interface ReviewRepository extends JpaRepository<JpaReview, Long> {
@Query("SELECT r.id FROM JpaReview r WHERE r.photoBooth.id = :photoBoothId")
List<Long> findReviewIdsByPhotoBoothId(@Param("photoBoothId") Long photoBoothId);

Page<JpaReview> findByPhotoBoothId(Long photoboothId, Pageable pageable);
}

0 comments on commit 8272147

Please sign in to comment.