-
Notifications
You must be signed in to change notification settings - Fork 7
/
GetSpecificMealService.java
102 lines (89 loc) · 4.01 KB
/
GetSpecificMealService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package com.gaebaljip.exceed.application.service.meal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.gaebaljip.exceed.application.domain.meal.DailyMeal;
import com.gaebaljip.exceed.application.domain.meal.Meal;
import com.gaebaljip.exceed.application.port.in.meal.GetSpecificMealQuery;
import com.gaebaljip.exceed.application.port.out.meal.DailyMealPort;
import com.gaebaljip.exceed.application.port.out.meal.PresignedUrlPort;
import com.gaebaljip.exceed.common.dto.CurrentMealDTO;
import com.gaebaljip.exceed.common.dto.FoodDTO;
import com.gaebaljip.exceed.common.dto.MealRecordDTO;
import com.gaebaljip.exceed.common.dto.SpecificMealDTO;
import com.gaebaljip.exceed.common.dto.TodayMealDTO;
import lombok.RequiredArgsConstructor;
/**
* 특정 날짜의 식사 정보 조회
*
* @author hwangdaesun
* @version 1.0
*/
@Service
@RequiredArgsConstructor
public class GetSpecificMealService implements GetSpecificMealQuery {
private final DailyMealPort dailyMealPort;
private final PresignedUrlPort presignedUrlPort;
public static final double ZERO = 0.0;
/**
* DailyMeal 도메인이 특정 날짜 식사들을 분석하여 칼로리,단,탄,지 정보를 반환한다. 만약 식사 정보가 존재하지 않을 경우는 칼로리,단,탄,지 모두 ZERO를
* 반환한다. 또한, 특정 날짜의 식사 정보들을 반환한다.
*
* @param memberId
* @param date
* @return SpecificMeal : 특정 날짜의 칼로리,단,탄,지 정보와 식사 정보
*/
@Override
@Transactional(readOnly = true)
public SpecificMealDTO execute(Long memberId, LocalDateTime date) {
List<Meal> meals = dailyMealPort.query(new TodayMealDTO(memberId, date));
if (meals.isEmpty()) {
return createEmptySpecificMeal();
}
DailyMeal dailyMeal = new DailyMeal(meals);
List<MealRecordDTO> mealRecordDTOS =
meals.stream().map(meal -> createMealRecord(meal, memberId)).toList();
return SpecificMealDTO.builder()
.currentMealDTO(getCurrentMeal(dailyMeal))
.mealRecordDTOS(mealRecordDTOS)
.build();
}
private SpecificMealDTO createEmptySpecificMeal() {
return SpecificMealDTO.builder()
.mealRecordDTOS(List.of())
.currentMealDTO(
CurrentMealDTO.builder()
.protein(ZERO)
.fat(ZERO)
.carbohydrate(ZERO)
.calorie(ZERO)
.build())
.build();
}
private MealRecordDTO createMealRecord(Meal meal, Long memberId) {
return MealRecordDTO.builder()
.mealType(meal.getMealType())
.time(meal.getMealDateTime().toLocalTime())
.imageUri(presignedUrlPort.query(memberId, meal.getId()))
.foodDTOS(
meal.getConsumedFoods().stream()
.map(
consumedFood ->
FoodDTO.builder()
.id(consumedFood.getFood().getId())
.name(consumedFood.getFood().getName())
.build())
.collect(Collectors.toList()))
.build();
}
private CurrentMealDTO getCurrentMeal(DailyMeal dailyMeal) {
return CurrentMealDTO.builder()
.calorie(dailyMeal.calculateCurrentCalorie())
.carbohydrate(dailyMeal.calculateCurrentCarbohydrate())
.fat(dailyMeal.calculateCurrentFat())
.protein(dailyMeal.calculateCurrentProtein())
.build();
}
}