-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #108 from jisung-in/feature/90-get-reviews-related…
…-book [Feature] 도서와 관련된 리뷰 조회 API 구현
- Loading branch information
Showing
13 changed files
with
707 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package com.jisungin.application; | ||
|
||
import static java.lang.Math.*; | ||
|
||
import lombok.Builder; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
public class OffsetLimit { | ||
|
||
private static final Integer MAX_SIZE = 2000; | ||
private Integer offset; | ||
private Integer limit; | ||
private String order; | ||
|
||
@Builder | ||
private OffsetLimit(Integer offset, Integer limit, String order) { | ||
this.offset = offset; | ||
this.limit = limit; | ||
this.order = order; | ||
} | ||
|
||
public static OffsetLimit of(Integer page, Integer size) { | ||
return OffsetLimit.builder() | ||
.offset(calculateOffset(page, size)) | ||
.limit(size) | ||
.build(); | ||
} | ||
|
||
public static OffsetLimit of(Integer page, Integer size, String order) { | ||
return OffsetLimit.builder() | ||
.offset(calculateOffset(page, size)) | ||
.limit(size) | ||
.order(order) | ||
.build(); | ||
} | ||
|
||
private static Integer calculateOffset(Integer page, Integer size) { | ||
return (max(1, page) - 1) * min(size, MAX_SIZE); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
package com.jisungin.application; | ||
|
||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
import java.util.List; | ||
import lombok.Builder; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
public class SliceResponse<T> { | ||
|
||
private List<T> content; | ||
|
||
private boolean hasContent; | ||
|
||
@JsonProperty("isFirst") | ||
private boolean first; | ||
|
||
@JsonProperty("isLast") | ||
private boolean last; | ||
|
||
private Integer number; | ||
|
||
private Integer size; | ||
|
||
@Builder | ||
private SliceResponse(List<T> content, boolean hasContent, boolean first, boolean last, Integer number, | ||
Integer size) { | ||
this.content = content; | ||
this.hasContent = hasContent; | ||
this.first = first; | ||
this.last = last; | ||
this.number = number; | ||
this.size = size; | ||
} | ||
|
||
public static <T> SliceResponse<T> of(List<T> content, Integer offset, Integer limit, boolean hasNext) { | ||
boolean hasContent = !content.isEmpty(); | ||
boolean first = (offset == 0); | ||
boolean last = !hasNext; | ||
|
||
Integer number = (offset / limit) + 1; | ||
Integer size = content.size(); | ||
|
||
return SliceResponse.<T>builder() | ||
.content(content) | ||
.hasContent(hasContent) | ||
.first(first) | ||
.last(last) | ||
.number(number) | ||
.size(size) | ||
.build(); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
46 changes: 46 additions & 0 deletions
46
src/main/java/com/jisungin/application/review/response/ReviewWithRatingResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
package com.jisungin.application.review.response; | ||
|
||
import com.querydsl.core.annotations.QueryProjection; | ||
import lombok.Builder; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Getter | ||
@NoArgsConstructor | ||
public class ReviewWithRatingResponse { | ||
|
||
private Long reviewId; | ||
private Long ratingId; | ||
private String username; | ||
private String profileImage; | ||
private String reviewContent; | ||
private Double starRating; | ||
private Long likeCount; | ||
|
||
@Builder | ||
@QueryProjection | ||
public ReviewWithRatingResponse(Long reviewId, Long ratingId, String username, String profileImage, | ||
String reviewContent, Double starRating, Long likeCount) { | ||
this.reviewId = reviewId; | ||
this.ratingId = ratingId; | ||
this.username = username; | ||
this.profileImage = profileImage; | ||
this.reviewContent = reviewContent; | ||
this.starRating = starRating; | ||
this.likeCount = likeCount; | ||
} | ||
|
||
public static ReviewWithRatingResponse of(Long reviewId, Long ratingId, String username, String profileImage, | ||
String reviewContent, Double starRating, Long likeCount) { | ||
return ReviewWithRatingResponse.builder() | ||
.reviewId(reviewId) | ||
.ratingId(ratingId) | ||
.username(username) | ||
.profileImage(profileImage) | ||
.reviewContent(reviewContent) | ||
.starRating(starRating) | ||
.likeCount(likeCount) | ||
.build(); | ||
} | ||
|
||
} |
57 changes: 57 additions & 0 deletions
57
src/main/java/com/jisungin/domain/review/ReviewOrderType.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
package com.jisungin.domain.review; | ||
|
||
import static com.jisungin.domain.rating.QRating.rating1; | ||
import static com.jisungin.domain.review.QReview.review; | ||
import static com.jisungin.domain.reviewlike.QReviewLike.reviewLike; | ||
|
||
import com.querydsl.core.types.OrderSpecifier; | ||
import com.querydsl.jpa.impl.JPAQuery; | ||
import java.util.function.Consumer; | ||
import java.util.function.Supplier; | ||
|
||
public enum ReviewOrderType { | ||
|
||
LIKE(() -> reviewLike.id.count().desc(), ReviewOrderType::leftJoinRating), | ||
RECENT(review.createDateTime::desc, ReviewOrderType::leftJoinRating), | ||
RATING_DESC(rating1.rating::desc, ReviewOrderType::joinRating), | ||
RATING_ASC(rating1.rating::asc, ReviewOrderType::joinRating); | ||
|
||
private final Supplier<OrderSpecifier<?>> orderSpecifierSupplier; | ||
private final Consumer<JPAQuery<?>> joinRatingStrategy; | ||
|
||
ReviewOrderType(Supplier<OrderSpecifier<?>> orderSpecifierSupplier, Consumer<JPAQuery<?>> joinRatingStrategy) { | ||
this.orderSpecifierSupplier = orderSpecifierSupplier; | ||
this.joinRatingStrategy = joinRatingStrategy; | ||
} | ||
|
||
public OrderSpecifier<?> getOrderSpecifier() { | ||
return orderSpecifierSupplier.get(); | ||
} | ||
|
||
public void applyJoinStrategy(JPAQuery<?> query) { | ||
joinRatingStrategy.accept(query); | ||
applyCommonJoinConditions(query); | ||
} | ||
|
||
public static ReviewOrderType fromString(String name) { | ||
try { | ||
return ReviewOrderType.valueOf(name.toUpperCase()); | ||
} catch (IllegalArgumentException | NullPointerException e) { | ||
return ReviewOrderType.LIKE; | ||
} | ||
} | ||
|
||
private static void joinRating(JPAQuery<?> query) { | ||
query.join(rating1); | ||
} | ||
|
||
private static void leftJoinRating(JPAQuery<?> query) { | ||
query.leftJoin(rating1); | ||
} | ||
|
||
private static void applyCommonJoinConditions(JPAQuery<?> query) { | ||
query.on(review.user.eq(rating1.user) | ||
.and(review.book.eq(rating1.book))); | ||
} | ||
|
||
} |
4 changes: 4 additions & 0 deletions
4
src/main/java/com/jisungin/domain/review/repository/ReviewRepositoryCustom.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,16 @@ | ||
package com.jisungin.domain.review.repository; | ||
|
||
import com.jisungin.application.PageResponse; | ||
import com.jisungin.application.SliceResponse; | ||
import com.jisungin.application.review.response.ReviewContentResponse; | ||
import com.jisungin.application.review.response.ReviewWithRatingResponse; | ||
import com.jisungin.domain.review.RatingOrderType; | ||
|
||
public interface ReviewRepositoryCustom { | ||
|
||
PageResponse<ReviewContentResponse> findAllReviewContentOrderBy( | ||
Long userId, RatingOrderType orderType, int size, int offset); | ||
|
||
SliceResponse<ReviewWithRatingResponse> findAllByBookId(String isbn, Integer offset, Integer limit, String order); | ||
|
||
} |
Oops, something went wrong.