From 65023dd2115f9eea00dedb1ae40e43243d99a41b Mon Sep 17 00:00:00 2001 From: bu2000 Date: Fri, 14 Nov 2025 23:07:44 +0900 Subject: [PATCH 1/7] complete insert ingredients into database by using csv --- .../algorithmchef/model/Ingredient.java | 2 +- .../algorithmchef/model/Recipe.java | 3 + .../algorithmchef/model/RecipeIngredient.java | 9 +- .../repository/IngredientRepository.java | 9 + .../service/DataInitializer.java | 189 ++++++++---- .../resources/static/ingredients_clean.csv | 274 ++++++++++++++++++ 6 files changed, 428 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java create mode 100644 src/main/resources/static/ingredients_clean.csv diff --git a/src/main/java/com/webservice/algorithmchef/model/Ingredient.java b/src/main/java/com/webservice/algorithmchef/model/Ingredient.java index 7df2062..b535598 100644 --- a/src/main/java/com/webservice/algorithmchef/model/Ingredient.java +++ b/src/main/java/com/webservice/algorithmchef/model/Ingredient.java @@ -33,7 +33,7 @@ public class Ingredient { @Column(nullable = false) private String name; - @Column(nullable = false, unique = true) + @Column(nullable = false) private String category; @Column(nullable = false) diff --git a/src/main/java/com/webservice/algorithmchef/model/Recipe.java b/src/main/java/com/webservice/algorithmchef/model/Recipe.java index d22bea7..930a2dd 100644 --- a/src/main/java/com/webservice/algorithmchef/model/Recipe.java +++ b/src/main/java/com/webservice/algorithmchef/model/Recipe.java @@ -45,6 +45,9 @@ public class Recipe { @Column(nullable = false) private String type; + @Column(nullable = false) + private double kcal; + @OneToMany(mappedBy = "recipe", orphanRemoval = true) private List recipeTags; diff --git a/src/main/java/com/webservice/algorithmchef/model/RecipeIngredient.java b/src/main/java/com/webservice/algorithmchef/model/RecipeIngredient.java index 75c0f66..45fbb18 100644 --- a/src/main/java/com/webservice/algorithmchef/model/RecipeIngredient.java +++ b/src/main/java/com/webservice/algorithmchef/model/RecipeIngredient.java @@ -7,6 +7,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; +import jakarta.persistence.Lob; import jakarta.persistence.ManyToOne; import lombok.AllArgsConstructor; import lombok.Builder; @@ -33,10 +34,12 @@ public class RecipeIngredient { @JoinColumn(name="recipe_id") private Recipe recipe; + @Column(nullable = false) + @Lob + private String neededIngredients; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="ingredient_id") private Ingredient ingredient; - - @Column(nullable = false) - private int quantity; + } diff --git a/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java b/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java new file mode 100644 index 0000000..d91c951 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java @@ -0,0 +1,9 @@ +package com.webservice.algorithmchef.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.webservice.algorithmchef.model.Ingredient; + +public interface IngredientRepository extends JpaRepository { + +} diff --git a/src/main/java/com/webservice/algorithmchef/service/DataInitializer.java b/src/main/java/com/webservice/algorithmchef/service/DataInitializer.java index 88dbd34..469d760 100644 --- a/src/main/java/com/webservice/algorithmchef/service/DataInitializer.java +++ b/src/main/java/com/webservice/algorithmchef/service/DataInitializer.java @@ -1,5 +1,10 @@ package com.webservice.algorithmchef.service; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -9,8 +14,10 @@ import com.webservice.algorithmchef.model.Allergy; import com.webservice.algorithmchef.model.HealthGoal; +import com.webservice.algorithmchef.model.Ingredient; import com.webservice.algorithmchef.repository.AllergyRepository; import com.webservice.algorithmchef.repository.HealthGoalRepository; +import com.webservice.algorithmchef.repository.IngredientRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,57 +25,131 @@ @Component @RequiredArgsConstructor @Slf4j -public class DataInitializer implements CommandLineRunner{ - - private final HealthGoalRepository healthGoalRepository; - private final AllergyRepository allergyRepository; - - @Override - @Transactional - public void run(String... args) throws Exception { - // TODO Auto-generated method stub - - if(healthGoalRepository.count() == 0) { - log.info("데이터 베이스에 건강 목표 삽입 진행합니다."); - List goals = Arrays.asList( - HealthGoal.builder().name("다이어트 (체중 감량)").category("체중 관리").description("저칼로리, 저지방 식단").build(), - HealthGoal.builder().name("근육 증가 (고단백)").category("체중 관리").description("단백질 함량이 높은 식단").build(), - HealthGoal.builder().name("체중 유지").category("체중 관리").description("균형 잡힌 영양소 섭취").build(), - - HealthGoal.builder().name("저염 식단").category("건강 상태").description("나트륨 섭취를 줄이는 식단").build(), - HealthGoal.builder().name("혈압 관리").category("건강 상태").description("칼륨이 풍부한 식단").build(), - HealthGoal.builder().name("당뇨 관리 (저당)").category("건강 상태").description("혈당을 천천히 올리는 식단").build(), - HealthGoal.builder().name("콜레스테롤 관리").category("건강 상태").description("포화지방이 적은 식단").build(), - - HealthGoal.builder().name("채식 (비건)").category("라이프스타일").description("모든 동물성 제품 제외").build(), - HealthGoal.builder().name("채식 (락토-오보)").category("라이프스타일").description("고기 제외 (유제품, 계란 허용)").build(), - HealthGoal.builder().name("임산부 식단").category("라이프 스타일"). - description("엽산, 철분 등이 풍부하고 날음식을 피하는 식단").build(), - HealthGoal.builder().name("키토제닉 (고지방 저탄수화물)").category("라이프 스타일") - .description("탄수화물을 극단적으로 줄이고 지방 섭취").build() - ); - healthGoalRepository.saveAll(goals); - log.info("건강 목표 저장 완료"); - } - - if(allergyRepository.count() == 0) { - log.info("데이터 베이스에 알러지 종류 삽입 진행합니다."); - List allergies = Arrays.asList( - Allergy.builder().name("갑각류 알레르기").build(), - Allergy.builder().name("견과 알레르기").build(), - Allergy.builder().name("달걀 알레르기").build(), - Allergy.builder().name("땅콩 알레르기").build(), - Allergy.builder().name("밀 알레르기").build(), - Allergy.builder().name("생선 알레르기").build(), - Allergy.builder().name("우유 알레르기").build(), - Allergy.builder().name("조개 알레르기").build(), - Allergy.builder().name("콩 알레르기").build(), - Allergy.builder().name("복숭아 알레르기").build() - ); - allergyRepository.saveAll(allergies); - log.info("알레르기 정보 데이터베이스에 저장완료"); - } - - } - -} +public class DataInitializer implements CommandLineRunner { + + private final HealthGoalRepository healthGoalRepository; + private final AllergyRepository allergyRepository; + private final IngredientRepository ingredientRepository; + + @Override + @Transactional + public void run(String... args) throws Exception { + + // --- 1. 건강 목표 초기화 --- + if (healthGoalRepository.count() == 0) { + log.info("데이터 베이스에 건강 목표 삽입 진행합니다."); + List goals = Arrays.asList( + HealthGoal.builder().name("다이어트 (체중 감량)").category("체중 관리").description("저칼로리, 저지방 식단").build(), + HealthGoal.builder().name("근육 증가 (고단백)").category("체중 관리").description("단백질 함량이 높은 식단").build(), + HealthGoal.builder().name("체중 유지").category("체중 관리").description("균형 잡힌 영양소 섭취").build(), + + HealthGoal.builder().name("저염 식단").category("건강 상태").description("나트륨 섭취를 줄이는 식단").build(), + HealthGoal.builder().name("혈압 관리").category("건강 상태").description("칼륨이 풍부한 식단").build(), + HealthGoal.builder().name("당뇨 관리 (저당)").category("건강 상태").description("혈당을 천천히 올리는 식단").build(), + HealthGoal.builder().name("콜레스테롤 관리").category("건강 상태").description("포화지방이 적은 식단").build(), + + HealthGoal.builder().name("채식 (비건)").category("라이프스타일").description("모든 동물성 제품 제외").build(), + HealthGoal.builder().name("채식 (락토-오보)").category("라이프스타일").description("고기 제외 (유제품, 계란 허용)").build(), + HealthGoal.builder().name("임산부 식단").category("라이프 스타일") + .description("엽산, 철분 등이 풍부하고 날음식을 피하는 식단").build(), + HealthGoal.builder().name("키토제닉 (고지방 저탄수화물)").category("라이프 스타일") + .description("탄수화물을 극단적으로 줄이고 지방 섭취").build() + ); + healthGoalRepository.saveAll(goals); + log.info("건강 목표 저장 완료"); + } + + // --- 2. 알레르기 정보 초기화 --- + if (allergyRepository.count() == 0) { + log.info("데이터 베이스에 알러지 종류 삽입 진행합니다."); + List allergies = Arrays.asList( + Allergy.builder().name("갑각류 알레르기").build(), + Allergy.builder().name("견과 알레르기").build(), + Allergy.builder().name("달걀 알레르기").build(), + Allergy.builder().name("땅콩 알레르기").build(), + Allergy.builder().name("밀 알레르기").build(), + Allergy.builder().name("생선 알레르기").build(), + Allergy.builder().name("우유 알레르기").build(), + Allergy.builder().name("조개 알레르기").build(), + Allergy.builder().name("콩 알레르기").build(), + Allergy.builder().name("복숭아 알레르기").build() + ); + allergyRepository.saveAll(allergies); + log.info("알레르기 정보 데이터베이스에 저장완료"); + } + + // --- 3. 식재료 정보 초기화 (CSV) --- + if (ingredientRepository.count() == 0) { + + log.info("식재료 데이터를 DB에 삽입합니다..."); + + List list = new ArrayList<>(); + + InputStream is = getClass().getResourceAsStream("/static/ingredients_clean.csv"); + if (is == null) { + log.error("ingredients_clean.csv 파일을 찾을 수 없습니다! (경로: /static/ingredients_clean.csv)"); + return; + } + + try (BufferedReader br = new BufferedReader( + new InputStreamReader(is, StandardCharsets.UTF_8))) { + + // (★수정된 부분★) 헤더 스킵을 위한 플래그 + boolean isFirstLine = true; + int lineNumber = 0; // 로그용 라인 번호 + + String line; + while ((line = br.readLine()) != null) { + lineNumber++; + + // 첫 번째 줄(헤더)이면 건너뜁니다. + if (isFirstLine) { + isFirstLine = false; + // log.info("Skipping header: {}", line); // 헤더 내용 확인 (필요시 주석 해제) + continue; + } + + if (line.trim().isEmpty()) { // 빈 줄은 건너뛰기 + continue; + } + + String[] arr = line.split(","); + + // (★개선 추천★) + // 데이터 행 파싱 중 예외가 발생해도 전체가 중단되지 않도록 + // try-catch로 감싸주는 것이 좋습니다. (아래 팁 참고) + try { + if (arr.length != 4) { + log.warn("Skipping line {}: CSV format does not have 4 columns. Content: {}", lineNumber, line); + continue; + } + + String name = arr[0].trim(); + String category = arr[1].trim(); + String storage = arr[2].trim(); + int expiry = Integer.parseInt(arr[3].trim()); // 데이터 오류 시 여기서 예외 발생 가능 + + Ingredient ingredient = Ingredient.builder() + .name(name) + .category(category) + .storageType(storage) + .avgExpiryDays(expiry) + .build(); + + list.add(ingredient); + + } catch (NumberFormatException e) { + // 특정 라인이 숫자가 아니어도, 로그만 남기고 다음 라인으로 계속 진행 + log.error("Skipping line {}: Failed to parse expiry days (not a number). Content: {}", lineNumber, line); + } catch (Exception e) { + // 기타 예외 처리 + log.error("Skipping line {}: An unexpected error occurred. Content: {}", lineNumber, line, e); + } + } + } + + ingredientRepository.saveAll(list); + log.info("식재료 데이터 저장 완료 (총 {}개)", list.size()); + } + } +} \ No newline at end of file diff --git a/src/main/resources/static/ingredients_clean.csv b/src/main/resources/static/ingredients_clean.csv new file mode 100644 index 0000000..f9b5795 --- /dev/null +++ b/src/main/resources/static/ingredients_clean.csv @@ -0,0 +1,274 @@ +닭고기,육류,냉장,3 +닭가슴살,육류,냉장,3 +닭다리,육류,냉장,3 +닭날개,육류,냉장,3 +닭안심,육류,냉장,3 +닭똥집(근위),육류,냉장,2 +돼지고기(불고기),육류,냉장,3 +돼지고기(찌개),육류,냉장,3 +돼지고기(다짐육),육류,냉장,2 +삼겹살,육류,냉장,3 +목살,육류,냉장,3 +갈비(돼지),육류,냉장,3 +족발(조리),가공육,냉장,2 +보쌈(조리),가공육,냉장,2 +곱창(돼지),육류,냉장,2 +막창(돼지),육류,냉장,2 +소고기(국거리),육류,냉장,5 +소고기(구이),육류,냉장,5 +소고기(다짐육),육류,냉장,2 +갈비(소),육류,냉장,3 +차돌박이,육류,냉장,2 +안심(소),육류,냉장,4 +등심(소),육류,냉장,4 +곱창(소),육류,냉장,2 +오리고기,육류,냉장,2 +훈제오리,가공육,냉장,10 +양고기,육류,냉장,2 +계란,난류,냉장,45 +메추리알,난류,냉장,30 +햄,가공육,냉장,14 +소시지,가공육,냉장,10 +베이컨,가공육,냉장,7 +스팸,가공육,실온,1095 +런천미트,가공육,실온,1095 +고등어,수산물,냉장,2 +갈치,수산물,냉장,2 +조기,수산물,냉장,2 +삼치,수산물,냉장,2 +연어,수산물,냉장,2 +꽁치,수산물,냉장,2 +장어,수산물,냉장,2 +아귀,수산물,냉장,2 +문어,수산물,냉장,3 +낙지,수산물,냉장,2 +주꾸미,수산물,냉장,2 +오징어,수산물,냉장,2 +멍게,수산물,냉장,2 +해삼,수산물,냉장,2 +새우,수산물,냉장,2 +새우(냉동),수산물,냉동,180 +꽃게,수산물,냉장,2 +꽃게(냉동),수산물,냉동,180 +굴,수산물,냉장,2 +바지락,수산물,냉장,2 +꼬막,수산물,냉장,2 +홍합,수산물,냉장,2 +전복,수산물,냉장,3 +관자,수산물,냉장,3 +어묵,가공수산물,냉장,10 +맛살,가공수산물,냉장,17 +멸치,건어물,실온,365 +미역(건),건어물,실온,365 +다시마(건),건어물,실온,365 +김(조미김),건어물,실온,180 +김(날김),건어물,실온,365 +북어채,건어물,실온,180 +오징어(건),건어물,실온,180 +황태,건어물,실온,365 +참치캔,가공수산물,실온,1825 +꽁치캔,가공수산물,실온,1825 +골뱅이캔,가공수산물,실온,1825 +새우젓,젓갈,냉장,180 +멸치액젓,젓갈,실온,730 +까나리액젓,젓갈,실온,730 +명란젓,젓갈,냉장,10 +창란젓,젓갈,냉장,10 +오징어젓,젓갈,냉장,10 +날치알,젓갈,냉동,180 +대파,채소,냉장,7 +쪽파,채소,냉장,7 +실파,채소,냉장,7 +부추,채소,냉장,5 +양배추,채소,냉장,10 +배추,채소,냉장,10 +배추(알배기),채소,냉장,10 +상추,채소,냉장,5 +깻잎,채소,냉장,5 +시금치,채소,냉장,5 +콩나물,채소,냉장,4 +숙주나물,채소,냉장,4 +청경채,채소,냉장,5 +미나리,채소,냉장,5 +양상추,채소,냉장,7 +샐러리,채소,냉장,10 +로메인,채소,냉장,7 +케일,채소,냉장,7 +쑥갓,채소,냉장,5 +돌나물,채소,냉장,4 +쑥,채소,냉장,4 +고춧잎,채소,냉장,5 +열무,채소,냉장,7 +아스파라거스,채소,냉장,7 +샐러드채소(믹스),채소,냉장,3 +양파,채소,실온,14 +마늘,채소,냉장,14 +다진마늘,채소,냉장,10 +감자,채소,실온,10 +고구마,채소,실온,14 +당근,채소,냉장,14 +애호박,채소,냉장,7 +쥬키니,채소,냉장,7 +단호박,채소,실온,30 +고추(청양),채소,냉장,7 +고추(일반),채소,냉장,7 +고추(꽈리),채소,냉장,7 +무,채소,냉장,10 +깍두기무,채소,냉장,10 +총각무,채소,냉장,10 +오이,채소,냉장,7 +가지,채소,냉장,7 +생강,채소,냉장,14 +연근,채소,냉장,7 +우엉,채소,냉장,7 +더덕,채소,냉장,14 +도라지,채소,냉장,14 +비트,채소,냉장,10 +마(장마),채소,냉장,14 +파프리카,채소,냉장,10 +피망,채소,냉장,10 +토마토,채소,냉장,7 +방울토마토,채소,냉장,7 +브로콜리,채소,냉장,7 +콜리플라워,채소,냉장,7 +옥수수,채소,냉장,3 +아보카도,채소,실온,5 +새송이버섯,버섯,냉장,7 +느타리버섯,버섯,냉장,7 +팽이버섯,버섯,냉장,7 +표고버섯(생),버섯,냉장,7 +표고버섯(건),버섯,실온,365 +양송이버섯,버섯,냉장,7 +목이버섯(건),버섯,실온,365 +우유,유제품,냉장,7 +치즈(슬라이스),유제품,냉장,30 +모짜렐라치즈,유제품,냉장,30 +피자치즈,유제품,냉장,30 +파마산치즈,유제품,냉장,180 +크림치즈,유제품,냉장,21 +체다치즈,유제품,냉장,60 +요거트,유제품,냉장,14 +그릭요거트,유제품,냉장,14 +생크림,유제품,냉장,5 +버터,유제품,냉장,90 +마가린,유제품,냉장,90 +두부,두부류,냉장,10 +순두부,두부류,냉장,10 +연두부,두부류,냉장,10 +두부면,두부류,냉장,14 +유부,두부류,냉장,14 +낫토,콩가공품,냉장,7 +두유,콩가공품,실온,180 +콩(서리태),콩,실온,365 +콩(백태),콩,실온,365 +팥,콩,실온,365 +녹두,콩,실온,365 +김치,김치류,냉장,180 +단무지,절임류,냉장,30 +피클,절임류,냉장,30 +식빵,빵류,실온,5 +떡(떡볶이),기타,냉장,5 +떡(떡국),기타,냉장,5 +만두(냉동),가공식품,냉동,270 +묵(도토리),기타,냉장,7 +곤약,기타,냉장,30 +사과,과일,냉장,21 +바나나,과일,실온,7 +딸기,과일,냉장,3 +포도,과일,냉장,7 +귤,과일,실온,14 +배,과일,냉장,14 +오렌지,과일,냉장,14 +자몽,과일,냉장,14 +레몬,과일,냉장,14 +라임,과일,냉장,14 +키위,과일,냉장,14 +파인애플,과일,실온,5 +복숭아,과일,실온,5 +자두,과일,냉장,7 +수박,과일,냉장,5 +멜론,과일,냉장,5 +감(단감),과일,실온,7 +감(홍시),과일,냉장,5 +참외,과일,냉장,7 +무화과,과일,냉장,3 +석류,과일,냉장,14 +블루베리,과일,냉장,7 +체리,과일,냉장,7 +망고,과일,실온,5 +식용유,조미료,실온,730 +올리브유,조미료,실온,730 +간장,조미료,실온,730 +고추장,조미료,냉장,730 +된장,조미료,냉장,730 +쌈장,조미료,냉장,180 +춘장,조미료,냉장,730 +참기름,조미료,실온,365 +들기름,조미료,냉장,180 +케첩,조미료,냉장,180 +마요네즈,조미료,냉장,90 +머스타드,조미료,냉장,180 +굴소스,조미료,냉장,365 +돈까스소스,조미료,냉장,365 +칠리소스,조미료,냉장,365 +스리라차,조미료,냉장,730 +핫소스,조미료,냉장,730 +식초,조미료,실온,9999 +발사믹식초,조미료,실온,9999 +물엿,조미료,실온,9999 +올리고당,조미료,실온,9999 +미림(맛술),조미료,실온,730 +쯔유,조미료,냉장,365 +겨자,조미료,냉장,180 +와사비,조미료,냉장,180 +혼다시,조미료,실온,365 +치킨스톡,조미료,실온,365 +미원,조미료,실온,9999 +꿀,조미료,실온,9999 +소금,조미료,실온,9999 +설탕,조미료,실온,9999 +흑설탕,조미료,실온,9999 +맛소금,조미료,실온,9999 +천일염,조미료,실온,9999 +고춧가루,조미료,냉장,365 +후추,조미료,실온,730 +깨,조미료,실온,365 +월계수잎,향신료,실온,365 +파슬리(건),향신료,실온,365 +바질(건),향신료,실온,365 +정향(건),향신료,실온,365 +팔각(건),향신료,실온,365 +쌀,곡류,실온,365 +현미,곡류,실온,365 +찹쌀,곡류,실온,365 +보리,곡류,실온,365 +흑미,곡류,실온,365 +율무,곡류,실온,365 +콩(렌틸),콩,실온,365 +콩(병아리),콩,실온,365 +밀가루,곡류,실온,365 +부침가루,곡류,실온,365 +튀김가루,곡류,실온,365 +빵가루,곡류,실온,365 +국수(소면),곡류,실온,730 +당면,곡류,실온,730 +스파게티면,곡류,실온,730 +파스타면(푸실리),곡류,실온,730 +파스타면(펜네),곡류,실온,730 +우동면(생),곡류,냉장,14 +쌀국수(면),곡류,실온,730 +쫄면(면),곡류,냉장,30 +냉면(면),곡류,냉장,30 +라면,가공식품,실온,180 +햇반,가공식품,실온,270 +시리얼,가공식품,실온,180 +누룽지,곡류,실온,365 +카레(가루),가공식품,실온,365 +짜장(가루),가공식품,실온,365 +잼,가공식품,냉장,180 +땅콩버터,가공식품,실온,180 +아몬드,견과,실온,180 +호두,견과,실온,180 +땅콩,견과,실온,180 +잣,견과,냉동,365 +해바라기씨,견과,실온,180 From 1d9b5a1d9fc8c35d927f9e632d19fc5ed8e175e1 Mon Sep 17 00:00:00 2001 From: bu2000 Date: Mon, 17 Nov 2025 17:21:11 +0900 Subject: [PATCH 2/7] update database and make logic used to reister ingredients --- .../controller/UserFridgeController.java | 39 +++++++++++ .../dto/ingredient/IngredientRequest.java | 16 +++++ .../dto/ingredient/IngredientResponse.java | 21 ++++++ .../dto/user/UserSignUpResponse.java | 5 +- .../dto/userfridge/UserFridgeRequest.java | 17 +++++ .../dto/userfridge/UserFridgeResponse.java | 21 ++++++ .../algorithmchef/model/Fridge.java | 45 ++++++++++++ ...{UserFridge.java => FridgeIngredient.java} | 27 +++---- .../algorithmchef/model/Ingredient.java | 2 +- .../webservice/algorithmchef/model/User.java | 2 +- .../FridgeIngredientRepository.java | 9 +++ .../repository/FridgeRepository.java | 12 ++++ .../repository/IngredientRepository.java | 3 + .../algorithmchef/service/AuthService.java | 12 +++- .../service/UserFridgeService.java | 70 +++++++++++++++++++ .../algorithmchef/service/UserService.java | 1 + 16 files changed, 282 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientRequest.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientResponse.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeRequest.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeResponse.java create mode 100644 src/main/java/com/webservice/algorithmchef/model/Fridge.java rename src/main/java/com/webservice/algorithmchef/model/{UserFridge.java => FridgeIngredient.java} (71%) create mode 100644 src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java create mode 100644 src/main/java/com/webservice/algorithmchef/repository/FridgeRepository.java create mode 100644 src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java diff --git a/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java new file mode 100644 index 0000000..2298e94 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java @@ -0,0 +1,39 @@ +package com.webservice.algorithmchef.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.webservice.algorithmchef.dto.userfridge.UserFridgeRequest; +import com.webservice.algorithmchef.dto.userfridge.UserFridgeResponse; +import com.webservice.algorithmchef.service.UserFridgeService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/fridge") +public class UserFridgeController { + + private final UserFridgeService userFridgeService; + + @PostMapping("/ingredient/register/manual") + public ResponseEntity registerIngredients(@RequestBody UserFridgeRequest fridgeRequest, + @AuthenticationPrincipal UserDetails userDetails){ + try { + String userId = userDetails.getUsername(); + UserFridgeResponse response = userFridgeService.addIngredients(userId, fridgeRequest); + return ResponseEntity.status(HttpStatus.CREATED).body(response); + }catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientRequest.java b/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientRequest.java new file mode 100644 index 0000000..8d3e647 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientRequest.java @@ -0,0 +1,16 @@ +package com.webservice.algorithmchef.dto.ingredient; + +import java.time.LocalDateTime; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class IngredientRequest { + + public String name; + public LocalDateTime purchaseDate; +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientResponse.java b/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientResponse.java new file mode 100644 index 0000000..732acb2 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientResponse.java @@ -0,0 +1,21 @@ +package com.webservice.algorithmchef.dto.ingredient; + +import java.time.LocalDateTime; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class IngredientResponse { + + private Long id; + private String category; + private String name; + private LocalDateTime purchaseDate; + private LocalDateTime expiredDate; +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/user/UserSignUpResponse.java b/src/main/java/com/webservice/algorithmchef/dto/user/UserSignUpResponse.java index f28bb07..12df309 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/user/UserSignUpResponse.java +++ b/src/main/java/com/webservice/algorithmchef/dto/user/UserSignUpResponse.java @@ -1,5 +1,6 @@ package com.webservice.algorithmchef.dto.user; +import com.webservice.algorithmchef.model.Fridge; import com.webservice.algorithmchef.model.User; import lombok.Getter; @@ -10,11 +11,13 @@ public class UserSignUpResponse { private Long id; private String userId; private String role; + private String fridgeName; - public UserSignUpResponse(User user) { + public UserSignUpResponse(User user, Fridge fridge) { this.id = user.getId(); this.userId = user.getUserId(); this.role=user.getRole(); + this.fridgeName = fridge.getName(); } } diff --git a/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeRequest.java b/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeRequest.java new file mode 100644 index 0000000..250d897 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeRequest.java @@ -0,0 +1,17 @@ +package com.webservice.algorithmchef.dto.userfridge; + +import java.util.List; + +import com.webservice.algorithmchef.dto.ingredient.IngredientRequest; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class UserFridgeRequest { + + private List ingredients; +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeResponse.java b/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeResponse.java new file mode 100644 index 0000000..ee144dd --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeResponse.java @@ -0,0 +1,21 @@ +package com.webservice.algorithmchef.dto.userfridge; + +import java.util.List; + +import com.webservice.algorithmchef.dto.ingredient.IngredientResponse; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class UserFridgeResponse { + + private Long fridgeId; + private List ingredients; + +} diff --git a/src/main/java/com/webservice/algorithmchef/model/Fridge.java b/src/main/java/com/webservice/algorithmchef/model/Fridge.java new file mode 100644 index 0000000..6c5d405 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/model/Fridge.java @@ -0,0 +1,45 @@ +package com.webservice.algorithmchef.model; + +import java.util.List; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Getter +@Setter +@ToString +public class Fridge { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="fridge_id") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @Column(nullable = false, columnDefinition = "varchar(255) default '나의 냉장고'") + private String name; + + @OneToMany(mappedBy = "fridge",cascade = CascadeType.ALL, orphanRemoval=true) + private List ingredients; +} diff --git a/src/main/java/com/webservice/algorithmchef/model/UserFridge.java b/src/main/java/com/webservice/algorithmchef/model/FridgeIngredient.java similarity index 71% rename from src/main/java/com/webservice/algorithmchef/model/UserFridge.java rename to src/main/java/com/webservice/algorithmchef/model/FridgeIngredient.java index db1b199..e6c2373 100644 --- a/src/main/java/com/webservice/algorithmchef/model/UserFridge.java +++ b/src/main/java/com/webservice/algorithmchef/model/FridgeIngredient.java @@ -2,8 +2,6 @@ import java.time.LocalDateTime; -import org.hibernate.annotations.CreationTimestamp; - import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -20,30 +18,27 @@ import lombok.ToString; @Entity +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor @Builder -@Getter -@Setter @ToString -public class UserFridge { +public class FridgeIngredient { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name="fridge_id") + @Column(name="fridge_ingredient_id") private Long id; - @CreationTimestamp - private LocalDateTime purchaseDate; - - @Column(nullable = false) - private LocalDateTime expiryDate; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; + @JoinColumn(name="fridge_id") + private Fridge fridge; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "ingredient_id") - private Ingredient ingredient; + @JoinColumn(name = "ingredient_id") + private Ingredient ingredient; + + @Column(nullable = false) + private LocalDateTime purchaseDate; } diff --git a/src/main/java/com/webservice/algorithmchef/model/Ingredient.java b/src/main/java/com/webservice/algorithmchef/model/Ingredient.java index b535598..d4a6264 100644 --- a/src/main/java/com/webservice/algorithmchef/model/Ingredient.java +++ b/src/main/java/com/webservice/algorithmchef/model/Ingredient.java @@ -44,7 +44,7 @@ public class Ingredient { @OneToMany(mappedBy = "ingredient",orphanRemoval = true,cascade = CascadeType.ALL) - private List userFridges; + private List ingredients; @OneToMany(mappedBy = "ingredient",orphanRemoval = true,cascade = CascadeType.ALL) private List recipeIngredients; diff --git a/src/main/java/com/webservice/algorithmchef/model/User.java b/src/main/java/com/webservice/algorithmchef/model/User.java index b7d5c1a..6d4ae60 100644 --- a/src/main/java/com/webservice/algorithmchef/model/User.java +++ b/src/main/java/com/webservice/algorithmchef/model/User.java @@ -79,7 +79,7 @@ public class User implements UserDetails { @OneToMany(mappedBy="user",cascade = CascadeType.ALL,orphanRemoval = true) @ToString.Exclude - private List userFridge; + private List userFridge; @Override public Collection getAuthorities() { diff --git a/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java b/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java new file mode 100644 index 0000000..a82a6f8 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java @@ -0,0 +1,9 @@ +package com.webservice.algorithmchef.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.webservice.algorithmchef.model.FridgeIngredient; + +public interface FridgeIngredientRepository extends JpaRepository { + +} diff --git a/src/main/java/com/webservice/algorithmchef/repository/FridgeRepository.java b/src/main/java/com/webservice/algorithmchef/repository/FridgeRepository.java new file mode 100644 index 0000000..a6c8058 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/repository/FridgeRepository.java @@ -0,0 +1,12 @@ +package com.webservice.algorithmchef.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.webservice.algorithmchef.model.Fridge; + +public interface FridgeRepository extends JpaRepository { + + Optional findByNameAndUser_UserId(String name, String userId); +} diff --git a/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java b/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java index d91c951..5657ebe 100644 --- a/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java +++ b/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java @@ -1,9 +1,12 @@ package com.webservice.algorithmchef.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import com.webservice.algorithmchef.model.Ingredient; public interface IngredientRepository extends JpaRepository { + Optional findByName(String name); } diff --git a/src/main/java/com/webservice/algorithmchef/service/AuthService.java b/src/main/java/com/webservice/algorithmchef/service/AuthService.java index de64c86..5d76d44 100644 --- a/src/main/java/com/webservice/algorithmchef/service/AuthService.java +++ b/src/main/java/com/webservice/algorithmchef/service/AuthService.java @@ -16,7 +16,9 @@ import com.webservice.algorithmchef.dto.user.UserLoginResponse; import com.webservice.algorithmchef.dto.user.UserSignUpRequest; import com.webservice.algorithmchef.dto.user.UserSignUpResponse; +import com.webservice.algorithmchef.model.Fridge; import com.webservice.algorithmchef.model.User; +import com.webservice.algorithmchef.repository.FridgeRepository; import com.webservice.algorithmchef.repository.UserRepository; import com.webservice.algorithmchef.util.JwtUtil; @@ -30,6 +32,7 @@ public class AuthService { private final PasswordEncoder passwordEncoder; private final JwtUtil jwtUtil; private final EmailService emailService; + private final FridgeRepository fRepository; public UserSignUpResponse signUp(UserSignUpRequest userSignUpRequest) { String userId = userSignUpRequest.getUserId(); @@ -47,7 +50,14 @@ public UserSignUpResponse signUp(UserSignUpRequest userSignUpRequest) { .role("ROLE_USER") .build(); User newUser = userRepository.save(user); - return new UserSignUpResponse(newUser); + + Fridge fridge = Fridge.builder() + .user(newUser) + .name("나의 냉장고") + .build(); + fRepository.save(fridge); + + return new UserSignUpResponse(newUser,fridge); } public UserLoginResponse login(UserLoginRequest userLoginRequest) { diff --git a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java new file mode 100644 index 0000000..00ab75b --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java @@ -0,0 +1,70 @@ +package com.webservice.algorithmchef.service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.webservice.algorithmchef.dto.ingredient.IngredientRequest; +import com.webservice.algorithmchef.dto.ingredient.IngredientResponse; +import com.webservice.algorithmchef.dto.userfridge.UserFridgeRequest; +import com.webservice.algorithmchef.dto.userfridge.UserFridgeResponse; +import com.webservice.algorithmchef.model.Fridge; +import com.webservice.algorithmchef.model.FridgeIngredient; +import com.webservice.algorithmchef.model.Ingredient; +import com.webservice.algorithmchef.repository.FridgeIngredientRepository; +import com.webservice.algorithmchef.repository.FridgeRepository; +import com.webservice.algorithmchef.repository.IngredientRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class UserFridgeService { + + private final IngredientRepository ingredientRepository; + private final FridgeIngredientRepository fIngredientRepository; + private final FridgeRepository fRepository; + + public UserFridgeResponse addIngredients(String userId,UserFridgeRequest userFridgeRequest) { + + Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) + .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + + List newFridgeIngredients = new ArrayList<>(); + List ingredients = userFridgeRequest.getIngredients(); + ingredients.forEach(ingredient -> { + Ingredient newIngredient = ingredientRepository.findByName(ingredient.getName()) + .orElseThrow(()-> new IllegalArgumentException("해당하는 식자재가 없습니다.")); + + FridgeIngredient fridgeIngredient = FridgeIngredient.builder() + .fridge(fridge) + .ingredient(newIngredient) + .purchaseDate(ingredient.getPurchaseDate()) + .build(); + newFridgeIngredients.add(fridgeIngredient); + }); + + List savedIngredients = fIngredientRepository.saveAll(newFridgeIngredients); + List responseIngredients = savedIngredients.stream(). + map(fi ->{ + LocalDateTime expiredDate = fi.getPurchaseDate() + .plusDays(fi.getIngredient().getAvgExpiryDays()); + return new IngredientResponse( + fi.getId(), + fi.getIngredient().getCategory(), + fi.getIngredient().getName(), + fi.getPurchaseDate(), + expiredDate + ); + + }).toList(); + + return new UserFridgeResponse( + fridge.getId(), + responseIngredients + ); + } + +} diff --git a/src/main/java/com/webservice/algorithmchef/service/UserService.java b/src/main/java/com/webservice/algorithmchef/service/UserService.java index ba73adb..e4f8f10 100644 --- a/src/main/java/com/webservice/algorithmchef/service/UserService.java +++ b/src/main/java/com/webservice/algorithmchef/service/UserService.java @@ -51,6 +51,7 @@ public MessageResponse makeOrUpdateSurvey(SurveyRequest sRequest,String userId) if(user.getUserHealthGoals() != null) { user.getUserHealthGoals().clear(); } + List newHealthGoals = healthGoalIds.stream().map(id ->{ HealthGoal goal = healthGoalRepository.findById(id) .orElseThrow(()-> new IllegalArgumentException("해당하는 아이디로 건강 목표를 찾을 수 없습니다.")); From 112894b8cdd26ea5acb289e9700d80e77f562691 Mon Sep 17 00:00:00 2001 From: bu2000 Date: Mon, 17 Nov 2025 20:50:55 +0900 Subject: [PATCH 3/7] complete logic calling ingredients --- .../controller/IngredientController.java | 42 ++++++++++++++++++ .../controller/UserFridgeController.java | 2 - .../FridgeIngredientRequest.java} | 4 +- .../FridgeIngredientResponse.java | 21 +++++++++ .../dto/ingredient/IngredientResponse.java | 17 ++++--- .../dto/userfridge/UserFridgeRequest.java | 4 +- .../dto/userfridge/UserFridgeResponse.java | 4 +- .../repository/IngredientRepository.java | 5 +++ .../service/IngredientService.java | 44 +++++++++++++++++++ .../service/UserFridgeService.java | 10 ++--- 10 files changed, 133 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/webservice/algorithmchef/controller/IngredientController.java rename src/main/java/com/webservice/algorithmchef/dto/{ingredient/IngredientRequest.java => fridgeingredient/FridgeIngredientRequest.java} (67%) create mode 100644 src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java create mode 100644 src/main/java/com/webservice/algorithmchef/service/IngredientService.java diff --git a/src/main/java/com/webservice/algorithmchef/controller/IngredientController.java b/src/main/java/com/webservice/algorithmchef/controller/IngredientController.java new file mode 100644 index 0000000..643895b --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/controller/IngredientController.java @@ -0,0 +1,42 @@ +package com.webservice.algorithmchef.controller; + +import org.springframework.data.domain.Page; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.webservice.algorithmchef.dto.ingredient.IngredientResponse; +import com.webservice.algorithmchef.service.IngredientService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class IngredientController { + + private final IngredientService ingredientService; + + @GetMapping("/ingredients") + public ResponseEntity retrieveAll(@RequestParam(value="page",defaultValue = "0") int page, + @RequestParam(value="size",defaultValue = "10") int size, + @RequestParam(value="name",required = false)String name, + @RequestParam(value="category",required = false)String category){ + try { + Page response = null; + if(category != null) { + response = ingredientService.filterByCategory(category,page, size); + }else if(name != null) { + response = ingredientService.filterByName(name, page, size); + }else { + response = ingredientService.retrieveAll(page, size); + } + return ResponseEntity.ok(response); + }catch(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + + } + +} diff --git a/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java index 2298e94..21ea676 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java @@ -1,11 +1,9 @@ package com.webservice.algorithmchef.controller; import org.springframework.http.HttpStatus; -import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientRequest.java b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientRequest.java similarity index 67% rename from src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientRequest.java rename to src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientRequest.java index 8d3e647..95abc4e 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientRequest.java +++ b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientRequest.java @@ -1,4 +1,4 @@ -package com.webservice.algorithmchef.dto.ingredient; +package com.webservice.algorithmchef.dto.fridgeingredient; import java.time.LocalDateTime; @@ -9,7 +9,7 @@ @Getter @Setter @NoArgsConstructor -public class IngredientRequest { +public class FridgeIngredientRequest { public String name; public LocalDateTime purchaseDate; diff --git a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java new file mode 100644 index 0000000..8b2f18f --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java @@ -0,0 +1,21 @@ +package com.webservice.algorithmchef.dto.fridgeingredient; + +import java.time.LocalDateTime; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class FridgeIngredientResponse { + + private Long id; + private String category; + private String name; + private LocalDateTime purchaseDate; + private LocalDateTime expiredDate; +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientResponse.java b/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientResponse.java index 732acb2..eb7f37c 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientResponse.java +++ b/src/main/java/com/webservice/algorithmchef/dto/ingredient/IngredientResponse.java @@ -1,8 +1,7 @@ package com.webservice.algorithmchef.dto.ingredient; -import java.time.LocalDateTime; +import com.webservice.algorithmchef.model.Ingredient; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -10,12 +9,16 @@ @Getter @Setter @NoArgsConstructor -@AllArgsConstructor public class IngredientResponse { - + private Long id; - private String category; private String name; - private LocalDateTime purchaseDate; - private LocalDateTime expiredDate; + private String category; + + public IngredientResponse(Ingredient ingredient) { + this.id = ingredient.getId(); + this.name = ingredient.getName(); + this.category = ingredient.getCategory(); + } + } diff --git a/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeRequest.java b/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeRequest.java index 250d897..4a725b0 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeRequest.java +++ b/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeRequest.java @@ -2,7 +2,7 @@ import java.util.List; -import com.webservice.algorithmchef.dto.ingredient.IngredientRequest; +import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientRequest; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,5 +13,5 @@ @NoArgsConstructor public class UserFridgeRequest { - private List ingredients; + private List ingredients; } diff --git a/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeResponse.java b/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeResponse.java index ee144dd..7d8c3a6 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeResponse.java +++ b/src/main/java/com/webservice/algorithmchef/dto/userfridge/UserFridgeResponse.java @@ -2,7 +2,7 @@ import java.util.List; -import com.webservice.algorithmchef.dto.ingredient.IngredientResponse; +import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientResponse; import lombok.AllArgsConstructor; import lombok.Getter; @@ -16,6 +16,6 @@ public class UserFridgeResponse { private Long fridgeId; - private List ingredients; + private List ingredients; } diff --git a/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java b/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java index 5657ebe..362cdad 100644 --- a/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java +++ b/src/main/java/com/webservice/algorithmchef/repository/IngredientRepository.java @@ -2,6 +2,8 @@ import java.util.Optional; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import com.webservice.algorithmchef.model.Ingredient; @@ -9,4 +11,7 @@ public interface IngredientRepository extends JpaRepository { Optional findByName(String name); + Page findAll(Pageable pageable); + Page findByNameContaining(String name,Pageable pageable); + Page findByCategory(String category,Pageable pageable); } diff --git a/src/main/java/com/webservice/algorithmchef/service/IngredientService.java b/src/main/java/com/webservice/algorithmchef/service/IngredientService.java new file mode 100644 index 0000000..02d545d --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/service/IngredientService.java @@ -0,0 +1,44 @@ +package com.webservice.algorithmchef.service; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import com.webservice.algorithmchef.dto.ingredient.IngredientResponse; +import com.webservice.algorithmchef.model.Ingredient; +import com.webservice.algorithmchef.repository.IngredientRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class IngredientService { + + private final IngredientRepository ingredientRepository; + + public Page retrieveAll(int page, int size) { + Pageable pageable = PageRequest.of(page, size); + Page ingredients = ingredientRepository.findAll(pageable); + Page ingredientResponses = ingredients. + map(IngredientResponse::new); + return ingredientResponses; + } + + public Page filterByName(String name,int page,int size){ + Pageable pageable = PageRequest.of(page, size); + Page filteredIngredients = ingredientRepository.findByNameContaining(name, pageable); + Page ingredientResponses = filteredIngredients. + map(IngredientResponse::new); + + return ingredientResponses; + } + + public Page filterByCategory(String category,int page,int size){ + Pageable pageable = PageRequest.of(page, size); + Page filteredIngredients = ingredientRepository.findByCategory(category, pageable); + Page ingredientResponses = filteredIngredients. + map(IngredientResponse::new); + return ingredientResponses; + } +} diff --git a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java index 00ab75b..7b766b7 100644 --- a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java +++ b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java @@ -6,8 +6,8 @@ import org.springframework.stereotype.Service; -import com.webservice.algorithmchef.dto.ingredient.IngredientRequest; -import com.webservice.algorithmchef.dto.ingredient.IngredientResponse; +import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientRequest; +import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientResponse; import com.webservice.algorithmchef.dto.userfridge.UserFridgeRequest; import com.webservice.algorithmchef.dto.userfridge.UserFridgeResponse; import com.webservice.algorithmchef.model.Fridge; @@ -33,7 +33,7 @@ public UserFridgeResponse addIngredients(String userId,UserFridgeRequest userFri .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); List newFridgeIngredients = new ArrayList<>(); - List ingredients = userFridgeRequest.getIngredients(); + List ingredients = userFridgeRequest.getIngredients(); ingredients.forEach(ingredient -> { Ingredient newIngredient = ingredientRepository.findByName(ingredient.getName()) .orElseThrow(()-> new IllegalArgumentException("해당하는 식자재가 없습니다.")); @@ -47,11 +47,11 @@ public UserFridgeResponse addIngredients(String userId,UserFridgeRequest userFri }); List savedIngredients = fIngredientRepository.saveAll(newFridgeIngredients); - List responseIngredients = savedIngredients.stream(). + List responseIngredients = savedIngredients.stream(). map(fi ->{ LocalDateTime expiredDate = fi.getPurchaseDate() .plusDays(fi.getIngredient().getAvgExpiryDays()); - return new IngredientResponse( + return new FridgeIngredientResponse( fi.getId(), fi.getIngredient().getCategory(), fi.getIngredient().getName(), From fe791dbe3cd418980a494785599c07de2977f65c Mon Sep 17 00:00:00 2001 From: bu2000 Date: Mon, 17 Nov 2025 22:29:36 +0900 Subject: [PATCH 4/7] complete logic calling users' fridge ingredients --- .../controller/IngredientController.java | 1 - .../controller/UserFridgeController.java | 27 ++++++++ .../FridgeIngredientResponse.java | 2 + .../userfridge/PageUserFridgeResponse.java | 19 ++++++ .../FridgeIngredientRepository.java | 6 ++ .../service/UserFridgeService.java | 68 ++++++++++++++++++- 6 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/webservice/algorithmchef/dto/userfridge/PageUserFridgeResponse.java diff --git a/src/main/java/com/webservice/algorithmchef/controller/IngredientController.java b/src/main/java/com/webservice/algorithmchef/controller/IngredientController.java index 643895b..a62fe69 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/IngredientController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/IngredientController.java @@ -3,7 +3,6 @@ import org.springframework.data.domain.Page; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java index 21ea676..4b16c9d 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java @@ -4,11 +4,14 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.webservice.algorithmchef.dto.userfridge.PageUserFridgeResponse; import com.webservice.algorithmchef.dto.userfridge.UserFridgeRequest; import com.webservice.algorithmchef.dto.userfridge.UserFridgeResponse; import com.webservice.algorithmchef.service.UserFridgeService; @@ -33,5 +36,29 @@ public ResponseEntity registerIngredients(@RequestBody UserFridgeRequest frid return ResponseEntity.badRequest().body(e.getMessage()); } } + + @GetMapping("/ingredients") + public ResponseEntity retrieve( + @RequestParam(value="category",required = false)String category, + @RequestParam(value="name",required = false)String name, + @RequestParam(value="page", defaultValue = "0")int page, + @RequestParam(value="size", defaultValue = "10")int size, + @AuthenticationPrincipal UserDetails userDetails){ + try { + String userId = userDetails.getUsername(); + PageUserFridgeResponse response = null; + if(category != null) { + response = userFridgeService.filteredByCategory(userId, category, size, page); + }else if(name != null) { + response = userFridgeService.filteredByName(userId, name, size, page); + }else { + response = userFridgeService.retrieveAll(userId, size, page); + } + return ResponseEntity.ok(response); + }catch(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + + } } diff --git a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java index 8b2f18f..56a2427 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java +++ b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java @@ -18,4 +18,6 @@ public class FridgeIngredientResponse { private String name; private LocalDateTime purchaseDate; private LocalDateTime expiredDate; + private Long day; } + \ No newline at end of file diff --git a/src/main/java/com/webservice/algorithmchef/dto/userfridge/PageUserFridgeResponse.java b/src/main/java/com/webservice/algorithmchef/dto/userfridge/PageUserFridgeResponse.java new file mode 100644 index 0000000..edcb455 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/userfridge/PageUserFridgeResponse.java @@ -0,0 +1,19 @@ +package com.webservice.algorithmchef.dto.userfridge; + +import org.springframework.data.domain.Page; + +import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientResponse; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class PageUserFridgeResponse { + private Long id; + private Page ingredients; +} diff --git a/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java b/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java index a82a6f8..bdfbeac 100644 --- a/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java +++ b/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java @@ -1,9 +1,15 @@ package com.webservice.algorithmchef.repository; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import com.webservice.algorithmchef.model.Fridge; import com.webservice.algorithmchef.model.FridgeIngredient; public interface FridgeIngredientRepository extends JpaRepository { + Page findByFridge(Fridge fridge,Pageable pageable); + Page findByFridgeAndIngredient_Name(Fridge fridge,String name,Pageable pageable); + Page findByFridgeAndIngredient_Category(Fridge fridge,String category,Pageable pageable); } diff --git a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java index 7b766b7..59331c6 100644 --- a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java +++ b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java @@ -1,13 +1,20 @@ package com.webservice.algorithmchef.service; +import java.time.Duration; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientRequest; import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientResponse; +import com.webservice.algorithmchef.dto.userfridge.PageUserFridgeResponse; import com.webservice.algorithmchef.dto.userfridge.UserFridgeRequest; import com.webservice.algorithmchef.dto.userfridge.UserFridgeResponse; import com.webservice.algorithmchef.model.Fridge; @@ -27,6 +34,7 @@ public class UserFridgeService { private final FridgeIngredientRepository fIngredientRepository; private final FridgeRepository fRepository; + @Transactional public UserFridgeResponse addIngredients(String userId,UserFridgeRequest userFridgeRequest) { Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) @@ -51,12 +59,15 @@ public UserFridgeResponse addIngredients(String userId,UserFridgeRequest userFri map(fi ->{ LocalDateTime expiredDate = fi.getPurchaseDate() .plusDays(fi.getIngredient().getAvgExpiryDays()); + Duration duration = Duration.between(LocalDateTime.now(),expiredDate); + long daysLeft = duration.toDays(); return new FridgeIngredientResponse( fi.getId(), fi.getIngredient().getCategory(), fi.getIngredient().getName(), fi.getPurchaseDate(), - expiredDate + expiredDate, + daysLeft ); }).toList(); @@ -66,5 +77,60 @@ public UserFridgeResponse addIngredients(String userId,UserFridgeRequest userFri responseIngredients ); } + + private Page convertEntityDto(Page ingredients) { + return ingredients.map( + fi ->{ + LocalDateTime expiredDate = fi.getPurchaseDate() + .plusDays(fi.getIngredient().getAvgExpiryDays()); + Duration duration = Duration.between(LocalDateTime.now(),expiredDate); + long daysLeft = duration.toDays(); + return new FridgeIngredientResponse( + fi.getId(), + fi.getIngredient().getCategory(), + fi.getIngredient().getName(), + fi.getPurchaseDate(), + expiredDate, + daysLeft + ); + } + ); + } + + public PageUserFridgeResponse retrieveAll(String userId,int size,int page){ + Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) + .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + Pageable pageable = PageRequest.of(page, size,Sort.by("purchaseDate").descending()); + Page ingredients = fIngredientRepository.findByFridge(fridge, pageable); + Page fridgeIngredients = convertEntityDto(ingredients); + return new PageUserFridgeResponse( + fridge.getId(), + fridgeIngredients + ); + } + + public PageUserFridgeResponse filteredByName(String userId,String name,int size,int page) { + Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) + .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + Pageable pageable = PageRequest.of(page, size,Sort.by("purchaseDate").descending()); + Page ingredients = fIngredientRepository.findByFridgeAndIngredient_Name(fridge, name, pageable); + Page fridgeIngredients = convertEntityDto(ingredients); + return new PageUserFridgeResponse( + fridge.getId(), + fridgeIngredients + ); + } + + public PageUserFridgeResponse filteredByCategory(String userId,String category,int size,int page) { + Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) + .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + Pageable pageable = PageRequest.of(page, size,Sort.by("purchaseDate").descending()); + Page ingredients = fIngredientRepository.findByFridgeAndIngredient_Category(fridge, category, pageable); + Page fridgeIngredients = convertEntityDto(ingredients); + return new PageUserFridgeResponse( + fridge.getId(), + fridgeIngredients + ); + } } From c930a8e39321c5e2f969a0a4990813d7dd79ac65 Mon Sep 17 00:00:00 2001 From: bu2000 Date: Tue, 18 Nov 2025 21:26:43 +0900 Subject: [PATCH 5/7] complete fridge_domain --- .../controller/UserFridgeController.java | 49 +++++++ .../FridgeIngredientResponse.java | 2 +- .../dto/user/ChangePasswordRequest.java | 1 + .../algorithmchef/model/FridgeIngredient.java | 4 + .../FridgeIngredientRepository.java | 5 +- .../service/UserFridgeService.java | 126 +++++++++++++++--- 6 files changed, 168 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java index 4b16c9d..29f9d4d 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java @@ -4,13 +4,19 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.webservice.algorithmchef.dto.fridgeingredient.ChangeFridgeIngredientRequest; +import com.webservice.algorithmchef.dto.fridgeingredient.ChangeFridgeIngredientResponse; +import com.webservice.algorithmchef.dto.userfridge.FridgeBatchUpdateRequest; import com.webservice.algorithmchef.dto.userfridge.PageUserFridgeResponse; import com.webservice.algorithmchef.dto.userfridge.UserFridgeRequest; import com.webservice.algorithmchef.dto.userfridge.UserFridgeResponse; @@ -60,5 +66,48 @@ public ResponseEntity retrieve( } } + + @PatchMapping("/ingredient/update") + public ResponseEntity updatePurchasedDate(@RequestBody ChangeFridgeIngredientRequest request, + @AuthenticationPrincipal UserDetails userDetails){ + try { + String userId = userDetails.getUsername(); + ChangeFridgeIngredientResponse response = userFridgeService.updatePurchasedDate(userId, request); + return ResponseEntity.ok(response); + }catch(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + + @DeleteMapping("/ingredient/{id}") + public ResponseEntity deleteIngredient( + @AuthenticationPrincipal UserDetails userDetails, + @PathVariable("id") Long fridgeIngredientId + ) { + try { + String userId = userDetails.getUsername(); + + userFridgeService.deleteIngredient(userId, fridgeIngredientId); + + return ResponseEntity.ok("삭제 완료"); + + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + + @PatchMapping("ingredients/register/update") + public ResponseEntity updateIngredientInformation(@RequestBody FridgeBatchUpdateRequest fRequest, + @AuthenticationPrincipal UserDetails userDetails){ + try { + String userId = userDetails.getUsername(); + UserFridgeResponse response = userFridgeService.updateIngredientInformation(userId, fRequest); + return ResponseEntity.ok(response); + + }catch(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + + } } diff --git a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java index 56a2427..8dad89a 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java +++ b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientResponse.java @@ -18,6 +18,6 @@ public class FridgeIngredientResponse { private String name; private LocalDateTime purchaseDate; private LocalDateTime expiredDate; - private Long day; + private Long dDay; } \ No newline at end of file diff --git a/src/main/java/com/webservice/algorithmchef/dto/user/ChangePasswordRequest.java b/src/main/java/com/webservice/algorithmchef/dto/user/ChangePasswordRequest.java index 5d7d190..2331ed9 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/user/ChangePasswordRequest.java +++ b/src/main/java/com/webservice/algorithmchef/dto/user/ChangePasswordRequest.java @@ -8,4 +8,5 @@ public class ChangePasswordRequest { private String password; + private Long id; } diff --git a/src/main/java/com/webservice/algorithmchef/model/FridgeIngredient.java b/src/main/java/com/webservice/algorithmchef/model/FridgeIngredient.java index e6c2373..860b8d7 100644 --- a/src/main/java/com/webservice/algorithmchef/model/FridgeIngredient.java +++ b/src/main/java/com/webservice/algorithmchef/model/FridgeIngredient.java @@ -41,4 +41,8 @@ public class FridgeIngredient { @Column(nullable = false) private LocalDateTime purchaseDate; + + @Column(nullable = false) + private LocalDateTime expiredDate; + } diff --git a/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java b/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java index bdfbeac..43d4faa 100644 --- a/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java +++ b/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java @@ -1,5 +1,7 @@ package com.webservice.algorithmchef.repository; +import java.util.Optional; + import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -10,6 +12,7 @@ public interface FridgeIngredientRepository extends JpaRepository { Page findByFridge(Fridge fridge,Pageable pageable); - Page findByFridgeAndIngredient_Name(Fridge fridge,String name,Pageable pageable); + Page findByFridgeAndIngredient_NameContaining(Fridge fridge,String name,Pageable pageable); Page findByFridgeAndIngredient_Category(Fridge fridge,String category,Pageable pageable); + Optional findByIdAndFridge(Long id, Fridge fridge); } diff --git a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java index 59331c6..40a2699 100644 --- a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java +++ b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java @@ -4,6 +4,8 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -12,8 +14,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.webservice.algorithmchef.dto.fridgeingredient.ChangeFridgeIngredientRequest; +import com.webservice.algorithmchef.dto.fridgeingredient.ChangeFridgeIngredientResponse; import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientRequest; import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientResponse; +import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientUpdateItem; +import com.webservice.algorithmchef.dto.userfridge.FridgeBatchUpdateRequest; import com.webservice.algorithmchef.dto.userfridge.PageUserFridgeResponse; import com.webservice.algorithmchef.dto.userfridge.UserFridgeRequest; import com.webservice.algorithmchef.dto.userfridge.UserFridgeResponse; @@ -42,19 +48,16 @@ public UserFridgeResponse addIngredients(String userId,UserFridgeRequest userFri List newFridgeIngredients = new ArrayList<>(); List ingredients = userFridgeRequest.getIngredients(); - ingredients.forEach(ingredient -> { - Ingredient newIngredient = ingredientRepository.findByName(ingredient.getName()) - .orElseThrow(()-> new IllegalArgumentException("해당하는 식자재가 없습니다.")); - - FridgeIngredient fridgeIngredient = FridgeIngredient.builder() - .fridge(fridge) - .ingredient(newIngredient) - .purchaseDate(ingredient.getPurchaseDate()) - .build(); - newFridgeIngredients.add(fridgeIngredient); - }); + List savedIngredients = saveFridgeIngredients(fridge, newFridgeIngredients, ingredients); + List responseIngredients = toResponseList(savedIngredients); - List savedIngredients = fIngredientRepository.saveAll(newFridgeIngredients); + return new UserFridgeResponse( + fridge.getId(), + responseIngredients + ); + } + + private List toResponseList(List savedIngredients) { List responseIngredients = savedIngredients.stream(). map(fi ->{ LocalDateTime expiredDate = fi.getPurchaseDate() @@ -71,11 +74,26 @@ public UserFridgeResponse addIngredients(String userId,UserFridgeRequest userFri ); }).toList(); + return responseIngredients; + } + + private List saveFridgeIngredients(Fridge fridge, List newFridgeIngredients, + List ingredients) { + ingredients.forEach(ingredient -> { + Ingredient newIngredient = ingredientRepository.findByName(ingredient.getName()) + .orElseThrow(()-> new IllegalArgumentException("해당하는 식자재가 없습니다.")); + + FridgeIngredient fridgeIngredient = FridgeIngredient.builder() + .fridge(fridge) + .ingredient(newIngredient) + .purchaseDate(ingredient.getPurchaseDate()) + .expiredDate(ingredient.getPurchaseDate().plusDays(newIngredient.getAvgExpiryDays())) + .build(); + newFridgeIngredients.add(fridgeIngredient); + }); - return new UserFridgeResponse( - fridge.getId(), - responseIngredients - ); + List savedIngredients = fIngredientRepository.saveAll(newFridgeIngredients); + return savedIngredients; } private Page convertEntityDto(Page ingredients) { @@ -113,7 +131,7 @@ public PageUserFridgeResponse filteredByName(String userId,String name,int size, Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); Pageable pageable = PageRequest.of(page, size,Sort.by("purchaseDate").descending()); - Page ingredients = fIngredientRepository.findByFridgeAndIngredient_Name(fridge, name, pageable); + Page ingredients = fIngredientRepository.findByFridgeAndIngredient_NameContaining(fridge, name, pageable); Page fridgeIngredients = convertEntityDto(ingredients); return new PageUserFridgeResponse( fridge.getId(), @@ -132,5 +150,79 @@ public PageUserFridgeResponse filteredByCategory(String userId,String category,i fridgeIngredients ); } + + @Transactional + public ChangeFridgeIngredientResponse updatePurchasedDate(String userId,ChangeFridgeIngredientRequest request) { + Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) + .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + FridgeIngredient fridgeIngredient = fIngredientRepository.findByIdAndFridge(request.getIngredientId(),fridge) + .orElseThrow(()-> new IllegalArgumentException("해당하는 아이디로 재료 찾을 수 없습니다.")); + fridgeIngredient.setPurchaseDate(request.getPurchasedDate()); + String message = "업데이트 완료"; + return new ChangeFridgeIngredientResponse(fridgeIngredient,message); + } + + @Transactional + public void deleteIngredient(String userId, Long fridgeIngredientId) { + + Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) + .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + + FridgeIngredient fridgeIngredient = fIngredientRepository + .findByIdAndFridge(fridgeIngredientId, fridge) + .orElseThrow(() -> new IllegalArgumentException("삭제 권한이 없거나 존재하지 않는 재료입니다.")); + + fIngredientRepository.delete(fridgeIngredient); + } + @Transactional + public UserFridgeResponse updateIngredientInformation(String userId, FridgeBatchUpdateRequest fRequest) { + + Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) + .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + + List requestItems = fRequest.getIngredients(); + + List ingredientIds = requestItems.stream() + .map(FridgeIngredientUpdateItem::getIngredientId) + .toList(); + + List masterIngredients = ingredientRepository.findAllById(ingredientIds); + + Map ingredientMap = masterIngredients.stream() + .collect(Collectors.toMap(Ingredient::getId, i -> i)); + + if (fridge.getIngredients() != null) { + fridge.getIngredients().clear(); + } + + List newFridgeIngredients = new ArrayList<>(); + + for (FridgeIngredientUpdateItem item : requestItems) { + Ingredient masterIngredient = ingredientMap.get(item.getIngredientId()); + + if (masterIngredient == null) { + throw new IllegalArgumentException("존재하지 않는 식재료 ID입니다: " + item.getIngredientId()); + } + + LocalDateTime expiredDate = item.getPurchaseDate() + .plusDays(masterIngredient.getAvgExpiryDays()); + + FridgeIngredient fridgeIngredient = FridgeIngredient.builder() + .fridge(fridge) + .ingredient(masterIngredient) + .purchaseDate(item.getPurchaseDate()) + .expiredDate(expiredDate) + .build(); + + newFridgeIngredients.add(fridgeIngredient); + } + + List savedIngredients = fIngredientRepository.saveAll(newFridgeIngredients); + + return new UserFridgeResponse( + fridge.getId(), + toResponseList(savedIngredients) + ); + } } From acf8b994f7828cb88ca4a6fd4a4494344698f70c Mon Sep 17 00:00:00 2001 From: bu2000 Date: Tue, 18 Nov 2025 22:30:28 +0900 Subject: [PATCH 6/7] update logic used to check and fix ingredients' information --- .../service/UserFridgeService.java | 253 +++++++++--------- 1 file changed, 124 insertions(+), 129 deletions(-) diff --git a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java index 40a2699..be31592 100644 --- a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java +++ b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java @@ -34,6 +34,7 @@ @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class UserFridgeService { private final IngredientRepository ingredientRepository; @@ -41,144 +42,40 @@ public class UserFridgeService { private final FridgeRepository fRepository; @Transactional - public UserFridgeResponse addIngredients(String userId,UserFridgeRequest userFridgeRequest) { + public UserFridgeResponse addIngredients(String userId, UserFridgeRequest userFridgeRequest) { - Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) - .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + Fridge fridge = findFridge(userId); List newFridgeIngredients = new ArrayList<>(); List ingredients = userFridgeRequest.getIngredients(); - List savedIngredients = saveFridgeIngredients(fridge, newFridgeIngredients, ingredients); - List responseIngredients = toResponseList(savedIngredients); - return new UserFridgeResponse( - fridge.getId(), - responseIngredients - ); - } - - private List toResponseList(List savedIngredients) { - List responseIngredients = savedIngredients.stream(). - map(fi ->{ - LocalDateTime expiredDate = fi.getPurchaseDate() - .plusDays(fi.getIngredient().getAvgExpiryDays()); - Duration duration = Duration.between(LocalDateTime.now(),expiredDate); - long daysLeft = duration.toDays(); - return new FridgeIngredientResponse( - fi.getId(), - fi.getIngredient().getCategory(), - fi.getIngredient().getName(), - fi.getPurchaseDate(), - expiredDate, - daysLeft - ); - - }).toList(); - return responseIngredients; - } - - private List saveFridgeIngredients(Fridge fridge, List newFridgeIngredients, - List ingredients) { - ingredients.forEach(ingredient -> { - Ingredient newIngredient = ingredientRepository.findByName(ingredient.getName()) - .orElseThrow(()-> new IllegalArgumentException("해당하는 식자재가 없습니다.")); + for (FridgeIngredientRequest req : ingredients) { + Ingredient masterIngredient = ingredientRepository.findByName(req.getName()) + .orElseThrow(() -> new IllegalArgumentException("해당하는 식자재가 없습니다: " + req.getName())); + LocalDateTime expiredDate = calculateExpireDate(req.getPurchaseDate(), masterIngredient.getAvgExpiryDays(), null); + FridgeIngredient fridgeIngredient = FridgeIngredient.builder() - .fridge(fridge) - .ingredient(newIngredient) - .purchaseDate(ingredient.getPurchaseDate()) - .expiredDate(ingredient.getPurchaseDate().plusDays(newIngredient.getAvgExpiryDays())) - .build(); + .fridge(fridge) + .ingredient(masterIngredient) + .purchaseDate(req.getPurchaseDate()) + .expiredDate(expiredDate) + .build(); newFridgeIngredients.add(fridgeIngredient); - }); + } List savedIngredients = fIngredientRepository.saveAll(newFridgeIngredients); - return savedIngredients; - } - - private Page convertEntityDto(Page ingredients) { - return ingredients.map( - fi ->{ - LocalDateTime expiredDate = fi.getPurchaseDate() - .plusDays(fi.getIngredient().getAvgExpiryDays()); - Duration duration = Duration.between(LocalDateTime.now(),expiredDate); - long daysLeft = duration.toDays(); - return new FridgeIngredientResponse( - fi.getId(), - fi.getIngredient().getCategory(), - fi.getIngredient().getName(), - fi.getPurchaseDate(), - expiredDate, - daysLeft - ); - } - ); - } - - public PageUserFridgeResponse retrieveAll(String userId,int size,int page){ - Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) - .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); - Pageable pageable = PageRequest.of(page, size,Sort.by("purchaseDate").descending()); - Page ingredients = fIngredientRepository.findByFridge(fridge, pageable); - Page fridgeIngredients = convertEntityDto(ingredients); - return new PageUserFridgeResponse( - fridge.getId(), - fridgeIngredients - ); - } - - public PageUserFridgeResponse filteredByName(String userId,String name,int size,int page) { - Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) - .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); - Pageable pageable = PageRequest.of(page, size,Sort.by("purchaseDate").descending()); - Page ingredients = fIngredientRepository.findByFridgeAndIngredient_NameContaining(fridge, name, pageable); - Page fridgeIngredients = convertEntityDto(ingredients); - return new PageUserFridgeResponse( - fridge.getId(), - fridgeIngredients - ); - } - - public PageUserFridgeResponse filteredByCategory(String userId,String category,int size,int page) { - Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) - .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); - Pageable pageable = PageRequest.of(page, size,Sort.by("purchaseDate").descending()); - Page ingredients = fIngredientRepository.findByFridgeAndIngredient_Category(fridge, category, pageable); - Page fridgeIngredients = convertEntityDto(ingredients); - return new PageUserFridgeResponse( - fridge.getId(), - fridgeIngredients - ); - } - - @Transactional - public ChangeFridgeIngredientResponse updatePurchasedDate(String userId,ChangeFridgeIngredientRequest request) { - Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) - .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); - FridgeIngredient fridgeIngredient = fIngredientRepository.findByIdAndFridge(request.getIngredientId(),fridge) - .orElseThrow(()-> new IllegalArgumentException("해당하는 아이디로 재료 찾을 수 없습니다.")); - fridgeIngredient.setPurchaseDate(request.getPurchasedDate()); - String message = "업데이트 완료"; - return new ChangeFridgeIngredientResponse(fridgeIngredient,message); - } - - @Transactional - public void deleteIngredient(String userId, Long fridgeIngredientId) { - - Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) - .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); - - FridgeIngredient fridgeIngredient = fIngredientRepository - .findByIdAndFridge(fridgeIngredientId, fridge) - .orElseThrow(() -> new IllegalArgumentException("삭제 권한이 없거나 존재하지 않는 재료입니다.")); - fIngredientRepository.delete(fridgeIngredient); + return new UserFridgeResponse( + fridge.getId(), + toResponseList(savedIngredients) + ); } + @Transactional public UserFridgeResponse updateIngredientInformation(String userId, FridgeBatchUpdateRequest fRequest) { - Fridge fridge = fRepository.findByNameAndUser_UserId("나의 냉장고", userId) - .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + Fridge fridge = findFridge(userId); List requestItems = fRequest.getIngredients(); @@ -186,9 +83,7 @@ public UserFridgeResponse updateIngredientInformation(String userId, FridgeBatch .map(FridgeIngredientUpdateItem::getIngredientId) .toList(); - List masterIngredients = ingredientRepository.findAllById(ingredientIds); - - Map ingredientMap = masterIngredients.stream() + Map ingredientMap = ingredientRepository.findAllById(ingredientIds).stream() .collect(Collectors.toMap(Ingredient::getId, i -> i)); if (fridge.getIngredients() != null) { @@ -204,8 +99,11 @@ public UserFridgeResponse updateIngredientInformation(String userId, FridgeBatch throw new IllegalArgumentException("존재하지 않는 식재료 ID입니다: " + item.getIngredientId()); } - LocalDateTime expiredDate = item.getPurchaseDate() - .plusDays(masterIngredient.getAvgExpiryDays()); + LocalDateTime expiredDate = calculateExpireDate( + item.getPurchaseDate(), + masterIngredient.getAvgExpiryDays(), + item.getExpiredDate() + ); FridgeIngredient fridgeIngredient = FridgeIngredient.builder() .fridge(fridge) @@ -224,5 +122,102 @@ public UserFridgeResponse updateIngredientInformation(String userId, FridgeBatch toResponseList(savedIngredients) ); } + + + public PageUserFridgeResponse retrieveAll(String userId, int size, int page){ + Fridge fridge = findFridge(userId); + Pageable pageable = PageRequest.of(page, size, Sort.by("purchaseDate").descending()); + + Page ingredients = fIngredientRepository.findByFridge(fridge, pageable); + + return new PageUserFridgeResponse( + fridge.getId(), + ingredients.map(this::toFridgeIngredientResponse) + ); + } + + public PageUserFridgeResponse filteredByName(String userId, String name, int size, int page) { + Fridge fridge = findFridge(userId); + Pageable pageable = PageRequest.of(page, size, Sort.by("purchaseDate").descending()); + + Page ingredients = fIngredientRepository.findByFridgeAndIngredient_NameContaining(fridge, name, pageable); + + return new PageUserFridgeResponse( + fridge.getId(), + ingredients.map(this::toFridgeIngredientResponse) + ); + } + + public PageUserFridgeResponse filteredByCategory(String userId, String category, int size, int page) { + Fridge fridge = findFridge(userId); + Pageable pageable = PageRequest.of(page, size, Sort.by("purchaseDate").descending()); + + Page ingredients = fIngredientRepository.findByFridgeAndIngredient_Category(fridge, category, pageable); + + return new PageUserFridgeResponse( + fridge.getId(), + ingredients.map(this::toFridgeIngredientResponse) + ); + } + + @Transactional + public ChangeFridgeIngredientResponse updatePurchasedDate(String userId, ChangeFridgeIngredientRequest request) { + Fridge fridge = findFridge(userId); + + FridgeIngredient fridgeIngredient = fIngredientRepository.findByIdAndFridge(request.getIngredientId(), fridge) + .orElseThrow(() -> new IllegalArgumentException("해당하는 아이디로 재료 찾을 수 없습니다.")); + + fridgeIngredient.setPurchaseDate(request.getPurchasedDate()); + + return new ChangeFridgeIngredientResponse(fridgeIngredient, "업데이트 완료"); + } + + @Transactional + public void deleteIngredient(String userId, Long fridgeIngredientId) { + Fridge fridge = findFridge(userId); + + FridgeIngredient fridgeIngredient = fIngredientRepository + .findByIdAndFridge(fridgeIngredientId, fridge) + .orElseThrow(() -> new IllegalArgumentException("삭제 권한이 없거나 존재하지 않는 재료입니다.")); + + fIngredientRepository.delete(fridgeIngredient); + } + + + private Fridge findFridge(String userId) { + return fRepository.findByNameAndUser_UserId("나의 냉장고", userId) + .orElseThrow(() -> new IllegalArgumentException("접근 권한이 없거나 존재하지 않는 냉장고입니다.")); + } + + private LocalDateTime calculateExpireDate(LocalDateTime purchaseDate, int avgDays, LocalDateTime userExpiredDate) { + if (userExpiredDate != null) { + return userExpiredDate; + } + return purchaseDate.plusDays(avgDays); + } -} + private List toResponseList(List ingredients) { + return ingredients.stream() + .map(this::toFridgeIngredientResponse) + .toList(); + } + + private FridgeIngredientResponse toFridgeIngredientResponse(FridgeIngredient fi) { + LocalDateTime expiredDate = fi.getExpiredDate(); + + long daysLeft = 0; + if (expiredDate != null) { + Duration duration = Duration.between(LocalDateTime.now(), expiredDate); + daysLeft = duration.toDays(); + } + + return new FridgeIngredientResponse( + fi.getId(), + fi.getIngredient().getCategory(), + fi.getIngredient().getName(), + fi.getPurchaseDate(), + expiredDate, + daysLeft + ); + } +} \ No newline at end of file From 083ff0f6b8d3ad8502040487add80a7fcf8db3df Mon Sep 17 00:00:00 2001 From: bu2000 Date: Tue, 18 Nov 2025 22:55:58 +0900 Subject: [PATCH 7/7] update fridgeingredient dto --- .../ChangeFridgeIngredientRequest.java | 14 +++++++++++++ .../ChangeFridgeIngredientResponse.java | 21 +++++++++++++++++++ .../FridgeIngredientUpdateItem.java | 19 +++++++++++++++++ .../userfridge/FridgeBatchUpdateRequest.java | 20 ++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientRequest.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientResponse.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientUpdateItem.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/userfridge/FridgeBatchUpdateRequest.java diff --git a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientRequest.java b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientRequest.java new file mode 100644 index 0000000..2e6272a --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientRequest.java @@ -0,0 +1,14 @@ +package com.webservice.algorithmchef.dto.fridgeingredient; + +import java.time.LocalDateTime; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class ChangeFridgeIngredientRequest { + + private Long ingredientId; + private LocalDateTime purchasedDate; +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientResponse.java b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientResponse.java new file mode 100644 index 0000000..45c55be --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientResponse.java @@ -0,0 +1,21 @@ +package com.webservice.algorithmchef.dto.fridgeingredient; + +import com.webservice.algorithmchef.model.FridgeIngredient; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class ChangeFridgeIngredientResponse { + + private Long ingredientId; + private String name; + private String message; + + public ChangeFridgeIngredientResponse(FridgeIngredient ingredient,String message) { + this.ingredientId = ingredient.getId(); + this.name = ingredient.getIngredient().getName(); + this.message = message; + } +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientUpdateItem.java b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientUpdateItem.java new file mode 100644 index 0000000..6ed7b27 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/FridgeIngredientUpdateItem.java @@ -0,0 +1,19 @@ +package com.webservice.algorithmchef.dto.fridgeingredient; + +import java.time.LocalDateTime; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class FridgeIngredientUpdateItem { + + private Long ingredientId; + private String category; + private String name; + private LocalDateTime purchaseDate; + private LocalDateTime expiredDate; +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/userfridge/FridgeBatchUpdateRequest.java b/src/main/java/com/webservice/algorithmchef/dto/userfridge/FridgeBatchUpdateRequest.java new file mode 100644 index 0000000..7aff569 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/userfridge/FridgeBatchUpdateRequest.java @@ -0,0 +1,20 @@ +package com.webservice.algorithmchef.dto.userfridge; + +import java.util.List; + +import com.webservice.algorithmchef.dto.fridgeingredient.FridgeIngredientUpdateItem; + +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class FridgeBatchUpdateRequest { + @Valid + private List ingredients; +}