Skip to content

Commit

Permalink
feat: 사용자 리뷰 조회 시 별점 선택 기능 추가 (#43)
Browse files Browse the repository at this point in the history
  • Loading branch information
pdohyung committed Mar 31, 2024
1 parent eba329d commit 564fc4e
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 17 deletions.
1 change: 0 additions & 1 deletion src/main/java/com/jisungin/api/user/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ public ApiResponse<PageResponse<RatingFindAllResponse>> getUserRatings(
@ModelAttribute UserRatingGetAllRequest request,
@Auth AuthContext authContext
) {
System.out.println(request.getOrder());
PageResponse<RatingFindAllResponse> response = userService.getUserRatings(
authContext.getUserId(), request.toService());
return ApiResponse.ok(response);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,22 @@ public class UserRatingGetAllRequest {

private String order;

private Double rating;

@Builder
public UserRatingGetAllRequest(Integer page, Integer size, String order) {
public UserRatingGetAllRequest(Integer page, Integer size, String order, String rating) {
this.page = page != null ? page : 1;
this.size = size != null ? size : 10;
this.order = order != null ? order : "date";
this.rating = rating != null ? Double.parseDouble(rating) : null;
}

public UserRatingGetAllServiceRequest toService() {
return UserRatingGetAllServiceRequest.builder()
.page(page)
.size(size)
.orderType(RatingOrderType.fromName(order))
.rating(rating)
.build();
}

Expand Down
3 changes: 2 additions & 1 deletion src/main/java/com/jisungin/application/user/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ public PageResponse<RatingFindAllResponse> getUserRatings(Long userId, UserRatin
User user = userRepository.findById(userId)
.orElseThrow(() -> new BusinessException(USER_NOT_FOUND));

return reviewRepository.findAllRatingOrderBy(user.getId(), request.getOrderType(), request.getSize(), request.getOffset());
return reviewRepository.findAllRatingOrderBy(
user.getId(), request.getOrderType(), request.getRating(), request.getSize(), request.getOffset());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,14 @@ public class UserRatingGetAllServiceRequest {

private RatingOrderType orderType;

private Double rating;

@Builder
public UserRatingGetAllServiceRequest(Integer page, Integer size, RatingOrderType orderType) {
public UserRatingGetAllServiceRequest(Integer page, Integer size, RatingOrderType orderType, Double rating) {
this.page = page;
this.size = size;
this.orderType = orderType;
this.rating = rating;
}

public int getOffset() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

public interface ReviewRepositoryCustom {

PageResponse<RatingFindAllResponse> findAllRatingOrderBy(Long userId, RatingOrderType ratingSortType, int size, int offset);
PageResponse<RatingFindAllResponse> findAllRatingOrderBy(
Long userId, RatingOrderType ratingSortType, Double rating, int size, int offset);

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.jisungin.application.review.response.RatingFindAllResponse;
import com.jisungin.domain.review.RatingOrderType;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -23,37 +24,38 @@ public class ReviewRepositoryImpl implements ReviewRepositoryCustom {

@Override
public PageResponse<RatingFindAllResponse> findAllRatingOrderBy(
Long userId, RatingOrderType ratingSortType, int size, int offset) {
Long userId, RatingOrderType ratingSortType, Double rating, int size, int offset) {
log.info("--------------start--------------");
// 리뷰 조회, 쿼리 1회
List<RatingFindAllResponse> ratings = getRatings(userId, ratingSortType, size, offset);
List<RatingFindAllResponse> ratings = getRatings(userId, ratingSortType, rating, size, offset);

return PageResponse.<RatingFindAllResponse>builder()
.queryResponse(ratings)
.totalCount(getTotalCount(userId)) // 해당 유저의 리뷰 총 개수, 쿼리 1회
.totalCount(getTotalCount(userId, rating)) // 해당 유저의 리뷰 총 개수, 쿼리 1회
.size(size)
.build();
}

private List<RatingFindAllResponse> getRatings(Long userId, RatingOrderType ratingSortType, int size, int offset) {
private List<RatingFindAllResponse> getRatings(
Long userId, RatingOrderType ratingSortType, Double rating, int size, int offset) {
return queryFactory
.select(new QRatingFindAllResponse(
review.book.isbn, review.book.title, review.book.imageUrl, review.rating))
.from(review)
.leftJoin(book).on(review.book.eq(book))
.where(review.user.id.eq(userId))
.where(review.user.id.eq(userId), ratingCondition(rating))
.groupBy(review.book.isbn)
.orderBy(createSpecifier(ratingSortType), review.id.asc())
.offset(offset)
.limit(size)
.fetch();
}

private long getTotalCount(Long userId) {
private long getTotalCount(Long userId, Double rating) {
return queryFactory
.select(review.count())
.from(review)
.where(review.user.id.eq(userId))
.where(review.user.id.eq(userId), ratingCondition(rating))
.fetchOne();
}

Expand All @@ -74,4 +76,13 @@ private OrderSpecifier createSpecifier(RatingOrderType ratingSortType) {
return review.createDateTime.desc();
}

// 만약 별점 필터링 조건이 존재하면 해당하는 별점만 가져온다.
private BooleanExpression ratingCondition(Double rating) {
if (rating == null) {
return null;
}

return review.rating.eq(rating);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class UserControllerTest extends ControllerTestSupport {
void getUserRatingAll() throws Exception {
//given
//when //then
mockMvc.perform(get("/v1/users/ratings?page=1&size=4&order=rating_asc")
mockMvc.perform(get("/v1/users/ratings?page=1&size=4&order=rating_asc&rating=")
.contentType(APPLICATION_JSON)
)
.andExpect(status().isOk())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ void getRatingsOrderByRatingAsc() {

//when
PageResponse<RatingFindAllResponse> result = reviewRepository.findAllRatingOrderBy(
user.getId(), RatingOrderType.RATING_ASC, 4, 8); // 1점 4개, 2점 4개 이후에 3점 리뷰 4개가 나와야 함.
user.getId(), RatingOrderType.RATING_ASC, null, 4, 8); // 1점 4개, 2점 4개 이후에 3점 리뷰 4개가 나와야 함.

//then
assertThat(result.getTotalCount()).isEqualTo(20);
Expand Down Expand Up @@ -84,7 +84,7 @@ void getRatingsOrderByRatingDesc() {

//when
PageResponse<RatingFindAllResponse> result = reviewRepository.findAllRatingOrderBy(
user.getId(), RatingOrderType.RATING_DESC, 4, 0); // 별점이 높은 순이기 때문에 5점 4개가 나와야 함.
user.getId(), RatingOrderType.RATING_DESC, null, 4, 0); // 별점이 높은 순이기 때문에 5점 4개가 나와야 함.

//then
assertThat(result.getTotalCount()).isEqualTo(20);
Expand Down Expand Up @@ -117,7 +117,7 @@ void getRatingsOrderByRatingAvgAsc() {

//when
PageResponse<RatingFindAllResponse> result = reviewRepository.findAllRatingOrderBy(
user1.getId(), RatingOrderType.RATING_AVG_ASC, 4, 0); // 각 유저가 똑같은 점수로 리뷰를 했기 때문에 1점 4개가 나와야 함.
user1.getId(), RatingOrderType.RATING_AVG_ASC, null, 4, 0); // 각 유저가 똑같은 점수로 리뷰를 했기 때문에 1점 4개가 나와야 함.

//then
assertThat(result.getTotalCount()).isEqualTo(20);
Expand Down Expand Up @@ -150,7 +150,7 @@ void getRatingsOrderByRatingAvgDesc() {

//when
PageResponse<RatingFindAllResponse> result = reviewRepository.findAllRatingOrderBy(
user1.getId(), RatingOrderType.RATING_AVG_DESC, 4, 0); // 각 유저가 똑같은 점수로 리뷰를 했기 때문에 5점 4개가 나와야 함.
user1.getId(), RatingOrderType.RATING_AVG_DESC, null, 4, 0); // 각 유저가 똑같은 점수로 리뷰를 했기 때문에 5점 4개가 나와야 함.

//then
assertThat(result.getTotalCount()).isEqualTo(20);
Expand All @@ -165,6 +165,35 @@ void getRatingsOrderByRatingAvgDesc() {
);
}

@DisplayName("별점이 3점인 리뷰만 조회한다.")
@Test
void getRatingsOrderByRatingAscOnlyThree() {
User user = createUser("1");
userRepository.save(user);

List<Book> books = createBooks();
List<Review> reviews = createReviews(user, books);
bookRepository.saveAll(books);
reviewRepository.saveAll(reviews);

//when
PageResponse<RatingFindAllResponse> result = reviewRepository.findAllRatingOrderBy(
user.getId(), RatingOrderType.RATING_ASC, 3.0, 4, 0); // 1점 4개, 2점 4개 이후에 3점 리뷰 4개가 나와야 함.

//then
assertThat(result.getTotalCount()).isEqualTo(4);
assertThat(result.getQueryResponse().size()).isEqualTo(4);
assertThat(result.getQueryResponse())
.extracting("isbn", "title", "image", "rating")
.containsExactly(
tuple("3", "제목", "image", 3.0),
tuple("8", "제목", "image", 3.0),
tuple("13", "제목", "image", 3.0),
tuple("18", "제목", "image", 3.0)
);

}

private static List<Book> createBooks() {
return IntStream.rangeClosed(1, 20)
.mapToObj(i -> createBook(String.valueOf(i)))
Expand Down

0 comments on commit 564fc4e

Please sign in to comment.