From e47e259d4daa128860e35bf207eeb59b30b483ef Mon Sep 17 00:00:00 2001 From: bu2000 Date: Sun, 30 Nov 2025 02:17:30 +0900 Subject: [PATCH 1/2] some logic is changed for integration --- .../algorithmchef/config/GeminiConfig.java | 4 +- .../config/JwtAuthenticationFilter.java | 2 +- .../algorithmchef/config/SecurityConfig.java | 27 +++- .../algorithmchef/config/WebConfig.java | 18 +++ .../controller/AuthController.java | 1 - .../controller/GeminiRecipeController.java | 1 + .../controller/RecipeSearchController.java | 6 +- .../controller/SttController.java | 2 +- .../controller/UserFridgeController.java | 39 ++--- .../ChangeFridgeIngredientRequest.java | 1 + .../dto/gemini/GeminiRecipeRequest.java | 5 + .../dto/user/FindPasswordResponse.java | 3 + .../dto/user/UserLoginRequest.java | 4 + .../FridgeIngredientRepository.java | 10 +- .../repository/UserRepository.java | 4 + .../service/UserFridgeService.java | 149 +++++++++--------- .../algorithmchef/service/UserService.java | 4 +- 17 files changed, 165 insertions(+), 115 deletions(-) create mode 100644 src/main/java/com/webservice/algorithmchef/config/WebConfig.java diff --git a/src/main/java/com/webservice/algorithmchef/config/GeminiConfig.java b/src/main/java/com/webservice/algorithmchef/config/GeminiConfig.java index aac8e99..95b702d 100644 --- a/src/main/java/com/webservice/algorithmchef/config/GeminiConfig.java +++ b/src/main/java/com/webservice/algorithmchef/config/GeminiConfig.java @@ -1,10 +1,12 @@ package com.webservice.algorithmchef.config; -import com.google.genai.Client; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import com.google.genai.Client; + + @Configuration public class GeminiConfig { diff --git a/src/main/java/com/webservice/algorithmchef/config/JwtAuthenticationFilter.java b/src/main/java/com/webservice/algorithmchef/config/JwtAuthenticationFilter.java index 9f5b5d9..d692c9c 100644 --- a/src/main/java/com/webservice/algorithmchef/config/JwtAuthenticationFilter.java +++ b/src/main/java/com/webservice/algorithmchef/config/JwtAuthenticationFilter.java @@ -47,7 +47,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse // 1. JWT 헤더가 없거나 'Bearer'가 아닌 경우 if (authHeader == null || !authHeader.startsWith("Bearer ")) { - log.warn("Authorization 헤더가 없거나 Bearer 타입이 아님"); + log.debug("헤더에 토큰이 없어 비로그인 상태로 다음 필터 진행: {}", request.getRequestURI()); filterChain.doFilter(request, response); return; } diff --git a/src/main/java/com/webservice/algorithmchef/config/SecurityConfig.java b/src/main/java/com/webservice/algorithmchef/config/SecurityConfig.java index 40ae68f..4c0f943 100644 --- a/src/main/java/com/webservice/algorithmchef/config/SecurityConfig.java +++ b/src/main/java/com/webservice/algorithmchef/config/SecurityConfig.java @@ -1,15 +1,19 @@ package com.webservice.algorithmchef.config; +import java.util.List; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - - +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import lombok.RequiredArgsConstructor; @@ -24,6 +28,7 @@ public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http + .cors(org.springframework.security.config.Customizer.withDefaults()) .csrf(AbstractHttpConfigurer::disable) .httpBasic(AbstractHttpConfigurer::disable) .formLogin(AbstractHttpConfigurer::disable); @@ -36,6 +41,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .authorizeHttpRequests(authorize -> authorize .requestMatchers("/auth/login", "/auth/signUp", "/auth/findPassword", "/auth/findUserId").permitAll() + //.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll() .anyRequest().authenticated()); http @@ -43,5 +49,22 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti return http.build(); } + +// @Bean +// public CorsConfigurationSource corsConfigurationSource() { +// CorsConfiguration configuration = new CorsConfiguration(); +// +// // 1. 프론트엔드 포트 확인! (5173인지 3000인지 본인 환경에 맞춰주세요) +// // 둘 다 넣어두면 안전합니다. +// configuration.setAllowedOrigins(List.of("http://localhost:5173")); +// +// configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")); +// configuration.setAllowedHeaders(List.of("*")); +// configuration.setAllowCredentials(true); +// +// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); +// source.registerCorsConfiguration("/**", configuration); +// return source; +// } } diff --git a/src/main/java/com/webservice/algorithmchef/config/WebConfig.java b/src/main/java/com/webservice/algorithmchef/config/WebConfig.java new file mode 100644 index 0000000..ec064c6 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/config/WebConfig.java @@ -0,0 +1,18 @@ +package com.webservice.algorithmchef.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("http://localhost:5173") + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"); + //.allowCredentials(true); + } + +} diff --git a/src/main/java/com/webservice/algorithmchef/controller/AuthController.java b/src/main/java/com/webservice/algorithmchef/controller/AuthController.java index 9981442..ea24c84 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/AuthController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/AuthController.java @@ -53,7 +53,6 @@ public ResponseEntity signUp(@RequestBody UserSignUpRequest userSignUpRequest } } - @Transactional @PatchMapping("/findPassword") public ResponseEntity findPassword(@RequestBody FindPasswordRequest fPasswordRequest){ try { diff --git a/src/main/java/com/webservice/algorithmchef/controller/GeminiRecipeController.java b/src/main/java/com/webservice/algorithmchef/controller/GeminiRecipeController.java index 4613899..5d870e9 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/GeminiRecipeController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/GeminiRecipeController.java @@ -43,6 +43,7 @@ public ResponseEntity> recommendCondition(@RequestBod @PostMapping("/expir") public ResponseEntity> recommendExpir(@RequestBody ExpirRequest request) { log.info("재료 추천 요청 - userId: {}", request.userId()); + log.info("요청한 재료",request); return ResponseEntity.ok( recipeService.recommendExpir(request.userId(), request.ingredients(), request.excludedTitles()) ); diff --git a/src/main/java/com/webservice/algorithmchef/controller/RecipeSearchController.java b/src/main/java/com/webservice/algorithmchef/controller/RecipeSearchController.java index c37816c..d9c3547 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/RecipeSearchController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/RecipeSearchController.java @@ -10,7 +10,7 @@ @RestController @RequestMapping("/api/recipes") -@CrossOrigin(origins = "http://localhost:3000") +//@CrossOrigin(origins = "http://localhost:3000") public class RecipeSearchController { private final RecipeService recipeService; @@ -20,7 +20,7 @@ public RecipeSearchController(RecipeService recipeService) { } @GetMapping("/search") - public ResponseEntity getRandomRecipe(@RequestParam String ingredient) { + public ResponseEntity getRandomRecipe(@RequestParam("ingredient") String ingredient) { Recipe recipe = recipeService.getRandomRecipeByIngredient(ingredient); @@ -32,7 +32,7 @@ public ResponseEntity getRandomRecipe(@RequestParam String ingredient) { } @GetMapping("/search-multi") - public ResponseEntity getRandomRecipeMultiple(@RequestParam String ingredients) { + public ResponseEntity getRandomRecipeMultiple(@RequestParam("ingredients") String ingredients) { List ingList = Arrays.stream(ingredients.split(",")) diff --git a/src/main/java/com/webservice/algorithmchef/controller/SttController.java b/src/main/java/com/webservice/algorithmchef/controller/SttController.java index c8b4b3e..71ff180 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/SttController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/SttController.java @@ -16,7 +16,7 @@ @Slf4j @RestController @RequestMapping("/api") -@CrossOrigin(origins = "http://localhost:3000") +//@CrossOrigin(origins = "http://localhost:3000") @RequiredArgsConstructor public class SttController { diff --git a/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java index 29f9d4d..dcca92a 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/UserFridgeController.java @@ -17,7 +17,6 @@ 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; import com.webservice.algorithmchef.service.UserFridgeService; @@ -44,28 +43,22 @@ public ResponseEntity registerIngredients(@RequestBody UserFridgeRequest frid } @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()); - } - - } + public ResponseEntity retrieve( + @RequestParam(value = "category", required = false) String category, + @AuthenticationPrincipal UserDetails userDetails) { + try { + String userId = userDetails.getUsername(); + UserFridgeResponse response; + if (category != null) { + response = userFridgeService.filteredByCategory(userId, category); + } else { + response = userFridgeService.retrieveAll(userId); + } + return ResponseEntity.ok(response); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } @PatchMapping("/ingredient/update") public ResponseEntity updatePurchasedDate(@RequestBody ChangeFridgeIngredientRequest request, diff --git a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientRequest.java b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientRequest.java index 2e6272a..bc26cb5 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientRequest.java +++ b/src/main/java/com/webservice/algorithmchef/dto/fridgeingredient/ChangeFridgeIngredientRequest.java @@ -11,4 +11,5 @@ public class ChangeFridgeIngredientRequest { private Long ingredientId; private LocalDateTime purchasedDate; + private LocalDateTime expiredDate; } diff --git a/src/main/java/com/webservice/algorithmchef/dto/gemini/GeminiRecipeRequest.java b/src/main/java/com/webservice/algorithmchef/dto/gemini/GeminiRecipeRequest.java index e9cbd74..0bc9f3a 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/gemini/GeminiRecipeRequest.java +++ b/src/main/java/com/webservice/algorithmchef/dto/gemini/GeminiRecipeRequest.java @@ -2,6 +2,8 @@ import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; + public class GeminiRecipeRequest { // 1. 성향 기반 추천 요청 @@ -21,8 +23,11 @@ public record ConditionRequest( // 3. 임박한 재료 추천 요청 public record ExpirRequest( + @JsonProperty("userId") String userId, + @JsonProperty("excludedTitles") List excludedTitles, + @JsonProperty("ingredients") List ingredients // 소비기한 임박 재료 ) {} } diff --git a/src/main/java/com/webservice/algorithmchef/dto/user/FindPasswordResponse.java b/src/main/java/com/webservice/algorithmchef/dto/user/FindPasswordResponse.java index 69f4cfb..badcd10 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/user/FindPasswordResponse.java +++ b/src/main/java/com/webservice/algorithmchef/dto/user/FindPasswordResponse.java @@ -2,6 +2,9 @@ import com.webservice.algorithmchef.model.User; +import lombok.Getter; + +@Getter public class FindPasswordResponse { private String userId; diff --git a/src/main/java/com/webservice/algorithmchef/dto/user/UserLoginRequest.java b/src/main/java/com/webservice/algorithmchef/dto/user/UserLoginRequest.java index 796082e..8d62ec8 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/user/UserLoginRequest.java +++ b/src/main/java/com/webservice/algorithmchef/dto/user/UserLoginRequest.java @@ -1,8 +1,12 @@ package com.webservice.algorithmchef.dto.user; import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Getter +@Setter +@NoArgsConstructor public class UserLoginRequest { private String userId; diff --git a/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java b/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java index 43d4faa..9bce3af 100644 --- a/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java +++ b/src/main/java/com/webservice/algorithmchef/repository/FridgeIngredientRepository.java @@ -1,9 +1,9 @@ package com.webservice.algorithmchef.repository; +import java.util.List; import java.util.Optional; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; import com.webservice.algorithmchef.model.Fridge; @@ -11,8 +11,8 @@ public interface FridgeIngredientRepository extends JpaRepository { - Page findByFridge(Fridge fridge,Pageable pageable); - Page findByFridgeAndIngredient_NameContaining(Fridge fridge,String name,Pageable pageable); - Page findByFridgeAndIngredient_Category(Fridge fridge,String category,Pageable pageable); + List findByFridge(Fridge fridge,Sort sort); + //Page findByFridgeAndIngredient_NameContaining(Fridge fridge,String name,Pageable pageable); + List findByFridgeAndIngredient_Category(Fridge fridge,String category,Sort sort); Optional findByIdAndFridge(Long id, Fridge fridge); } diff --git a/src/main/java/com/webservice/algorithmchef/repository/UserRepository.java b/src/main/java/com/webservice/algorithmchef/repository/UserRepository.java index 37594ab..df9ef87 100644 --- a/src/main/java/com/webservice/algorithmchef/repository/UserRepository.java +++ b/src/main/java/com/webservice/algorithmchef/repository/UserRepository.java @@ -4,6 +4,8 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import com.webservice.algorithmchef.model.User; @@ -11,5 +13,7 @@ public interface UserRepository extends JpaRepository { public Optional findByUserId(String userId); public Optional findByEmailAndBirthDate(String email,LocalDateTime birthDate); + @Query("SELECT u FROM User u LEFT JOIN FETCH u.userPreference WHERE u.userId = :userId") + Optional findByUserIdWithPreference(@Param("userId") String userId); } diff --git a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java index be31592..264e52c 100644 --- a/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java +++ b/src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java @@ -7,9 +7,6 @@ import java.util.Map; import java.util.stream.Collectors; -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; @@ -20,7 +17,7 @@ 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.PageUserFridgeResponse; // import com.webservice.algorithmchef.dto.userfridge.UserFridgeRequest; import com.webservice.algorithmchef.dto.userfridge.UserFridgeResponse; import com.webservice.algorithmchef.model.Fridge; @@ -73,90 +70,87 @@ public UserFridgeResponse addIngredients(String userId, UserFridgeRequest userFr } @Transactional - public UserFridgeResponse updateIngredientInformation(String userId, FridgeBatchUpdateRequest fRequest) { - - Fridge fridge = findFridge(userId); - - List requestItems = fRequest.getIngredients(); - - List ingredientIds = requestItems.stream() - .map(FridgeIngredientUpdateItem::getIngredientId) - .toList(); - - Map ingredientMap = ingredientRepository.findAllById(ingredientIds).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 = calculateExpireDate( - item.getPurchaseDate(), - masterIngredient.getAvgExpiryDays(), - item.getExpiredDate() - ); - - 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) - ); - } - + public UserFridgeResponse updateIngredientInformation(String userId, FridgeBatchUpdateRequest fRequest) { + Fridge fridge = findFridge(userId); + List requestItems = fRequest.getIngredients(); + List ingredientsToSave = new ArrayList<>(); + for (FridgeIngredientUpdateItem item : requestItems) { + + FridgeIngredient existingItem = fIngredientRepository.findById(item.getIngredientId()).orElse(null); + + if (existingItem != null) { + + LocalDateTime newExpiredDate = calculateExpireDate( + item.getPurchaseDate(), + existingItem.getIngredient().getAvgExpiryDays(), + item.getExpiredDate() + ); + existingItem.setPurchaseDate(item.getPurchaseDate()); + existingItem.setExpiredDate(newExpiredDate); + ingredientsToSave.add(existingItem); + + } else { + Ingredient masterIngredient = ingredientRepository.findById(item.getIngredientId()).orElse(null); + if (masterIngredient != null) { + LocalDateTime expiredDate = calculateExpireDate( + item.getPurchaseDate(), + masterIngredient.getAvgExpiryDays(), + item.getExpiredDate() + ); + + FridgeIngredient newItem = FridgeIngredient.builder() + .fridge(fridge) + .ingredient(masterIngredient) + .purchaseDate(item.getPurchaseDate()) + .expiredDate(expiredDate) + .build(); + + ingredientsToSave.add(newItem); + } else { + } + } + } + List savedIngredients = fIngredientRepository.saveAll(ingredientsToSave); + return new UserFridgeResponse( + fridge.getId(), + toResponseList(savedIngredients) + ); + } - public PageUserFridgeResponse retrieveAll(String userId, int size, int page){ + public UserFridgeResponse retrieveAll(String userId){ 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()); + Sort sort = Sort.by(Sort.Direction.DESC, "purchaseDate"); - Page ingredients = fIngredientRepository.findByFridgeAndIngredient_NameContaining(fridge, name, pageable); + List ingredients = fIngredientRepository.findByFridge(fridge, sort); - return new PageUserFridgeResponse( + return new UserFridgeResponse( fridge.getId(), - ingredients.map(this::toFridgeIngredientResponse) + toResponseList(ingredients) ); } - public PageUserFridgeResponse filteredByCategory(String userId, String category, int size, int page) { +// 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 UserFridgeResponse filteredByCategory(String userId, String category) { Fridge fridge = findFridge(userId); - Pageable pageable = PageRequest.of(page, size, Sort.by("purchaseDate").descending()); + Sort sort = Sort.by("purchaseDate").descending(); - Page ingredients = fIngredientRepository.findByFridgeAndIngredient_Category(fridge, category, pageable); + List ingredients = fIngredientRepository.findByFridgeAndIngredient_Category(fridge, category, sort); - return new PageUserFridgeResponse( + return new UserFridgeResponse( fridge.getId(), - ingredients.map(this::toFridgeIngredientResponse) + toResponseList(ingredients) ); } @@ -166,8 +160,11 @@ public ChangeFridgeIngredientResponse updatePurchasedDate(String userId, ChangeF FridgeIngredient fridgeIngredient = fIngredientRepository.findByIdAndFridge(request.getIngredientId(), fridge) .orElseThrow(() -> new IllegalArgumentException("해당하는 아이디로 재료 찾을 수 없습니다.")); - fridgeIngredient.setPurchaseDate(request.getPurchasedDate()); + LocalDateTime expiredDate = calculateExpireDate(request.getPurchasedDate(), + fridgeIngredient.getIngredient().getAvgExpiryDays(), + request.getExpiredDate()); + fridgeIngredient.setExpiredDate(expiredDate); return new ChangeFridgeIngredientResponse(fridgeIngredient, "업데이트 완료"); } diff --git a/src/main/java/com/webservice/algorithmchef/service/UserService.java b/src/main/java/com/webservice/algorithmchef/service/UserService.java index e4f8f10..1aae89a 100644 --- a/src/main/java/com/webservice/algorithmchef/service/UserService.java +++ b/src/main/java/com/webservice/algorithmchef/service/UserService.java @@ -103,8 +103,8 @@ public MessageResponse makeOrUpdateSurvey(SurveyRequest sRequest,String userId) } public MyPageResponse retrieveMyInformation(String userId) { - User user = userRepository.findByUserId(userId) - .orElseThrow(()-> new IllegalArgumentException("해당 아이디에 적합한 사용자를 찾을 수 없습니다")); + User user = userRepository.findByUserIdWithPreference(userId) + .orElseThrow(()-> new IllegalArgumentException("해당 아이디에 적합한 사용자를 찾을 수 없습니다")); return new MyPageResponse(user); } From 1d1919344a48b0ac5f845d81e027dd4d116a0a3b Mon Sep 17 00:00:00 2001 From: bu2000 Date: Mon, 1 Dec 2025 02:41:15 +0900 Subject: [PATCH 2/2] change some problems --- .../controller/BoardController.java | 30 +++++++++---------- .../dto/board/BoardPostListResponse.java | 2 ++ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/webservice/algorithmchef/controller/BoardController.java b/src/main/java/com/webservice/algorithmchef/controller/BoardController.java index 2bb0913..269fe89 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/BoardController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/BoardController.java @@ -27,10 +27,10 @@ public class BoardController { // 게시글 목록 조회(게시판) @GetMapping("/posts") public ResponseEntity getPostList( - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "20") int size, - @RequestParam(defaultValue = "createdAt,desc") String sort, - @RequestParam(required = false) String filter + @RequestParam(defaultValue = "0",value="page") int page, + @RequestParam(defaultValue = "20",value="size") int size, + @RequestParam(defaultValue = "createdAt,desc",value="sort") String sort, + @RequestParam(required = false,value="filter") String filter ) { BoardPostListResponse response = boardService.getPostList(page, size, sort, filter); return ResponseEntity.ok(response); @@ -55,10 +55,10 @@ public ResponseEntity> createPost( // 게시글 조회 @GetMapping("/post/{postId}") public ResponseEntity getPostDetail( - @PathVariable Long postId, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "20") int size, - @RequestParam(defaultValue = "createdAt,asc") String sort + @PathVariable("postId") Long postId, + @RequestParam(defaultValue = "0",value="page") int page, + @RequestParam(defaultValue = "20",value="size") int size, + @RequestParam(defaultValue = "createdAt,asc",value="sort") String sort ) { try { BoardPostResponse response = boardService.getPostDetail(postId, page, size, sort); @@ -71,7 +71,7 @@ public ResponseEntity getPostDetail( // 댓글 작성 @PostMapping("/post/{postId}/comment") public ResponseEntity> createComment( - @PathVariable Long postId, + @PathVariable("postId") Long postId, @RequestBody BoardCommentRequest requestDto, @AuthenticationPrincipal UserDetails userDetails ) { @@ -91,10 +91,10 @@ public ResponseEntity> createComment( // 대댓글 조회 @GetMapping("/comments/{commentId}/replies") public ResponseEntity getReplies( - @PathVariable Long commentId, - @RequestParam(defaultValue = "0") int page, - @RequestParam(defaultValue = "20") int size, - @RequestParam(defaultValue = "createdAt,asc") String sort + @PathVariable("commentId") Long commentId, + @RequestParam(defaultValue = "0",value="page") int page, + @RequestParam(defaultValue = "10",value="size") int size, + @RequestParam(defaultValue = "createdAt,asc",value="sort") String sort ) { try { CommentReplyListResponse response = boardService.getReplies(commentId, page, size, sort); @@ -107,7 +107,7 @@ public ResponseEntity getReplies( // 게시글 수정 @PutMapping("/post/{postId}") public ResponseEntity> updatePost( - @PathVariable Long postId, + @PathVariable("postId") Long postId, @RequestBody BoardPostRequest requestDto, @AuthenticationPrincipal UserDetails userDetails ) { @@ -133,7 +133,7 @@ public ResponseEntity> updatePost( // 게시글 삭제 @DeleteMapping("/post/{postId}") public ResponseEntity> deletePost( - @PathVariable Long postId, + @PathVariable("postId") Long postId, @AuthenticationPrincipal UserDetails userDetails ) { if (userDetails == null) { diff --git a/src/main/java/com/webservice/algorithmchef/dto/board/BoardPostListResponse.java b/src/main/java/com/webservice/algorithmchef/dto/board/BoardPostListResponse.java index 78e53cc..9c0d2dd 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/board/BoardPostListResponse.java +++ b/src/main/java/com/webservice/algorithmchef/dto/board/BoardPostListResponse.java @@ -27,10 +27,12 @@ public static class BoardPostSimple { private String createdAt; private String category; private String content; // 목록 미리보기용 + private Long postId; public static BoardPostSimple from(BoardPost post) { return BoardPostSimple.builder() .title(post.getTitle()) + .postId(post.getPostId()) // User 엔티티의 userId (로그인 아이디) 사용 .userId(post.getUser().getUserId()) // 날짜 포맷팅 (yyyy-MM-dd)