Skip to content

Commit

Permalink
feat/#368 : 특정 날짜의 단,탄,지,칼로리 성분 분석하는 Usecase 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
hwangdaesun committed Jul 13, 2024
1 parent 1a00e90 commit c5ff22d
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,15 @@
import com.gaebaljip.exceed.application.port.in.meal.GetSpecificMealQuery;
import com.gaebaljip.exceed.application.port.in.member.GetMaintainMealUsecase;
import com.gaebaljip.exceed.application.port.in.member.GetTargetMealUsecase;
import com.gaebaljip.exceed.application.service.nutritionist.GetAllCalorieAnalysisService;
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.meal.GetMealExceptionDocs;
import com.gaebaljip.exceed.common.docs.meal.GetMealFoodExceptionDocs;
import com.gaebaljip.exceed.common.swagger.ApiErrorExceptionsExample;
import com.gaebaljip.exceed.dto.CurrentMealDTO;
import com.gaebaljip.exceed.dto.MaintainMealDTO;
import com.gaebaljip.exceed.dto.SpecificMealDTO;
import com.gaebaljip.exceed.dto.TargetMealDTO;
import com.gaebaljip.exceed.dto.*;
import com.gaebaljip.exceed.dto.request.GetAllAnalysisRequest;
import com.gaebaljip.exceed.dto.response.*;

import io.swagger.v3.oas.annotations.Operation;
Expand All @@ -45,6 +44,7 @@ public class GetMealController {
private final GetTargetMealUsecase getTargetMealUsecase;
private final GetCurrentMealQuery getCurrentMealQuery;
private final GetSpecificMealQuery getSpecificMealQuery;
private final GetAllCalorieAnalysisService getAllCalorieAnalysisService;

/** 오늘 먹은 식사 정보(단,탄,지 및 칼로리) 조회 */
@Operation(summary = "오늘 먹은 식사 정보 조회", description = "오늘 먹은 식사 정보(단,탄,지 및 칼로리)를 조회한다.")
Expand All @@ -70,11 +70,16 @@ public ApiResponse<ApiResponse.CustomBody<GetMealFoodResponse>> getMealFood(
MaintainMealDTO maintainMealDTO = getMaintainMealUsecase.execute(memberId, localDateTime);
TargetMealDTO targetMealDTO = getTargetMealUsecase.execute(memberId, localDateTime);
SpecificMealDTO specificMealDTO = getSpecificMealQuery.execute(memberId, localDateTime);

AllAnalysisDTO allAnalysisDTO =
getAllCalorieAnalysisService.execute(
GetAllAnalysisRequest.of(memberId, localDateTime));
return ApiResponseGenerator.success(
new GetMealFoodResponse(
GetMealResponse.of(
maintainMealDTO, targetMealDTO, specificMealDTO.currentMealDTO()),
specificMealDTO.mealRecordDTOS()),
specificMealDTO.mealRecordDTOS(),
allAnalysisDTO),
HttpStatus.OK);
}
}
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.AllAnalysisDTO;
import com.gaebaljip.exceed.dto.request.GetAllAnalysisRequest;

@Component
public interface GetAllAnalysisUsecase {
AllAnalysisDTO execute(GetAllAnalysisRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.gaebaljip.exceed.application.service.nutritionist;

import java.util.List;

import org.springframework.stereotype.Service;

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.*;
import com.gaebaljip.exceed.application.port.in.nutritionist.GetAllAnalysisUsecase;
import com.gaebaljip.exceed.application.port.out.meal.DailyMealPort;
import com.gaebaljip.exceed.application.port.out.member.MemberPort;
import com.gaebaljip.exceed.dto.AllAnalysisDTO;
import com.gaebaljip.exceed.dto.TodayMealDTO;
import com.gaebaljip.exceed.dto.request.GetAllAnalysisRequest;

import lombok.RequiredArgsConstructor;

/**
* 한달치 모든 영양소 달성도를 날짜별로 측정하여 반환한다.
*
* @author hwangdaesun
* @version 1.0
*/
@Service
@RequiredArgsConstructor
public class GetAllCalorieAnalysisService implements GetAllAnalysisUsecase {

private final DailyMealPort dailyMealPort;
private final MemberPort memberPort;

/**
* CalorieAnalyzer 도메인이 특정 날짜에 목표 칼로리를 달성했는 지를 판단하여 달성했을 경우 true를 반환
*
* @param request : 회원 PK와 날짜
* @return GetAnalysisResponse : 날짜별 칼로리 달성 여부
*/
@Override
public AllAnalysisDTO execute(GetAllAnalysisRequest request) {
List<Meal> meals =
dailyMealPort.query(new TodayMealDTO(request.memberId(), request.dateTime()));
Member member = memberPort.query(request.memberId(), request.dateTime());
if (meals.isEmpty()) {
return createEmptyMealAnalysis(request);
}
DailyMeal dailyMeal = new DailyMeal(meals);
CalorieAnalyzer calorieAnalyzer =
CalorieAnalyzerFactory.getInstance().createAnalyzer(dailyMeal, member);
ProteinAnalyzer proteinAnalyzer =
ProteinAnalyzerFactory.getInstance().createAnalyzer(dailyMeal, member);
CarbohydrateAnalyzer carbohydrateAnalyzer =
CarbohydrateAnalyzerFactory.getInstance().createAnalyzer(dailyMeal, member);
FatAnalyzer fatAnalyzer =
FatAnalyzerFactory.getInstance().createAnalyzer(dailyMeal, member);
return AllAnalysisDTO.of(
true,
request.dateTime().toLocalDate(),
calorieAnalyzer.analyze(),
proteinAnalyzer.analyze(),
carbohydrateAnalyzer.analyze(),
fatAnalyzer.analyze());
}

public AllAnalysisDTO createEmptyMealAnalysis(GetAllAnalysisRequest request) {
return AllAnalysisDTO.of(
false, request.dateTime().toLocalDate(), false, false, false, false);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.gaebaljip.exceed.dto;

import java.time.LocalDate;

public record AllAnalysisDTO(
Boolean isVisited,
LocalDate date,
boolean isCalorieAchieved,
boolean isProteinAchieved,
boolean isFatAchieved,
boolean isCarbohydrateAchieved) {

public static AllAnalysisDTO of(
Boolean isVisited,
LocalDate date,
boolean isCalorieAchieved,
boolean isProteinAchieved,
boolean isFatAchieved,
boolean isCarbohydrateAchieved) {
return new AllAnalysisDTO(
isVisited,
date,
isCalorieAchieved,
isProteinAchieved,
isFatAchieved,
isCarbohydrateAchieved);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.gaebaljip.exceed.dto.request;

import java.time.LocalDateTime;

public record GetAllAnalysisRequest(Long memberId, LocalDateTime dateTime) {
public static GetAllAnalysisRequest of(Long memberId, LocalDateTime dateTime) {
return new GetAllAnalysisRequest(memberId, dateTime);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@

import java.util.List;

import com.gaebaljip.exceed.dto.AllAnalysisDTO;
import com.gaebaljip.exceed.dto.MealRecordDTO;

import lombok.Builder;

public record GetMealFoodResponse(
GetMealResponse getMealResponse, List<MealRecordDTO> mealRecordDTOS) {
GetMealResponse getMealResponse,
List<MealRecordDTO> mealRecordDTOS,
AllAnalysisDTO allAnalysisDTO) {
@Builder
public GetMealFoodResponse {}
}

0 comments on commit c5ff22d

Please sign in to comment.