Skip to content

Commit 5b371ec

Browse files
authored
fix: statistics valid 데이터 동기화 (#242)
* fix: statistics 공통 메뉴 나오는 문제 해결 * fix: list api 공통 메뉴 안나오게 수정 * feat: /v2/review/meals에서 mealID 추출 시 valid menu만 추출하게끔 변경 * feat: 내리뷰 조회 api dto id,name 형태로 변경 * feat: list dto에 id,name,like / statistics dto에 id, name추가 * refactor: gemini 리뷰 반영 및 menuNames -> menuList로 수정
1 parent b62c317 commit 5b371ec

8 files changed

Lines changed: 123 additions & 131 deletions

File tree

src/main/java/ssu/eatssu/domain/menu/entity/Meal.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,10 @@ public List<String> getMenuNames() {
6464
public void addMealMenu(MealMenu mealMenu) {
6565
mealMenus.add(mealMenu);
6666
}
67+
68+
public List<Menu> getMenus() {
69+
return mealMenus.stream()
70+
.map(MealMenu::getMenu)
71+
.toList();
72+
}
6773
}

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

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.time.LocalDate;
1111
import java.util.ArrayList;
1212
import java.util.List;
13+
import java.util.Set;
1314
import java.util.stream.Collectors;
1415

1516
@AllArgsConstructor
@@ -41,28 +42,36 @@ public class MealReviewResponse {
4142
@Schema(description = "리뷰 이미지 url 리스트", example = "[\"imgurl1\", \"imgurl2\"]")
4243
private List<String> imageUrls;
4344

44-
@Schema(description = "좋아요한 메뉴명 리스트", example = "[\"메뉴1\", \"메뉴2\"]")
45-
private List<String> likedMenuNames;
46-
@Schema(description = "메뉴명 리스트", example = "['고구마치즈돈까스', '막국수', '미니밥','단무지', '요구르트']")
47-
private List<String> menuNames;
45+
@Schema(description = "메뉴 리스트")
46+
private List<MenuIdNameLikeDto> menuList;
4847

49-
public static MealReviewResponse from(Review review, Long userId) {
48+
public static MealReviewResponse from(Review review,
49+
Long userId,
50+
List<ValidMenuForViewResponse.MenuDto> validMenus) {
5051
List<String> imageUrls = new ArrayList<>();
5152
review.getReviewImages().forEach(i -> imageUrls.add(i.getImageUrl()));
5253

53-
List<String> likedMenuNames = review.getMenuLikes().stream()
54-
.filter(ReviewMenuLike::getIsLike)
55-
.map(like -> like.getMenu().getName())
56-
.collect(Collectors.toList());
54+
// 좋아요한 메뉴 ID 모음
55+
Set<Long> likedMenuIds = review.getMenuLikes().stream()
56+
.filter(ReviewMenuLike::getIsLike)
57+
.map(like -> like.getMenu().getId())
58+
.collect(Collectors.toSet());
59+
60+
List<MenuIdNameLikeDto> menuNames = validMenus.stream()
61+
.map(valid -> new MenuIdNameLikeDto(
62+
valid.getMenuId(),
63+
valid.getName(),
64+
likedMenuIds.contains(valid.getMenuId())
65+
))
66+
.toList();
5767

5868
MealReviewResponseBuilder builder = MealReviewResponse.builder()
5969
.reviewId(review.getId())
6070
.rating(review.getRating())
6171
.writtenAt(review.getCreatedDate().toLocalDate())
6272
.content(review.getContent())
6373
.imageUrls(imageUrls)
64-
.menuNames(review.getMeal().getMenuNames())
65-
.likedMenuNames(likedMenuNames);
74+
.menuList(menuNames);
6675

6776
if (review.getUser() == null) {
6877
return builder.writerId(null)
@@ -82,5 +91,6 @@ public static MealReviewResponse from(Review review, Long userId) {
8291
.writerNickname(review.getUser().getNickname())
8392
.isWriter(false)
8493
.build();
94+
8595
}
8696
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
@AllArgsConstructor
1313
@Builder
1414
public class MealReviewsV2Response implements ReviewInformationResponse {
15-
@Schema(description = "메뉴명 리스트", example = "['고구마치즈돈까스', '막국수', '미니밥','단무지', '요구르트']")
16-
private List<String> menuNames;
15+
@Schema(description = "메뉴 리스트")
16+
private List<MenuIdNameDto> menuList;
1717

1818
@Schema(description = "리뷰 개수", example = "15")
1919
private Long totalReviewCount;
@@ -26,11 +26,11 @@ public class MealReviewsV2Response implements ReviewInformationResponse {
2626
@Schema(description = "평점 별 갯수")
2727
private ReviewRatingCount reviewRatingCount;
2828

29-
public static MealReviewsV2Response of(Long totalReviewCount, List<String> menuNames,
29+
public static MealReviewsV2Response of(Long totalReviewCount, List<MenuIdNameDto> menuNames,
3030
RatingAverages ratingAverages, ReviewRatingCount reviewRatingCount) {
3131

3232
return MealReviewsV2Response.builder()
33-
.menuNames(menuNames)
33+
.menuList(menuNames)
3434
.mainRating(ratingAverages.mainRating())
3535
.totalReviewCount(totalReviewCount)
3636
.reviewRatingCount(reviewRatingCount)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package ssu.eatssu.domain.review.dto;
2+
3+
public record MenuIdNameDto(Long id,
4+
String name) {
5+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package ssu.eatssu.domain.review.dto;
2+
3+
public record MenuIdNameLikeDto(
4+
Long id,
5+
String name,
6+
Boolean isLike
7+
) {
8+
}

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

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import ssu.eatssu.domain.review.dto.CreateMenuReviewRequest;
1818
import ssu.eatssu.domain.review.dto.MealReviewResponse;
1919
import ssu.eatssu.domain.review.dto.MealReviewsV2Response;
20+
import ssu.eatssu.domain.review.dto.MenuIdNameDto;
2021
import ssu.eatssu.domain.review.dto.MenuLikeRequest;
2122
import ssu.eatssu.domain.review.dto.MenuReviewsV2Response;
2223
import ssu.eatssu.domain.review.dto.RestaurantReviewResponse;
@@ -159,28 +160,41 @@ public RestaurantReviewResponse findRestaurantReviews(Restaurant restaurant) {
159160
*/
160161
public SliceResponse<MealReviewResponse> findMealReviewList(Long mealId, Long lastReviewId, Pageable pageable,
161162
CustomUserDetails userDetails) {
162-
if (!mealRepository.existsById(mealId)) {
163-
throw new BaseException(NOT_FOUND_MEAL);
164-
}
165163

166-
List<Long> menuIds = mealMenuRepository.findMenuIdsByMealId(mealId);
167-
if (menuIds.isEmpty()) {
164+
Meal meal = mealRepository.findById(mealId).orElseThrow(() -> new BaseException(NOT_FOUND_MEAL));
165+
166+
List<Menu> menus = mealMenuRepository.findMenusByMeal(meal);
167+
168+
List<ValidMenuForViewResponse.MenuDto> validMenus = menus.stream()
169+
.filter(menu -> !MenuFilterUtil.isExcludedFromReview(
170+
menu.getName()))
171+
.map(menu -> ValidMenuForViewResponse.MenuDto.builder()
172+
.menuId(menu.getId())
173+
.name(menu.getName())
174+
.build())
175+
.collect(Collectors.toList());
176+
177+
178+
if (validMenus.isEmpty()) {
168179
return SliceResponse.empty();
169180
}
170181

171-
List<Long> mealIds = mealMenuRepository.findMealIdsByMenuIds(menuIds);
182+
List<Long> validMenuIds = validMenus.stream().map(ValidMenuForViewResponse.MenuDto::getMenuId).toList();
183+
List<Long> mealIds = mealMenuRepository.findMealIdsByMenuIds(validMenuIds);
172184
if (mealIds.isEmpty()) {
173185
return SliceResponse.empty();
174186
}
175187

176188
Page<Review> pageReviews = reviewRepository.findReviewsByMealIds(mealIds, lastReviewId, pageable);
177189

178190
Long userId = (userDetails != null) ? userDetails.getId() : null;
191+
192+
179193
List<MealReviewResponse> mealReviewResponses =
180194
pageReviews.getContent()
181195
.stream()
182196
.map(review -> MealReviewResponse.from(review,
183-
userId))
197+
userId,validMenus))
184198
.collect(Collectors.toList());
185199

186200
return SliceResponse.<MealReviewResponse>builder()
@@ -265,6 +279,15 @@ public MealReviewsV2Response findMealReviews(Long mealId) {
265279
List<Review> reviews = reviewRepository.findAllByMeal(meal);
266280
List<Menu> menus = mealMenuRepository.findMenusByMeal(meal);
267281

282+
List<ValidMenuForViewResponse.MenuDto> validMenus = menus.stream()
283+
.filter(menu -> !MenuFilterUtil.isExcludedFromReview(
284+
menu.getName()))
285+
.map(menu -> ValidMenuForViewResponse.MenuDto.builder()
286+
.menuId(menu.getId())
287+
.name(menu.getName())
288+
.build())
289+
.toList();
290+
268291
Double averageRating = Optional.ofNullable(reviews)
269292
.orElse(Collections.emptyList())
270293
.stream()
@@ -288,22 +311,16 @@ public MealReviewsV2Response findMealReviews(Long mealId) {
288311
.sum();
289312

290313

291-
Integer unlikeCount = Optional.ofNullable(menus)
292-
.orElse(Collections.emptyList())
293-
.stream()
294-
.filter(Objects::nonNull)
295-
.map(Menu::getUnlikeCount)
296-
.filter(Objects::nonNull)
297-
.mapToInt(Integer::intValue)
298-
.sum();
299-
300314
ReviewRatingCount reviewRatingCount = ReviewRatingCount.from(reviews);
301315

302316
return MealReviewsV2Response
303317
.builder()
304-
.menuNames(menus.stream()
318+
.menuList(validMenus.stream()
305319
.filter(Objects::nonNull)
306-
.map(Menu::getName)
320+
.map(menu -> new MenuIdNameDto(
321+
menu.getMenuId(),
322+
menu.getName()
323+
))
307324
.filter(Objects::nonNull)
308325
.collect(Collectors.toList()))
309326
.totalReviewCount((long) reviews.size())

src/main/java/ssu/eatssu/domain/user/dto/MyMealReviewResponse.java

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
import lombok.AllArgsConstructor;
55
import lombok.Builder;
66
import lombok.Getter;
7+
import ssu.eatssu.domain.review.dto.MenuIdNameLikeDto;
78
import ssu.eatssu.domain.review.entity.Review;
89
import ssu.eatssu.domain.review.entity.ReviewMenuLike;
10+
import ssu.eatssu.domain.review.utils.MenuFilterUtil;
911

1012
import java.time.LocalDate;
1113
import java.util.ArrayList;
1214
import java.util.Collections;
1315
import java.util.List;
16+
import java.util.Set;
17+
import java.util.stream.Collectors;
1418

1519
@AllArgsConstructor
1620
@Builder
@@ -31,33 +35,59 @@ public class MyMealReviewResponse {
3135

3236
@Schema(description = "리뷰 이미지 url 리스트", example = "[\"imgurl1\", \"imgurl2\"]")
3337
private List<String> imageUrls;
34-
35-
@Schema(description = "좋아요한 메뉴명 리스트", example = "[\"메뉴1\", \"메뉴2\"]")
36-
private List<String> likedMenuNames;
37-
@Schema(description = "메뉴명 리스트", example = "['고구마치즈돈까스', '막국수', '미니밥','단무지', '요구르트']")
38-
private List<String> menuNames;
38+
@Schema(description = "메뉴 리스트", example = "[\n" +
39+
" {\n" +
40+
" \"menuId\": 3143,\n" +
41+
" \"name\": \"생고기제육볶음\"\n" +
42+
" \"isLike\" : true,\n" +
43+
" },\n" +
44+
" {\n" +
45+
" \"menuId\": 3144,\n" +
46+
" \"name\": \"오징어초무침\",\n" +
47+
" \"isLike\" : false,\n" +
48+
" }\n" +
49+
" ]")
50+
private List<MenuIdNameLikeDto> menuList;
3951

4052
public static MyMealReviewResponse from(Review review) {
4153
List<String> imgUrlList = new ArrayList<>();
4254
review.getReviewImages().forEach(i -> imgUrlList.add(i.getImageUrl()));
4355

44-
List<String> likedMenuNames = review.getMenuLikes().stream()
45-
.filter(ReviewMenuLike::getIsLike)
46-
.map(like -> like.getMenu().getName())
47-
.toList();
56+
Set<Long> likedMenuIds = review.getMenuLikes().stream()
57+
.filter(ReviewMenuLike::getIsLike)
58+
.map(like -> like.getMenu().getId())
59+
.collect(Collectors.toSet());
60+
61+
62+
List<MenuIdNameLikeDto> menuNames;
63+
64+
if (review.getMeal() != null) {
65+
menuNames = review.getMeal().getMenus().stream()
66+
.filter(menu -> !MenuFilterUtil.isExcludedFromReview(menu.getName()))
67+
.map(menu -> new MenuIdNameLikeDto(
68+
menu.getId(),
69+
menu.getName(),
70+
likedMenuIds.contains(menu.getId())
71+
))
72+
.toList();
73+
} else {
74+
menuNames = Collections.singletonList(
75+
new MenuIdNameLikeDto(
76+
review.getMenu().getId(),
77+
review.getMenu().getName(),
78+
likedMenuIds.contains(review.getMenu().getId())
79+
)
80+
);
81+
}
4882

49-
List<String> menuNames = review.getMeal() == null ? Collections.singletonList(review.getMenu()
50-
.getName()) : review.getMeal()
51-
.getMenuNames();
5283
return MyMealReviewResponse
5384
.builder()
5485
.reviewId(review.getId())
5586
.rating(review.getRating())
5687
.writtenAt(review.getCreatedDate().toLocalDate())
5788
.content(review.getContent())
5889
.imageUrls(imgUrlList)
59-
.likedMenuNames(likedMenuNames)
60-
.menuNames(menuNames)
90+
.menuList(menuNames)
6191
.build();
6292
}
6393
}

src/main/resources/application-local.yml

Lines changed: 0 additions & 84 deletions
This file was deleted.

0 commit comments

Comments
 (0)