Skip to content

Commit

Permalink
refactor/#368 : Analysis를 CalorieAnalysis로 의도가 더 구체적으로 드러나게 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
hwangdaesun committed Jul 13, 2024
1 parent 8f1e9e8 commit d95132b
Show file tree
Hide file tree
Showing 13 changed files with 76 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,11 @@ public ApiResponse<ApiResponse.CustomBody<GetMealFoodResponse>> getMealFood(
MaintainMealDTO maintainMealDTO = getMaintainMealUsecase.execute(memberId, localDateTime);
TargetMealDTO targetMealDTO = getTargetMealUsecase.execute(memberId, localDateTime);
SpecificMealDTO specificMealDTO = getSpecificMealQuery.execute(memberId, localDateTime);
GetMealResponse getMealResponse =
new GetMealResponse(
maintainMealDTO, targetMealDTO, specificMealDTO.currentMealDTO());
return ApiResponseGenerator.success(
new GetMealFoodResponse(getMealResponse, specificMealDTO.mealRecordDTOS()),
new GetMealFoodResponse(
GetMealResponse.of(
maintainMealDTO, targetMealDTO, specificMealDTO.currentMealDTO()),
specificMealDTO.mealRecordDTOS()),
HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.gaebaljip.exceed.application.port.in.nutritionist.GetAnalysisUsecase;
import com.gaebaljip.exceed.application.port.in.nutritionist.GetCalorieAnalysisUsecase;
import com.gaebaljip.exceed.common.ApiResponse;
import com.gaebaljip.exceed.common.ApiResponseGenerator;
import com.gaebaljip.exceed.common.annotation.AuthenticationMemberId;
import com.gaebaljip.exceed.common.docs.nutritionist.GetAnalysisExceptionDocs;
import com.gaebaljip.exceed.common.swagger.ApiErrorExceptionsExample;
import com.gaebaljip.exceed.dto.request.GetAnalysisRequest;
import com.gaebaljip.exceed.dto.response.GetAnalysisResponse;
import com.gaebaljip.exceed.dto.request.GetCalorieAnalysisRequest;
import com.gaebaljip.exceed.dto.response.GetCalorieAnalysisResponse;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
Expand All @@ -34,17 +34,17 @@
@Tag(name = "[분석 조회]")
public class GetAnalysisController {

private final GetAnalysisUsecase getAnalysisUsecase;
private final GetCalorieAnalysisUsecase getAnalysisUsecase;

@Operation(summary = "월별 식사 정보 분석", description = "월별 식사 정보를 분석한다.")
@GetMapping("/achieve/{date}")
@ApiErrorExceptionsExample(GetAnalysisExceptionDocs.class)
public ApiResponse<ApiResponse.CustomBody<GetAnalysisResponse>> getAnalysis(
public ApiResponse<ApiResponse.CustomBody<GetCalorieAnalysisResponse>> getAnalysis(
@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date,
@Parameter(hidden = true) @AuthenticationMemberId Long memberId) {
LocalDateTime localDateTime = date.atStartOfDay();
GetAnalysisResponse achieveListResponse =
getAnalysisUsecase.execute(new GetAnalysisRequest(memberId, localDateTime));
GetCalorieAnalysisResponse achieveListResponse =
getAnalysisUsecase.execute(new GetCalorieAnalysisRequest(memberId, localDateTime));
return ApiResponseGenerator.success(achieveListResponse, HttpStatus.OK);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.gaebaljip.exceed.application.port.in.nutritionist;

import org.springframework.stereotype.Component;

import com.gaebaljip.exceed.dto.request.GetCalorieAnalysisRequest;
import com.gaebaljip.exceed.dto.response.GetCalorieAnalysisResponse;

@Component
public interface GetCalorieAnalysisUsecase {
GetCalorieAnalysisResponse execute(GetCalorieAnalysisRequest getCalorieAnalysisRequest);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,52 +14,51 @@
import com.gaebaljip.exceed.application.domain.meal.DailyMeal;
import com.gaebaljip.exceed.application.domain.meal.Meal;
import com.gaebaljip.exceed.application.domain.member.Member;
import com.gaebaljip.exceed.application.domain.nutritionist.Nutritionist;
import com.gaebaljip.exceed.application.port.in.nutritionist.GetAnalysisUsecase;
import com.gaebaljip.exceed.application.domain.nutritionist.CalorieAnalyzer;
import com.gaebaljip.exceed.application.domain.nutritionist.CalorieAnalyzerFactory;
import com.gaebaljip.exceed.application.port.in.nutritionist.GetCalorieAnalysisUsecase;
import com.gaebaljip.exceed.common.annotation.Timer;
import com.gaebaljip.exceed.dto.AnalysisDTO;
import com.gaebaljip.exceed.dto.CalorieAnalysisDTO;
import com.gaebaljip.exceed.dto.MonthlyMealDTO;
import com.gaebaljip.exceed.dto.request.GetAnalysisRequest;
import com.gaebaljip.exceed.dto.response.GetAnalysisResponse;
import com.gaebaljip.exceed.dto.request.GetCalorieAnalysisRequest;
import com.gaebaljip.exceed.dto.response.GetCalorieAnalysisResponse;

import lombok.RequiredArgsConstructor;

/**
* 한달치 달성도를 날짜별로 측정하여 반환한다.
* 한달치 칼로리 달성도를 날짜별로 측정하여 반환한다.
*
* @author hwangdaesun
* @version 1.0
*/
@Service
@RequiredArgsConstructor
public class GetAnalysisService implements GetAnalysisUsecase {
public class GetCalorieCalorieAnalysisService implements GetCalorieAnalysisUsecase {

public static final int FIRST_DAY = 1;
public static final int DAYS_TO_ADD = 1;
private final MonthlyMealPort monthlyMealPort;
private final MonthlyTargetPort monthlyTargetPort;

/**
* Nutritionist 도메인이 특정 날짜에 목표 칼로리,단,탄,지를 달성했는 지를 판단하여 달성했을 경우 true를 반환 칼로리,단,단,지 달성 여부를 날짜별로
* 그룹화한다.
* CalorieAnalyzer 도메인이 특정 날짜에 목표 칼로리를 달성했는 지를 판단하여 달성했을 경우 true를 반환
*
* @param request : 회원 PK와 날짜
* @return GetAnalysisResponse : 칼로리,단,단,지 달성 여부들의 집합
* @return GetAnalysisResponse : 날짜별 칼로리 달성 여부
*/
@Override
@Timer
@Transactional(readOnly = true)
public GetAnalysisResponse execute(GetAnalysisRequest request) {
public GetCalorieAnalysisResponse execute(GetCalorieAnalysisRequest request) {
List<Meal> meals =
monthlyMealPort.query(new MonthlyMealDTO(request.memberId(), request.date()));
Map<LocalDate, DailyMeal> dailyMealMap = groupByDate(meals);
Member member = monthlyTargetPort.query(request.memberId(), request.date());
List<AnalysisDTO> analyses =
List<CalorieAnalysisDTO> analyses =
getStartDate(request)
.datesUntil(getLastDate(request).plusDays(1))
.map(date -> createAnalysisForDay(date, dailyMealMap, member))
.toList();
return new GetAnalysisResponse(analyses);
return new GetCalorieAnalysisResponse(analyses);
}

@Timer
Expand All @@ -71,32 +70,31 @@ private Map<LocalDate, DailyMeal> groupByDate(List<Meal> meals) {
Collectors.collectingAndThen(Collectors.toList(), DailyMeal::new)));
}

private LocalDate getStartDate(GetAnalysisRequest request) {
private LocalDate getStartDate(GetCalorieAnalysisRequest request) {
return LocalDate.from(request.date().withDayOfMonth(FIRST_DAY));
}

private LocalDate getLastDate(GetAnalysisRequest request) {
private LocalDate getLastDate(GetCalorieAnalysisRequest request) {
LocalDate date = request.date().toLocalDate(); // LocalDateTime을 LocalDate로 변환
return date.withDayOfMonth(date.lengthOfMonth()); // 그 달의 마지막 날짜를 설정
}

@Timer
private AnalysisDTO createAnalysisForDay(
private CalorieAnalysisDTO createAnalysisForDay(
LocalDate day, Map<LocalDate, DailyMeal> dailyMealMap, Member member) {
return Optional.ofNullable(dailyMealMap.get(day))
.map(
dailyMeal -> {
Nutritionist nutritionist =
Nutritionist.createNutritionist(member, dailyMeal);
return AnalysisDTO.builder()
CalorieAnalyzer calorieAnalyzer = CalorieAnalyzerFactory.getInstance().createAnalyzer(dailyMeal, member);
return CalorieAnalysisDTO.builder()
.date(day)
.isVisited(true)
.isCalorieAchieved(nutritionist.evaluateCalorieAchieve())
.isCalorieAchieved(calorieAnalyzer.analyze())
.build();
})
.orElseGet(
() ->
AnalysisDTO.builder()
CalorieAnalysisDTO.builder()
.date(day)
.isVisited(false)
.isCalorieAchieved(false)
Expand Down
11 changes: 0 additions & 11 deletions BE/exceed/src/main/java/com/gaebaljip/exceed/dto/AnalysisDTO.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.gaebaljip.exceed.dto;

import java.time.LocalDate;

import lombok.Builder;

public record CalorieAnalysisDTO(Boolean isVisited, LocalDate date, boolean isCalorieAchieved) {

@Builder
public CalorieAnalysisDTO {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@

import com.gaebaljip.exceed.common.ValidationMessage;

public record GetAnalysisRequest(
public record GetCalorieAnalysisRequest(
@NotNull(message = "memberId을" + ValidationMessage.NOT_NULL) Long memberId,
@NotNull(message = "날짜를 " + ValidationMessage.NOT_NULL) LocalDateTime date) {}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.gaebaljip.exceed.dto.response;

import java.util.List;

import com.gaebaljip.exceed.dto.CalorieAnalysisDTO;

public record GetCalorieAnalysisResponse(List<CalorieAnalysisDTO> calorieAnalysisDTOS) {}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,12 @@
public record GetMealResponse(
MaintainMealDTO maintainMealDTO,
TargetMealDTO targetMealDTO,
CurrentMealDTO currentMealDTO) {}
CurrentMealDTO currentMealDTO) {

public static GetMealResponse of(
MaintainMealDTO maintainMealDTO,
TargetMealDTO targetMealDTO,
CurrentMealDTO currentMealDTO) {
return new GetMealResponse(maintainMealDTO, targetMealDTO, currentMealDTO);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.ResultActions;

import com.gaebaljip.exceed.application.port.in.nutritionist.GetAnalysisUsecase;
import com.gaebaljip.exceed.application.port.in.nutritionist.GetCalorieAnalysisUsecase;
import com.gaebaljip.exceed.common.ControllerTest;
import com.gaebaljip.exceed.common.WithMockUser;

@WebMvcTest(GetAnalysisController.class)
class GetAchieveControllerTest extends ControllerTest {

@MockBean private GetAnalysisUsecase getAchieveUsecase;
@MockBean private GetCalorieAnalysisUsecase getAchieveUsecase;

@Test
@WithMockUser
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import com.gaebaljip.exceed.common.ApiResponse;
import com.gaebaljip.exceed.common.IntegrationTest;
import com.gaebaljip.exceed.common.WithMockUser;
import com.gaebaljip.exceed.dto.response.GetAnalysisResponse;
import com.gaebaljip.exceed.dto.response.GetCalorieAnalysisResponse;

public class GetAchieveIntegrationTest extends IntegrationTest {
@Test
Expand All @@ -37,13 +37,13 @@ void getAchieves() throws Exception {

String responseBody = resultActions.andReturn().getResponse().getContentAsString();

ApiResponse.CustomBody<GetAnalysisResponse> getAchieveListResponseCustomBody =
ApiResponse.CustomBody<GetCalorieAnalysisResponse> getAchieveListResponseCustomBody =
om.readValue(
responseBody,
new TypeReference<ApiResponse.CustomBody<GetAnalysisResponse>>() {});
new TypeReference<ApiResponse.CustomBody<GetCalorieAnalysisResponse>>() {});

int comparedSize =
getAchieveListResponseCustomBody.getResponse().getAnalyses().stream()
getAchieveListResponseCustomBody.getResponse().calorieAnalysisDTOS().stream()
.toList()
.size();

Expand Down

0 comments on commit d95132b

Please sign in to comment.