Skip to content

Commit 3aadb52

Browse files
authored
fix: review v1 list 500에러 나는 문제 수정 (#254)
1 parent 6b381ce commit 3aadb52

9 files changed

Lines changed: 176 additions & 28 deletions

File tree

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ssu.eatssu.domain.rating.entity;
22

33
import io.jsonwebtoken.lang.Assert;
4+
import jakarta.persistence.Column;
45
import jakarta.persistence.Embeddable;
56
import lombok.Getter;
67
import lombok.NoArgsConstructor;
@@ -10,14 +11,25 @@
1011
@Embeddable
1112
public class Ratings {
1213

14+
@Column(name = "main_rating")
1315
private Integer mainRating;
1416

15-
private Ratings(Integer mainRating) {
17+
@Column(name = "amount_rating")
18+
private Integer amountRating;
19+
20+
@Column(name = "taste_rating")
21+
private Integer tasteRating;
22+
23+
private Ratings(Integer mainRating, Integer amountRating, Integer tasteRating) {
1624
Assert.isTrue(mainRating >= 0 && mainRating <= 5, "mainRating must be between 0 and 5");
25+
Assert.isTrue(amountRating >= 0 && amountRating <= 5, "amountRating must be between 0 and 5");
26+
Assert.isTrue(tasteRating >= 0 && tasteRating <= 5, "tasteRating must be between 0 and 5");
1727
this.mainRating = mainRating;
28+
this.amountRating = amountRating;
29+
this.tasteRating = tasteRating;
1830
}
1931

20-
public static Ratings of(Integer mainRating) {
21-
return new Ratings(mainRating);
32+
public static Ratings of(Integer mainRating, Integer amountRating, Integer tasteRating) {
33+
return new Ratings(mainRating, amountRating, tasteRating);
2234
}
2335
}

src/main/java/ssu/eatssu/domain/review/dto/CreateMenuReviewRequest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ public class CreateMenuReviewRequest {
2020
private Long menuId;
2121
@Schema(description = "평점-메인", example = "4")
2222
private Integer mainRating;
23+
@Schema(description = "평점-맛", example = "4")
24+
private Integer amountRating;
25+
@Schema(description = "평점-양", example = "4")
26+
private Integer tasteRating;
2327
@Max(150)
2428
@Schema(description = "한줄평", example = "맛있어용")
2529
private String content;
@@ -29,7 +33,7 @@ public class CreateMenuReviewRequest {
2933
private MenuLikeRequest menuLike;
3034

3135
public Review toReviewEntity(User user, Menu menu) {
32-
Ratings ratings = Ratings.of(this.mainRating);
36+
Ratings ratings = Ratings.of(this.mainRating,this.amountRating,this.tasteRating);
3337
return Review.builder()
3438
.user(user)
3539
.content(this.content)

src/main/java/ssu/eatssu/domain/review/dto/ReviewCreateRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public ReviewCreateRequest(int mainRating, String content) {
3939
}
4040

4141
public Review toEntity(User user, Menu menu) {
42-
Ratings ratings = Ratings.of(this.mainRating);
42+
Ratings ratings = Ratings.of(this.mainRating,this.amountRating,this.tasteRating);
4343
return Review.builder()
4444
.user(user)
4545
.content(this.content)
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package ssu.eatssu.domain.review.dto;
2+
3+
import java.time.LocalDate;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
7+
import io.swagger.v3.oas.annotations.media.Schema;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Builder;
10+
import lombok.Getter;
11+
import ssu.eatssu.domain.review.entity.Review;
12+
13+
@AllArgsConstructor
14+
@Builder
15+
@Schema(title = "리뷰 상세")
16+
@Getter
17+
public class ReviewDetailV1 {
18+
19+
@Schema(description = "리뷰 식별자", example = "123")
20+
Long reviewId;
21+
22+
@Schema(description = "메뉴 이름", example = "콥샐러드")
23+
String menu;
24+
25+
@Schema(description = "작성자 식별자", example = "123")
26+
Long writerId;
27+
28+
@Schema(description = "본인 글인지 여부(true/false)", example = "true")
29+
Boolean isWriter;
30+
31+
@Schema(description = "작성자 닉네임", example = "숭시리시리")
32+
private String writerNickname;
33+
34+
@Schema(description = "평점-메인", example = "4")
35+
private Integer mainRating;
36+
37+
@Schema(description = "평점-양", example = "4")
38+
private Integer amountRating;
39+
40+
@Schema(description = "평점-맛", example = "4")
41+
private Integer tasteRating;
42+
43+
@Schema(description = "리뷰 작성 날짜(format = yyyy-MM-dd)", example = "2023-04-07")
44+
private LocalDate writedAt;
45+
46+
@Schema(description = "리뷰 내용", example = "맛있습니당")
47+
private String content;
48+
49+
@Schema(description = "리뷰 이미지 url 리스트", example = "[\"imgurl1\", \"imgurl2\"]")
50+
private List<String> imageUrls;
51+
52+
public static ReviewDetailV1 from(Review review, Long userId) {
53+
List<String> imageUrls = new ArrayList<>();
54+
review.getReviewImages().forEach(i -> imageUrls.add(i.getImageUrl()));
55+
56+
ReviewDetailV1Builder builder = ReviewDetailV1.builder()
57+
.reviewId(review.getId())
58+
.mainRating(review.getRatings().getMainRating())
59+
.amountRating(review.getRatings().getAmountRating())
60+
.tasteRating(review.getRatings().getTasteRating())
61+
.writedAt(review.getCreatedDate().toLocalDate())
62+
.content(review.getContent())
63+
.imageUrls(imageUrls)
64+
.menu(review.getMenu().getName());
65+
66+
if (review.getUser() == null) {
67+
return builder
68+
.writerId(null)
69+
.writerNickname("알 수 없음")
70+
.isWriter(false)
71+
.build();
72+
}
73+
74+
if (review.getUser().getId().equals(userId)) {
75+
return builder
76+
.writerId(review.getUser().getId())
77+
.writerNickname(review.getUser().getNickname())
78+
.isWriter(true)
79+
.build();
80+
}
81+
82+
return builder
83+
.writerId(review.getUser().getId())
84+
.writerNickname(review.getUser().getNickname())
85+
.isWriter(false)
86+
.build();
87+
}
88+
}

src/main/java/ssu/eatssu/domain/review/dto/UploadReviewRequest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ public class UploadReviewRequest {
2020

2121
@Schema(description = "평점-메인", example = "4")
2222
private Integer mainRating;
23+
@Schema(description = "평점-밋", example = "4")
24+
private Integer tasteRating;
25+
@Schema(description = "평점-양", example = "4")
26+
private Integer amountRating;
2327

2428
@Max(150)
2529
@Schema(description = "한줄평", example = "맛있어용")
@@ -36,7 +40,7 @@ public UploadReviewRequest(int mainRating, String content) {
3640
}
3741

3842
public Review toReviewEntity(User user, Menu menu) {
39-
Ratings ratings = Ratings.of(this.mainRating);
43+
Ratings ratings = Ratings.of(this.mainRating,this.amountRating,this.tasteRating);
4044
return Review.builder()
4145
.user(user)
4246
.content(this.content)

src/main/java/ssu/eatssu/domain/review/entity/Review.java

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package ssu.eatssu.domain.review.entity;
22

3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.stream.Collectors;
7+
8+
import jakarta.persistence.AttributeOverride;
9+
import jakarta.persistence.AttributeOverrides;
310
import jakarta.persistence.CascadeType;
411
import jakarta.persistence.Column;
512
import jakarta.persistence.Embedded;
@@ -23,11 +30,10 @@
2330
import ssu.eatssu.domain.user.entity.BaseTimeEntity;
2431
import ssu.eatssu.domain.user.entity.User;
2532

26-
import java.util.ArrayList;
27-
import java.util.List;
28-
import java.util.Map;
29-
import java.util.stream.Collectors;
30-
33+
/*
34+
* 251001 이정민
35+
* 해당 엔티티의 rating은 reviewV1, reviewV2 api의 유지를 위해 지우지 마셔야 합니다.
36+
* */
3137
@Entity
3238
@Getter
3339
@Setter
@@ -40,13 +46,12 @@ public class Review extends BaseTimeEntity {
4046
@GeneratedValue(strategy = GenerationType.IDENTITY)
4147
@Column(name = "review_id")
4248
private Long id;
43-
@Column(length = 300)
44-
private String content;
4549

46-
// TODO : 삭제되어야 함
50+
private String content;
4751
@Embedded
4852
private Ratings ratings;
4953

54+
// v2용 rating
5055
private Integer rating;
5156

5257
@ManyToOne(fetch = FetchType.LAZY)
@@ -70,13 +75,13 @@ public class Review extends BaseTimeEntity {
7075
@OneToMany(mappedBy = "review", cascade = CascadeType.ALL, orphanRemoval = true)
7176
private List<ReviewMenuLike> menuLikes = new ArrayList<>();
7277

73-
// @TODO: 리뷰v2 배포 이후 제거 해야함
7478
@OneToMany(mappedBy = "review", cascade = CascadeType.ALL, orphanRemoval = true)
7579
private List<ReviewLike> reviewLikes = new ArrayList<>();
7680

77-
public void update(String content, Integer mainRate) {
81+
public void update(String content, Integer mainRate, Integer amountRate, Integer tasteRate) {
7882
this.content = content;
79-
this.ratings = Ratings.of(mainRate);
83+
this.rating = mainRate;
84+
this.ratings = Ratings.of(mainRate, amountRate, tasteRate);
8085
}
8186

8287
// TODO : this.user가 null이면?
@@ -102,14 +107,6 @@ public void addReviewMenuLike(Menu menu, boolean isLike) {
102107
}
103108
}
104109

105-
public void removeReviewMenuLike(ReviewMenuLike reviewMenuLike) {
106-
this.menuLikes.remove(reviewMenuLike);
107-
108-
if (reviewMenuLike.getIsLike()) {
109-
reviewMenuLike.getMenu().decreaseLikeCount();
110-
}
111-
}
112-
113110
public void update(String content, int rating, Map<Menu, Boolean> updatedMenuLikes) {
114111
this.content = content;
115112
this.rating = rating;

src/main/java/ssu/eatssu/domain/review/presentation/ReviewController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import ssu.eatssu.domain.review.dto.MenuReviewResponse;
3434
import ssu.eatssu.domain.review.dto.ReviewCreateRequest;
3535
import ssu.eatssu.domain.review.dto.ReviewDetail;
36+
import ssu.eatssu.domain.review.dto.ReviewDetailV1;
3637
import ssu.eatssu.domain.review.dto.ReviewUpdateRequest;
3738
import ssu.eatssu.domain.review.dto.SavedReviewImage;
3839
import ssu.eatssu.domain.review.dto.UploadReviewRequest;
@@ -66,15 +67,15 @@ public class ReviewController {
6667
@ApiResponse(responseCode = "404", description = "존재하지 않는 식단", content = @Content(schema = @Schema(implementation = BaseResponse.class)))
6768
})
6869
@GetMapping("")
69-
public BaseResponse<SliceResponse<ReviewDetail>> getReviews(
70+
public BaseResponse<SliceResponse<ReviewDetailV1>> getReviews(
7071
@Parameter(description = "타입(변동메뉴(식단)/고정메뉴)") @RequestParam("menuType") MenuType menuType,
7172
@Parameter(description = "menuId(고정메뉴)") @RequestParam(value = "menuId", required = false) Long menuId,
7273
@Parameter(description = "mealId(변동메뉴)") @RequestParam(value = "mealId", required = false) Long mealId,
7374
@Parameter(description = "마지막으로 조회된 reviewId값(첫 조회시 값 필요 없음)", in = ParameterIn.QUERY)
7475
@RequestParam(value = "lastReviewId", required = false) Long lastReviewId,
7576
@ParameterObject @PageableDefault(size = 20, sort = "date", direction = Sort.Direction.DESC) Pageable pageable,
7677
@AuthenticationPrincipal CustomUserDetails customUserDetails) {
77-
SliceResponse<ReviewDetail> myReviews = sliceService.findReviews(menuType, menuId, mealId,
78+
SliceResponse<ReviewDetailV1> myReviews = sliceService.findReviewsV1(menuType, menuId, mealId,
7879
pageable, lastReviewId, customUserDetails);
7980

8081
return BaseResponse.success(myReviews);

src/main/java/ssu/eatssu/domain/review/service/ReviewService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public void updateReview(CustomUserDetails userDetails, Long reviewId,
132132
throw new BaseException(REVIEW_PERMISSION_DENIED);
133133
}
134134

135-
review.update(request.content(), request.mainRating());
135+
review.update(request.content(), request.mainRating(),request.amountRating(),request.tasteRating());
136136
}
137137

138138
public void deleteReview(CustomUserDetails userDetails, Long reviewId) {

src/main/java/ssu/eatssu/domain/slice/service/SliceService.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import ssu.eatssu.domain.menu.persistence.MealRepository;
1212
import ssu.eatssu.domain.menu.persistence.MenuRepository;
1313
import ssu.eatssu.domain.review.dto.ReviewDetail;
14+
import ssu.eatssu.domain.review.dto.ReviewDetailV1;
1415
import ssu.eatssu.domain.review.entity.Review;
1516
import ssu.eatssu.domain.review.repository.ReviewRepository;
1617
import ssu.eatssu.domain.slice.dto.SliceResponse;
@@ -22,6 +23,7 @@
2223
import java.util.List;
2324
import java.util.Objects;
2425
import java.util.Optional;
26+
import java.util.logging.Logger;
2527
import java.util.stream.Collectors;
2628

2729
import static ssu.eatssu.global.handler.response.BaseResponseStatus.NOT_FOUND_MENU;
@@ -50,6 +52,31 @@ public SliceResponse<MyReviewDetail> findMyReviews(
5052
return convertToMyReviewDetail(sliceReviews);
5153
}
5254

55+
public SliceResponse<ReviewDetailV1> findReviewsV1(MenuType menuType,
56+
Long menuId,
57+
Long mealId,
58+
Pageable pageable,
59+
Long lastReviewId,
60+
CustomUserDetails userDetails) {
61+
Slice<Review> sliceReviews = null;
62+
if (menuType == MenuType.FIXED) {
63+
Menu menu = menuRepository.findById(menuId)
64+
.orElseThrow(() -> new BaseException(NOT_FOUND_MENU));
65+
sliceReviews = reviewRepository.findAllByMenuOrderByIdDesc(menu, lastReviewId,
66+
pageable);
67+
}
68+
69+
if (menuType == MenuType.VARIABLE) {
70+
Meal meal = mealRepository.findById(mealId)
71+
.orElseThrow(() -> new BaseException(NOT_FOUND_MENU));
72+
sliceReviews = reviewRepository.findAllByMealOrderByIdDesc(meal, lastReviewId,
73+
pageable);
74+
}
75+
76+
Long userId = (userDetails != null) ? userDetails.getId() : null;
77+
return convertToReviewDetailV1(sliceReviews, userId);
78+
}
79+
5380
public SliceResponse<ReviewDetail> findReviews(MenuType menuType,
5481
Long menuId,
5582
Long mealId,
@@ -72,9 +99,24 @@ public SliceResponse<ReviewDetail> findReviews(MenuType menuType,
7299
}
73100

74101
Long userId = (userDetails != null) ? userDetails.getId() : null;
102+
assert sliceReviews != null;
75103
return convertToReviewDetail(sliceReviews, userId);
76104
}
77105

106+
private SliceResponse<ReviewDetailV1> convertToReviewDetailV1(Slice<Review> sliceReviews,
107+
Long userId) {
108+
109+
List<ReviewDetailV1> reviewDetails = sliceReviews.getContent().stream()
110+
.map(review -> ReviewDetailV1.from(review, userId))
111+
.collect(Collectors.toList());
112+
113+
return SliceResponse.<ReviewDetailV1>builder()
114+
.numberOfElements(sliceReviews.getNumberOfElements())
115+
.hasNext(sliceReviews.hasNext())
116+
.dataList(reviewDetails)
117+
.build();
118+
}
119+
78120
private SliceResponse<ReviewDetail> convertToReviewDetail(Slice<Review> sliceReviews,
79121
Long userId) {
80122
List<ReviewDetail> reviewDetails = sliceReviews.getContent().stream()

0 commit comments

Comments
 (0)