Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 전체 리뷰 조회 API (페이징 기술 적용) #41

Merged
merged 2 commits into from
Oct 22, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
}