From 78f518d7e90983bc50f0840af5ca989a600fd553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A0=95=ED=9B=84?= Date: Fri, 9 Aug 2024 21:11:32 +0900 Subject: [PATCH 1/7] feat: open api key yml file --- .github/workflows/cd.yml | 7 +++++++ .gitignore | 1 + api-module/src/main/resources/application-openapi-key.yml | 1 + api-module/src/main/resources/application.yml | 4 ++-- core-module/src/main/resources/application.properties | 1 - 5 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 api-module/src/main/resources/application-openapi-key.yml delete mode 100644 core-module/src/main/resources/application.properties diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 75e879e..36c2984 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -31,6 +31,13 @@ jobs: echo "${{ secrets.APPLICATION_S3 }}" > ./application-s3.yml shell: bash + - name: make application-openapi-key yml file + run: | + cd ./api-module/src/main/resources + touch ./application-openapi-key.yml + echo "${{ secrets.APPLICATION_OPENAPI }}" > ./application-openapi-key.yml + shell: bash + - name: Gradlew 권한 부여 run: chmod +x ./gradlew diff --git a/.gitignore b/.gitignore index 00cdfc2..ec00d3d 100644 --- a/.gitignore +++ b/.gitignore @@ -39,5 +39,6 @@ out/ **/data/ api-module/src/main/resources/application-prod.yml +api-module/src/main/resources/application-openapi-key.yml common-module/src/main/resources/application-s3.yml docker-compose.yml diff --git a/api-module/src/main/resources/application-openapi-key.yml b/api-module/src/main/resources/application-openapi-key.yml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/api-module/src/main/resources/application-openapi-key.yml @@ -0,0 +1 @@ + diff --git a/api-module/src/main/resources/application.yml b/api-module/src/main/resources/application.yml index ef66b8f..c64bcb3 100644 --- a/api-module/src/main/resources/application.yml +++ b/api-module/src/main/resources/application.yml @@ -11,14 +11,14 @@ spring: config: activate: on-profile: local - import: application-prod.yml, application-redis-local.yml, application-s3.yml + import: application-prod.yml, application-redis-local.yml, application-s3.yml, application-openapi-key.yml --- spring: config: activate: on-profile: prod - import: application-prod.yml, application-redis-prod.yml, application-s3.yml + import: application-prod.yml, application-redis-prod.yml, application-s3.yml, application-openapi-key.yml server: diff --git a/core-module/src/main/resources/application.properties b/core-module/src/main/resources/application.properties deleted file mode 100644 index 8d54d5d..0000000 --- a/core-module/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=core-module From c791811a800fa728ba188dde09a87b188edbad27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A0=95=ED=9B=84?= Date: Fri, 9 Aug 2024 21:13:03 +0900 Subject: [PATCH 2/7] chore: ingredient related files package --- .../application/IngredientFindUseCase.java | 48 +++++++++++++++++ .../ingredient/dto/IngredientAddReq.java | 7 +++ .../ingredient/dto/IngredientInfo.java | 9 ++++ .../ingredient/mapper/IngredientMapper.java | 30 +++++++++++ .../IngredientController.java | 8 +-- .../service/IngredientQueryService.java | 12 +++++ .../ingredient/service/IngredientService.java | 54 ------------------- 7 files changed, 110 insertions(+), 58 deletions(-) create mode 100644 api-module/src/main/java/com/foodgo/apimodule/ingredient/application/IngredientFindUseCase.java create mode 100644 api-module/src/main/java/com/foodgo/apimodule/ingredient/dto/IngredientAddReq.java create mode 100644 api-module/src/main/java/com/foodgo/apimodule/ingredient/dto/IngredientInfo.java create mode 100644 api-module/src/main/java/com/foodgo/apimodule/ingredient/mapper/IngredientMapper.java rename api-module/src/main/java/com/foodgo/apimodule/ingredient/{controller => presentation}/IngredientController.java (79%) create mode 100644 core-module/src/main/java/com/foodgo/coremodule/ingredient/service/IngredientQueryService.java delete mode 100644 core-module/src/main/java/com/foodgo/coremodule/ingredient/service/IngredientService.java diff --git a/api-module/src/main/java/com/foodgo/apimodule/ingredient/application/IngredientFindUseCase.java b/api-module/src/main/java/com/foodgo/apimodule/ingredient/application/IngredientFindUseCase.java new file mode 100644 index 0000000..f095121 --- /dev/null +++ b/api-module/src/main/java/com/foodgo/apimodule/ingredient/application/IngredientFindUseCase.java @@ -0,0 +1,48 @@ +package com.foodgo.apimodule.ingredient.application; + +import com.foodgo.coremodule.ingredient.dto.request.IngredientGetRequest; +import com.foodgo.coremodule.ingredient.dto.response.IngredientGetResponse; +import com.foodgo.coremodule.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class IngredientFindUseCase { + + @Value("${spring.openapi.key.recipe}") + private String apiKey; + + public IngredientGetResponse.Row getIngredient(User user, IngredientGetRequest request) throws URISyntaxException { + + String apiUrl = "http://openapi.foodsafetykorea.go.kr/api/" + apiKey + "/I2790/json/1/100/DESC_KOR=" + request.descKor(); + URI uri = new URI(apiUrl); + + WebClient webClient = WebClient.create(); + IngredientGetResponse response = webClient.get() + .uri(uri) + .retrieve() + .bodyToMono(IngredientGetResponse.class) + .doOnError(error -> { + throw new RuntimeException("API 호출 오류: " + error.getMessage()); + }) + .block(); + + assert response != null; + List filteredRows = response.getI2790().getRow().stream() + .filter(row -> groupNameMatches(row, request.groupName())) + .toList(); + + return filteredRows.isEmpty() ? null : filteredRows.get(0); + } + + private boolean groupNameMatches(IngredientGetResponse.Row row, String groupName) { + return groupName == null || groupName.isEmpty() || groupName.equals(row.getGroupName()); + } +} diff --git a/api-module/src/main/java/com/foodgo/apimodule/ingredient/dto/IngredientAddReq.java b/api-module/src/main/java/com/foodgo/apimodule/ingredient/dto/IngredientAddReq.java new file mode 100644 index 0000000..378e174 --- /dev/null +++ b/api-module/src/main/java/com/foodgo/apimodule/ingredient/dto/IngredientAddReq.java @@ -0,0 +1,7 @@ +package com.foodgo.apimodule.ingredient.dto; + +public record IngredientAddReq( + String name, + String quantity +) { +} diff --git a/api-module/src/main/java/com/foodgo/apimodule/ingredient/dto/IngredientInfo.java b/api-module/src/main/java/com/foodgo/apimodule/ingredient/dto/IngredientInfo.java new file mode 100644 index 0000000..8b2f034 --- /dev/null +++ b/api-module/src/main/java/com/foodgo/apimodule/ingredient/dto/IngredientInfo.java @@ -0,0 +1,9 @@ +package com.foodgo.apimodule.ingredient.dto; + +public record IngredientInfo( + Long ingredientId, + String name, + String quantity, + String imageUrl +) { +} diff --git a/api-module/src/main/java/com/foodgo/apimodule/ingredient/mapper/IngredientMapper.java b/api-module/src/main/java/com/foodgo/apimodule/ingredient/mapper/IngredientMapper.java new file mode 100644 index 0000000..f1ce85c --- /dev/null +++ b/api-module/src/main/java/com/foodgo/apimodule/ingredient/mapper/IngredientMapper.java @@ -0,0 +1,30 @@ +package com.foodgo.apimodule.ingredient.mapper; + +import com.foodgo.apimodule.ingredient.dto.IngredientAddReq; +import com.foodgo.apimodule.ingredient.dto.IngredientInfo; +import com.foodgo.coremodule.cuisine.domain.Ingredient; +import com.foodgo.coremodule.user.domain.User; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class IngredientMapper { + + public static IngredientInfo toInfoDTO(Ingredient ingredient) { + return new IngredientInfo( + ingredient.getId(), + ingredient.getName(), + ingredient.getQuantity(), + ingredient.getImageUrl() + ); + } + + public static Ingredient toIngredientEntity(IngredientAddReq addReq, User user, String imageUrl) { + return Ingredient.builder() + .name(addReq.name()) + .quantity(addReq.quantity()) + .imageUrl(imageUrl) + .user(user) + .build(); + } +} diff --git a/api-module/src/main/java/com/foodgo/apimodule/ingredient/controller/IngredientController.java b/api-module/src/main/java/com/foodgo/apimodule/ingredient/presentation/IngredientController.java similarity index 79% rename from api-module/src/main/java/com/foodgo/apimodule/ingredient/controller/IngredientController.java rename to api-module/src/main/java/com/foodgo/apimodule/ingredient/presentation/IngredientController.java index fa285bd..343a156 100644 --- a/api-module/src/main/java/com/foodgo/apimodule/ingredient/controller/IngredientController.java +++ b/api-module/src/main/java/com/foodgo/apimodule/ingredient/presentation/IngredientController.java @@ -1,7 +1,8 @@ -package com.foodgo.apimodule.ingredient.controller; +package com.foodgo.apimodule.ingredient.presentation; import java.net.URISyntaxException; +import com.foodgo.apimodule.ingredient.application.IngredientFindUseCase; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,7 +11,6 @@ import com.foodgo.commonmodule.common.ApiResponse; import com.foodgo.coremodule.ingredient.dto.request.IngredientGetRequest; import com.foodgo.coremodule.ingredient.dto.response.IngredientGetResponse; -import com.foodgo.coremodule.ingredient.service.IngredientService; import com.foodgo.coremodule.security.annotation.UserResolver; import com.foodgo.coremodule.user.domain.User; @@ -24,13 +24,13 @@ @RequestMapping("/api/v1/ingredients") public class IngredientController { - private final IngredientService ingredientService; + private final IngredientFindUseCase ingredientFindUseCase; @PostMapping("") public ApiResponse getIngredientInfo( @UserResolver User user, @RequestBody @Valid IngredientGetRequest request ) throws URISyntaxException { - return ApiResponse.onSuccess(ingredientService.getIngredient(user, request)); + return ApiResponse.onSuccess(ingredientFindUseCase.getIngredient(user, request)); } } diff --git a/core-module/src/main/java/com/foodgo/coremodule/ingredient/service/IngredientQueryService.java b/core-module/src/main/java/com/foodgo/coremodule/ingredient/service/IngredientQueryService.java new file mode 100644 index 0000000..1273922 --- /dev/null +++ b/core-module/src/main/java/com/foodgo/coremodule/ingredient/service/IngredientQueryService.java @@ -0,0 +1,12 @@ +package com.foodgo.coremodule.ingredient.service; + +import com.foodgo.coremodule.ingredient.repository.IngredientInfoRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class IngredientQueryService { + + private final IngredientInfoRepository ingredientInfoRepository; +} diff --git a/core-module/src/main/java/com/foodgo/coremodule/ingredient/service/IngredientService.java b/core-module/src/main/java/com/foodgo/coremodule/ingredient/service/IngredientService.java deleted file mode 100644 index 223a00d..0000000 --- a/core-module/src/main/java/com/foodgo/coremodule/ingredient/service/IngredientService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.foodgo.coremodule.ingredient.service; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; - -import org.springframework.stereotype.Service; - -import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; - -import org.springframework.web.reactive.function.client.WebClient; - -import com.foodgo.coremodule.ingredient.dto.request.IngredientGetRequest; -import com.foodgo.coremodule.ingredient.dto.response.IngredientGetResponse; -import com.foodgo.coremodule.ingredient.repository.IngredientInfoRepository; -import com.foodgo.coremodule.user.domain.User; - -@RequiredArgsConstructor -@Transactional -@Service -public class IngredientService { - - private final IngredientInfoRepository ingredientInfoRepository; - - public IngredientGetResponse.Row getIngredient(User user, IngredientGetRequest request) throws URISyntaxException { - String apiKey = "abe72ba4fe0445af8c77"; - String apiUrl = "http://openapi.foodsafetykorea.go.kr/api/" + apiKey + "/I2790/json/1/100/DESC_KOR=" + request.descKor(); - - - URI uri = new URI(apiUrl); - - WebClient webClient = WebClient.create(); - IngredientGetResponse response = webClient.get() - .uri(uri) - .retrieve() - .bodyToMono(IngredientGetResponse.class) - .doOnError(error -> { - throw new RuntimeException("API 호출 오류: " + error.getMessage()); - }) - .block(); - - assert response != null; - List filteredRows = response.getI2790().getRow().stream() - .filter(row -> groupNameMatches(row, request.groupName())) - .toList(); - - return filteredRows.isEmpty() ? null : filteredRows.get(0); - } - - private boolean groupNameMatches(IngredientGetResponse.Row row, String groupName) { - return groupName == null || groupName.isEmpty() || groupName.equals(row.getGroupName()); - } -} From f3b9fd6a24d4e405ced6dccaed53ed6fea2df758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A0=95=ED=9B=84?= Date: Fri, 9 Aug 2024 21:14:42 +0900 Subject: [PATCH 3/7] feat: cuisine test & recipe api --- .../application/CuisineFindUseCase.java | 69 ++++++++ .../application/CuisineSaveUseCase.java | 43 +++++ .../application/QuisineFindUseCase.java | 32 ---- .../application/QuisineSaveUseCase.java | 35 ---- .../cuisine/dto/IngredientAddReq.java | 7 - .../apimodule/cuisine/dto/IngredientInfo.java | 9 -- .../apimodule/cuisine/dto/RecipeDTO.java | 86 ++++++++++ .../apimodule/cuisine/dto/TestResultType.java | 8 + .../cuisine/mapper/IngredientMapper.java | 30 ---- .../presentation/CuisineController.java | 149 ++++++++++++++++++ .../presentation/QuisineController.java | 87 ---------- .../cuisine/domain/CuisineTest.java | 32 ++++ .../domain/Ingredient.java | 2 +- .../coremodule/cuisine/domain/TestType.java | 22 +++ .../exception/CuisineErrorCode.java} | 4 +- .../exception/CuisineException.java} | 8 +- .../repository/CuisineTestRepository.java | 9 ++ .../repository/IngredientRepository.java | 4 +- .../cuisine/service/CuisineQueryService.java | 46 ++++++ .../quisine/service/QuisineQueryService.java | 36 ----- 20 files changed, 473 insertions(+), 245 deletions(-) create mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineFindUseCase.java create mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineSaveUseCase.java delete mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/application/QuisineFindUseCase.java delete mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/application/QuisineSaveUseCase.java delete mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/IngredientAddReq.java delete mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/IngredientInfo.java create mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/RecipeDTO.java create mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/TestResultType.java delete mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/mapper/IngredientMapper.java create mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/presentation/CuisineController.java delete mode 100644 api-module/src/main/java/com/foodgo/apimodule/cuisine/presentation/QuisineController.java create mode 100644 core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/CuisineTest.java rename core-module/src/main/java/com/foodgo/coremodule/{quisine => cuisine}/domain/Ingredient.java (94%) create mode 100644 core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/TestType.java rename core-module/src/main/java/com/foodgo/coremodule/{quisine/exception/QuisineErrorCode.java => cuisine/exception/CuisineErrorCode.java} (83%) rename core-module/src/main/java/com/foodgo/coremodule/{quisine/exception/QuisineException.java => cuisine/exception/CuisineException.java} (58%) create mode 100644 core-module/src/main/java/com/foodgo/coremodule/cuisine/repository/CuisineTestRepository.java rename core-module/src/main/java/com/foodgo/coremodule/{quisine => cuisine}/repository/IngredientRepository.java (68%) create mode 100644 core-module/src/main/java/com/foodgo/coremodule/cuisine/service/CuisineQueryService.java delete mode 100644 core-module/src/main/java/com/foodgo/coremodule/quisine/service/QuisineQueryService.java diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineFindUseCase.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineFindUseCase.java new file mode 100644 index 0000000..33f8a5d --- /dev/null +++ b/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineFindUseCase.java @@ -0,0 +1,69 @@ +package com.foodgo.apimodule.cuisine.application; + +import com.foodgo.apimodule.cuisine.dto.RecipeDTO; +import com.foodgo.apimodule.cuisine.dto.TestResultType; +import com.foodgo.apimodule.ingredient.dto.IngredientInfo; +import com.foodgo.apimodule.ingredient.mapper.IngredientMapper; +import com.foodgo.coremodule.cuisine.domain.Ingredient; +import com.foodgo.coremodule.cuisine.domain.TestType; +import com.foodgo.coremodule.cuisine.service.CuisineQueryService; +import com.foodgo.coremodule.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class CuisineFindUseCase { + + private final CuisineQueryService cuisineQueryService; + + @Value("${spring.openapi.key.recipe}") + private String apiKey; + + public List findIngredientInfo(User user) { + + List infoList = new ArrayList<>(); + + List ingredients = cuisineQueryService.findIngredientsByUserId(user.getId()); + for (Ingredient ingredient : ingredients) { + final IngredientInfo infoDTO = IngredientMapper.toInfoDTO(ingredient); + infoList.add(infoDTO); + } + + return infoList; + } + + public TestResultType findTestResult(User user) { + + TestType test = cuisineQueryService.findTestType(user.getId()); + return new TestResultType(test); + } + + public List findRecipeResult(RecipeDTO.Request request) throws URISyntaxException { + + String apiUrl = "http://openapi.foodsafetykorea.go.kr/api/" + + apiKey + "/COOKRCP01/json/1/100/RCP_NM=" + request.rcpNm(); + + URI uri = new URI(apiUrl); + + WebClient webClient = WebClient.create(); + RecipeDTO.TotalResponse response = webClient.get() + .uri(uri) + .retrieve() + .bodyToMono(RecipeDTO.TotalResponse.class) + .doOnError(error -> { + throw new RuntimeException("API 호출 오류: " + error.getMessage()); + }) + .block(); + + // row 리스트만 추출 + return response.COOKRCP01().row(); + } +} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineSaveUseCase.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineSaveUseCase.java new file mode 100644 index 0000000..7bd8dde --- /dev/null +++ b/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineSaveUseCase.java @@ -0,0 +1,43 @@ +package com.foodgo.apimodule.cuisine.application; + +import com.foodgo.apimodule.ingredient.dto.IngredientAddReq; +import com.foodgo.apimodule.cuisine.dto.TestResultType; +import com.foodgo.apimodule.ingredient.mapper.IngredientMapper; +import com.foodgo.commonmodule.image.service.AwsS3Service; +import com.foodgo.coremodule.cuisine.domain.CuisineTest; +import com.foodgo.coremodule.cuisine.domain.Ingredient; +import com.foodgo.coremodule.cuisine.service.CuisineQueryService; +import com.foodgo.coremodule.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +@Service +@RequiredArgsConstructor +@Transactional +public class CuisineSaveUseCase { + + private final CuisineQueryService cuisineQueryService; + private final AwsS3Service awsS3Service; + + public void saveIngredient(IngredientAddReq addReq, MultipartFile multipartFile, User user) { + + String imageUrl = awsS3Service.uploadFile(multipartFile); + Ingredient ingredient = IngredientMapper.toIngredientEntity(addReq, user, imageUrl); + + cuisineQueryService.saveIngredient(ingredient); + } + + + public void deleteIngredient(Long ingredientId) { + + cuisineQueryService.deleteIngredient(ingredientId); + } + + public void saveCuisineTest(User user, TestResultType resultType) { + + final CuisineTest cuisineTest = CuisineTest.builder().type(resultType.testType()).user(user).build(); + cuisineQueryService.saveCuisineTest(cuisineTest); + } +} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/QuisineFindUseCase.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/QuisineFindUseCase.java deleted file mode 100644 index b6a83d9..0000000 --- a/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/QuisineFindUseCase.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.foodgo.apimodule.cuisine.application; - -import com.foodgo.apimodule.cuisine.dto.IngredientInfo; -import com.foodgo.apimodule.cuisine.mapper.IngredientMapper; -import com.foodgo.coremodule.quisine.domain.Ingredient; -import com.foodgo.coremodule.quisine.service.QuisineQueryService; -import com.foodgo.coremodule.user.domain.User; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -public class QuisineFindUseCase { - - private final QuisineQueryService quisineQueryService; - - public List findIngredientInfo(User user) { - - List infoList = new ArrayList<>(); - - List ingredients = quisineQueryService.findIngredientsByUserId(user.getId()); - for (Ingredient ingredient : ingredients) { - final IngredientInfo infoDTO = IngredientMapper.toInfoDTO(ingredient); - infoList.add(infoDTO); - } - - return infoList; - } -} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/QuisineSaveUseCase.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/QuisineSaveUseCase.java deleted file mode 100644 index f6a3d8d..0000000 --- a/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/QuisineSaveUseCase.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.foodgo.apimodule.cuisine.application; - -import com.foodgo.apimodule.cuisine.dto.IngredientAddReq; -import com.foodgo.apimodule.cuisine.mapper.IngredientMapper; -import com.foodgo.commonmodule.image.service.AwsS3Service; -import com.foodgo.coremodule.quisine.domain.Ingredient; -import com.foodgo.coremodule.quisine.service.QuisineQueryService; -import com.foodgo.coremodule.user.domain.User; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -@Service -@RequiredArgsConstructor -@Transactional -public class QuisineSaveUseCase { - - private final QuisineQueryService quisineQueryService; - private final AwsS3Service awsS3Service; - - public void saveIngredient(IngredientAddReq addReq, MultipartFile multipartFile, User user) { - - String imageUrl = awsS3Service.uploadFile(multipartFile); - Ingredient ingredient = IngredientMapper.toIngredientEntity(addReq, user, imageUrl); - - quisineQueryService.saveIngredient(ingredient); - } - - - public void deleteIngredient(Long ingredientId) { - - quisineQueryService.deleteIngredient(ingredientId); - } -} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/IngredientAddReq.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/IngredientAddReq.java deleted file mode 100644 index 0f2acb9..0000000 --- a/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/IngredientAddReq.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.foodgo.apimodule.cuisine.dto; - -public record IngredientAddReq( - String name, - String quantity -) { -} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/IngredientInfo.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/IngredientInfo.java deleted file mode 100644 index 2d68f8e..0000000 --- a/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/IngredientInfo.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.foodgo.apimodule.cuisine.dto; - -public record IngredientInfo( - Long ingredientId, - String name, - String quantity, - String imageUrl -) { -} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/RecipeDTO.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/RecipeDTO.java new file mode 100644 index 0000000..50cb0e0 --- /dev/null +++ b/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/RecipeDTO.java @@ -0,0 +1,86 @@ +package com.foodgo.apimodule.cuisine.dto; + +import java.util.List; + +public class RecipeDTO { + + public record Request( + String rcpNm // 메뉴명 + ) {} + + // 전체 응답을 나타내는 클래스 + public record TotalResponse ( + CookRcp COOKRCP01 + ) { + public record CookRcp( + String total_count, + List row, // 여러 개의 레시피 데이터를 포함하는 리스트 + Result RESULT + ) {} + } + + // 개별 레시피 데이터를 나타내는 클래스 + public record RecipeDetail( + String RCP_SEQ, // 일련번호 + String RCP_NM, // 메뉴명 + String RCP_WAY2, // 조리방법 + String RCP_PAT2, // 요리종류 + String INFO_WGT, // 중량(1인분) + String INFO_ENG, // 열량 + String INFO_CAR, // 탄수화물 + String INFO_PRO, // 단백질 + String INFO_FAT, // 지방 + String INFO_NA, // 나트륨 + String HASH_TAG, // 해쉬태그 + String ATT_FILE_NO_MAIN, // 메인 이미지 경로 + String ATT_FILE_NO_MK, // 서브 이미지 경로 + String RCP_PARTS_DTLS, // 재료 정보 + String MANUAL01, // 조리법 1 + String MANUAL02, // 조리법 2 + String MANUAL03, // 조리법 3 + String MANUAL04, // 조리법 4 + String MANUAL05, // 조리법 5 + String MANUAL06, // 조리법 6 + String MANUAL07, // 조리법 7 + String MANUAL08, // 조리법 8 + String MANUAL09, // 조리법 9 + String MANUAL10, // 조리법 10 + String MANUAL11, // 조리법 11 + String MANUAL12, // 조리법 12 + String MANUAL13, // 조리법 13 + String MANUAL14, // 조리법 14 + String MANUAL15, // 조리법 15 + String MANUAL16, // 조리법 16 + String MANUAL17, // 조리법 17 + String MANUAL18, // 조리법 18 + String MANUAL19, // 조리법 19 + String MANUAL20, // 조리법 20 + String MANUAL_IMG01, // 조리법 이미지 1 + String MANUAL_IMG02, // 조리법 이미지 2 + String MANUAL_IMG03, // 조리법 이미지 3 + String MANUAL_IMG04, // 조리법 이미지 4 + String MANUAL_IMG05, // 조리법 이미지 5 + String MANUAL_IMG06, // 조리법 이미지 6 + String MANUAL_IMG07, // 조리법 이미지 7 + String MANUAL_IMG08, // 조리법 이미지 8 + String MANUAL_IMG09, // 조리법 이미지 9 + String MANUAL_IMG10, // 조리법 이미지 10 + String MANUAL_IMG11, // 조리법 이미지 11 + String MANUAL_IMG12, // 조리법 이미지 12 + String MANUAL_IMG13, // 조리법 이미지 13 + String MANUAL_IMG14, // 조리법 이미지 14 + String MANUAL_IMG15, // 조리법 이미지 15 + String MANUAL_IMG16, // 조리법 이미지 16 + String MANUAL_IMG17, // 조리법 이미지 17 + String MANUAL_IMG18, // 조리법 이미지 18 + String MANUAL_IMG19, // 조리법 이미지 19 + String MANUAL_IMG20, // 조리법 이미지 20 + String RCP_NA_TIP // 저감 조리법 TIP + ) {} + + // 결과 메시지를 나타내는 클래스 + public record Result( + String MSG, + String CODE + ) {} +} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/TestResultType.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/TestResultType.java new file mode 100644 index 0000000..68fb8c5 --- /dev/null +++ b/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/TestResultType.java @@ -0,0 +1,8 @@ +package com.foodgo.apimodule.cuisine.dto; + +import com.foodgo.coremodule.cuisine.domain.TestType; + +public record TestResultType( + TestType testType +) { +} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/mapper/IngredientMapper.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/mapper/IngredientMapper.java deleted file mode 100644 index 78dc7ed..0000000 --- a/api-module/src/main/java/com/foodgo/apimodule/cuisine/mapper/IngredientMapper.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.foodgo.apimodule.cuisine.mapper; - -import com.foodgo.apimodule.cuisine.dto.IngredientAddReq; -import com.foodgo.apimodule.cuisine.dto.IngredientInfo; -import com.foodgo.coremodule.quisine.domain.Ingredient; -import com.foodgo.coremodule.user.domain.User; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class IngredientMapper { - - public static IngredientInfo toInfoDTO(Ingredient ingredient) { - return new IngredientInfo( - ingredient.getId(), - ingredient.getName(), - ingredient.getQuantity(), - ingredient.getImageUrl() - ); - } - - public static Ingredient toIngredientEntity(IngredientAddReq addReq, User user, String imageUrl) { - return Ingredient.builder() - .name(addReq.name()) - .quantity(addReq.quantity()) - .imageUrl(imageUrl) - .user(user) - .build(); - } -} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/presentation/CuisineController.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/presentation/CuisineController.java new file mode 100644 index 0000000..0750ad7 --- /dev/null +++ b/api-module/src/main/java/com/foodgo/apimodule/cuisine/presentation/CuisineController.java @@ -0,0 +1,149 @@ +package com.foodgo.apimodule.cuisine.presentation; + +import com.foodgo.apimodule.cuisine.application.CuisineFindUseCase; +import com.foodgo.apimodule.cuisine.application.CuisineSaveUseCase; +import com.foodgo.apimodule.cuisine.dto.RecipeDTO; +import com.foodgo.apimodule.cuisine.dto.TestResultType; +import com.foodgo.apimodule.ingredient.dto.IngredientAddReq; +import com.foodgo.apimodule.ingredient.dto.IngredientInfo; +import com.foodgo.commonmodule.common.ApplicationResponse; +import com.foodgo.coremodule.security.annotation.UserResolver; +import com.foodgo.coremodule.user.domain.User; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.net.URISyntaxException; +import java.util.List; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/api/v1/cuisine") +@Validated +@Tag(name = "cuisine", description = "음식 추천 관련 API") +public class CuisineController { + + private final CuisineFindUseCase cuisineFindUseCase; + private final CuisineSaveUseCase cuisineSaveUseCase; + + // 전체 조회 + @GetMapping + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "식재료 리스트 확인 성공", + useReturnTypeSchema = true + ) + } + ) + @Operation(summary = "식재료 리스트 확인 API", description = "식재료 리스트 확인 API 입니다.") + public ApplicationResponse> findIngredientList(@UserResolver User user) { + + final List ingredientInfo = cuisineFindUseCase.findIngredientInfo(user); + return ApplicationResponse.ok(ingredientInfo); + } + + // 식재료 추가하기 + @PostMapping + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "식재료 리스트 추가 성공", + useReturnTypeSchema = true + ) + } + ) + @Operation(summary = "식재료 리스트 추가 API", description = "식재료 리스트 추가 API 입니다.") + public ApplicationResponse addIngredientList(@UserResolver User user, + @RequestPart(value = "dto") IngredientAddReq addReq, + @RequestPart(value = "file") MultipartFile multipartFile) { + + cuisineSaveUseCase.saveIngredient(addReq, multipartFile, user); + return ApplicationResponse.ok("식재료 리스트 추가되었습니다."); + } + + // 식재료 삭제하기 + @DeleteMapping("{ingredientId}") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "식재료 리스트 삭제 성공", + useReturnTypeSchema = true + ) + } + ) + @Operation(summary = "식재료 리스트 삭제 API", description = "식재료 리스트 삭제 API 입니다.") + public ApplicationResponse deleteIngredient(@PathVariable Long ingredientId) { + + cuisineSaveUseCase.deleteIngredient(ingredientId); + return ApplicationResponse.ok("식재료 리스트가 삭제되었습니다."); + } + + // 테스트 조회 + @GetMapping("/test") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "테스트 결과 조회", + useReturnTypeSchema = true + ) + } + ) + @Operation(summary = "테스트 결과 조회 API", description = "테스트 결과 조회 API 입니다.") + public ApplicationResponse findTestResult( + @UserResolver User user + ) { + + TestResultType type = cuisineFindUseCase.findTestResult(user); + return ApplicationResponse.ok(type); + } + + // 테스트 결과 + @PostMapping("/test") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "테스트 결과 저장", + useReturnTypeSchema = true + ) + } + ) + @Operation(summary = "테스트 결과 저장 API", description = "테스트 결과 저장 API 입니다.") + public ApplicationResponse saveTestResult( + @UserResolver User user, + @RequestBody TestResultType resultType) { + + cuisineSaveUseCase.saveCuisineTest(user, resultType); + return ApplicationResponse.ok("결과가 저장되었습니다."); + } + + // 조리법 결과 가져오기 + @PostMapping("/recipe") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "조리법 결과 가져오기", + useReturnTypeSchema = true + ) + } + ) + @Operation(summary = "조리법 결과 가져오기 API", description = "조리법 결과 가져오기 API 입니다.") + public ApplicationResponse> findRecipeResult( + @RequestBody RecipeDTO.Request request) throws URISyntaxException { + + final List recipeResult = cuisineFindUseCase.findRecipeResult(request); + return ApplicationResponse.ok(recipeResult); + } + +} diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/presentation/QuisineController.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/presentation/QuisineController.java deleted file mode 100644 index 69d9182..0000000 --- a/api-module/src/main/java/com/foodgo/apimodule/cuisine/presentation/QuisineController.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.foodgo.apimodule.cuisine.presentation; - -import com.foodgo.apimodule.cuisine.application.QuisineFindUseCase; -import com.foodgo.apimodule.cuisine.application.QuisineSaveUseCase; -import com.foodgo.apimodule.cuisine.dto.IngredientAddReq; -import com.foodgo.apimodule.cuisine.dto.IngredientInfo; -import com.foodgo.commonmodule.common.ApplicationResponse; -import com.foodgo.coremodule.security.annotation.UserResolver; -import com.foodgo.coremodule.user.domain.User; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -@RequiredArgsConstructor -@RestController -@RequestMapping("/api/v1/quisine") -@Validated -@Tag(name = "Quisine", description = "음식 추천 관련 API") -public class QuisineController { - - private final QuisineFindUseCase quisineFindUseCase; - private final QuisineSaveUseCase quisineSaveUseCase; - - // 전체 조회 - @GetMapping - @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "식재료 리스트 확인 성공", - useReturnTypeSchema = true - ) - } - ) - @Operation(summary = "식재료 리스트 확인 API", description = "식재료 리스트 확인 API 입니다.") - public ApplicationResponse> findIngredientList(@UserResolver User user) { - - final List ingredientInfo = quisineFindUseCase.findIngredientInfo(user); - return ApplicationResponse.ok(ingredientInfo); - } - - // 식재료 추가하기 - @PostMapping - @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "식재료 리스트 추가 성공", - useReturnTypeSchema = true - ) - } - ) - @Operation(summary = "식재료 리스트 추가 API", description = "식재료 리스트 추가 API 입니다.") - public ApplicationResponse addIngredientList(@UserResolver User user, - @RequestPart(value = "dto") IngredientAddReq addReq, - @RequestPart(value = "file") MultipartFile multipartFile) { - - quisineSaveUseCase.saveIngredient(addReq, multipartFile, user); - return ApplicationResponse.ok("식재료 리스트 추가되었습니다."); - } - - // 식재료 삭제하기 - @DeleteMapping("{ingredientId}") - @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "식재료 리스트 삭제 성공", - useReturnTypeSchema = true - ) - } - ) - @Operation(summary = "식재료 리스트 삭제 API", description = "식재료 리스트 삭제 API 입니다.") - public ApplicationResponse deleteIngredient(@PathVariable Long ingredientId) { - - quisineSaveUseCase.deleteIngredient(ingredientId); - return ApplicationResponse.ok("식재료 리스트가 삭제되었습니다."); - } - -} diff --git a/core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/CuisineTest.java b/core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/CuisineTest.java new file mode 100644 index 0000000..fd40a2a --- /dev/null +++ b/core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/CuisineTest.java @@ -0,0 +1,32 @@ +package com.foodgo.coremodule.cuisine.domain; + +import com.fasterxml.jackson.annotation.JsonValue; +import com.foodgo.coremodule.user.domain.User; +import jakarta.persistence.*; +import lombok.*; + +@Builder +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Entity +@Table(name = "cuisine_test") +public class CuisineTest { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "cuisine_test_id") + private Long id; + + @Column(name = "cuisine_test_type") + private TestType type; + + @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) + @JoinColumn(name = "user_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private User user; + + @JsonValue + public String getTypeValue() { + return type.getDescription(); + } +} diff --git a/core-module/src/main/java/com/foodgo/coremodule/quisine/domain/Ingredient.java b/core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/Ingredient.java similarity index 94% rename from core-module/src/main/java/com/foodgo/coremodule/quisine/domain/Ingredient.java rename to core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/Ingredient.java index 5a4038c..859146e 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/quisine/domain/Ingredient.java +++ b/core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/Ingredient.java @@ -1,4 +1,4 @@ -package com.foodgo.coremodule.quisine.domain; +package com.foodgo.coremodule.cuisine.domain; import com.foodgo.commonmodule.common.BaseEntity; import com.foodgo.coremodule.user.domain.User; diff --git a/core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/TestType.java b/core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/TestType.java new file mode 100644 index 0000000..0cab84f --- /dev/null +++ b/core-module/src/main/java/com/foodgo/coremodule/cuisine/domain/TestType.java @@ -0,0 +1,22 @@ +package com.foodgo.coremodule.cuisine.domain; + +public enum TestType { + + SOCIAL("사회적 미식가"), + ENERGY("에너지 운동가"), + ADVENTUROUS("모험심 가득한 미식가"), + HEALTHY("건강한 미식가"), + CONVENIENT("간편 요리사") + ; + + private final String description; + + TestType(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } +} + diff --git a/core-module/src/main/java/com/foodgo/coremodule/quisine/exception/QuisineErrorCode.java b/core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineErrorCode.java similarity index 83% rename from core-module/src/main/java/com/foodgo/coremodule/quisine/exception/QuisineErrorCode.java rename to core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineErrorCode.java index cabb720..da449d4 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/quisine/exception/QuisineErrorCode.java +++ b/core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineErrorCode.java @@ -1,4 +1,4 @@ -package com.foodgo.coremodule.quisine.exception; +package com.foodgo.coremodule.cuisine.exception; import com.foodgo.commonmodule.common.ApiResponse; import com.foodgo.commonmodule.common.BaseErrorCode; @@ -8,7 +8,7 @@ @Getter @AllArgsConstructor -public enum QuisineErrorCode implements BaseErrorCode { +public enum CuisineErrorCode implements BaseErrorCode { NO_INGREDIENT_INFO(HttpStatus.BAD_REQUEST, "2000", "식재료가 존재하지 않습니다."); diff --git a/core-module/src/main/java/com/foodgo/coremodule/quisine/exception/QuisineException.java b/core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineException.java similarity index 58% rename from core-module/src/main/java/com/foodgo/coremodule/quisine/exception/QuisineException.java rename to core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineException.java index f5e1e9e..3f2b9f3 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/quisine/exception/QuisineException.java +++ b/core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineException.java @@ -1,21 +1,21 @@ -package com.foodgo.coremodule.quisine.exception; +package com.foodgo.coremodule.cuisine.exception; import com.foodgo.commonmodule.common.BaseErrorCode; import lombok.Getter; @Getter -public class QuisineException extends RuntimeException { +public class CuisineException extends RuntimeException { private final BaseErrorCode errorCode; private final Throwable cause; - public QuisineException(BaseErrorCode errorCode) { + public CuisineException(BaseErrorCode errorCode) { this.errorCode = errorCode; this.cause = null; } - public QuisineException(BaseErrorCode errorCode, Throwable cause) { + public CuisineException(BaseErrorCode errorCode, Throwable cause) { this.errorCode = errorCode; this.cause = cause; } diff --git a/core-module/src/main/java/com/foodgo/coremodule/cuisine/repository/CuisineTestRepository.java b/core-module/src/main/java/com/foodgo/coremodule/cuisine/repository/CuisineTestRepository.java new file mode 100644 index 0000000..0e9247d --- /dev/null +++ b/core-module/src/main/java/com/foodgo/coremodule/cuisine/repository/CuisineTestRepository.java @@ -0,0 +1,9 @@ +package com.foodgo.coremodule.cuisine.repository; + +import com.foodgo.coremodule.cuisine.domain.CuisineTest; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CuisineTestRepository extends JpaRepository { + + CuisineTest findCuisineTestByUserId(Long userId); +} diff --git a/core-module/src/main/java/com/foodgo/coremodule/quisine/repository/IngredientRepository.java b/core-module/src/main/java/com/foodgo/coremodule/cuisine/repository/IngredientRepository.java similarity index 68% rename from core-module/src/main/java/com/foodgo/coremodule/quisine/repository/IngredientRepository.java rename to core-module/src/main/java/com/foodgo/coremodule/cuisine/repository/IngredientRepository.java index a3bb174..56d4c9d 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/quisine/repository/IngredientRepository.java +++ b/core-module/src/main/java/com/foodgo/coremodule/cuisine/repository/IngredientRepository.java @@ -1,6 +1,6 @@ -package com.foodgo.coremodule.quisine.repository; +package com.foodgo.coremodule.cuisine.repository; -import com.foodgo.coremodule.quisine.domain.Ingredient; +import com.foodgo.coremodule.cuisine.domain.Ingredient; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; diff --git a/core-module/src/main/java/com/foodgo/coremodule/cuisine/service/CuisineQueryService.java b/core-module/src/main/java/com/foodgo/coremodule/cuisine/service/CuisineQueryService.java new file mode 100644 index 0000000..837ea70 --- /dev/null +++ b/core-module/src/main/java/com/foodgo/coremodule/cuisine/service/CuisineQueryService.java @@ -0,0 +1,46 @@ +package com.foodgo.coremodule.cuisine.service; + +import com.foodgo.coremodule.cuisine.domain.CuisineTest; +import com.foodgo.coremodule.cuisine.domain.Ingredient; +import com.foodgo.coremodule.cuisine.domain.TestType; +import com.foodgo.coremodule.cuisine.exception.CuisineErrorCode; +import com.foodgo.coremodule.cuisine.exception.CuisineException; +import com.foodgo.coremodule.cuisine.repository.CuisineTestRepository; +import com.foodgo.coremodule.cuisine.repository.IngredientRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class CuisineQueryService { + + private final IngredientRepository ingredientRepository; + private final CuisineTestRepository cuisineTestRepository; + + public Ingredient findById(Long id) { + return ingredientRepository.findById(id).orElseThrow(() -> new CuisineException(CuisineErrorCode.NO_INGREDIENT_INFO)); + } + + public List findIngredientsByUserId(Long userId) { + return ingredientRepository.findIngredientsByUserId(userId); + } + + public void saveIngredient(Ingredient ingredient) { + ingredientRepository.save(ingredient); + } + + public void deleteIngredient(Long id) { + Ingredient ingredient = findById(id); + ingredientRepository.delete(ingredient); + } + + public void saveCuisineTest(CuisineTest cuisineTest) { + cuisineTestRepository.save(cuisineTest); + } + + public TestType findTestType(Long userId) { + return cuisineTestRepository.findCuisineTestByUserId(userId).getType(); + } +} diff --git a/core-module/src/main/java/com/foodgo/coremodule/quisine/service/QuisineQueryService.java b/core-module/src/main/java/com/foodgo/coremodule/quisine/service/QuisineQueryService.java deleted file mode 100644 index ba6b727..0000000 --- a/core-module/src/main/java/com/foodgo/coremodule/quisine/service/QuisineQueryService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.foodgo.coremodule.quisine.service; - -import com.foodgo.coremodule.quisine.domain.Ingredient; -import com.foodgo.coremodule.quisine.exception.QuisineErrorCode; -import com.foodgo.coremodule.quisine.exception.QuisineException; -import com.foodgo.coremodule.quisine.repository.IngredientRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Service -@RequiredArgsConstructor -@Transactional -public class QuisineQueryService { - - private final IngredientRepository ingredientRepository; - - public Ingredient findById(Long id) { - return ingredientRepository.findById(id).orElseThrow(() -> new QuisineException(QuisineErrorCode.NO_INGREDIENT_INFO)); - } - - public List findIngredientsByUserId(Long userId) { - return ingredientRepository.findIngredientsByUserId(userId); - } - - public void saveIngredient(Ingredient ingredient) { - ingredientRepository.save(ingredient); - } - - public void deleteIngredient(Long id) { - Ingredient ingredient = findById(id); - ingredientRepository.delete(ingredient); - } -} From 70fbf43d8bfed66813e9cff2edf3176f077a7ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A0=95=ED=9B=84?= Date: Fri, 9 Aug 2024 21:15:32 +0900 Subject: [PATCH 4/7] fix: ingredient key change --- .../apimodule/ingredient/application/IngredientFindUseCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-module/src/main/java/com/foodgo/apimodule/ingredient/application/IngredientFindUseCase.java b/api-module/src/main/java/com/foodgo/apimodule/ingredient/application/IngredientFindUseCase.java index f095121..feebb61 100644 --- a/api-module/src/main/java/com/foodgo/apimodule/ingredient/application/IngredientFindUseCase.java +++ b/api-module/src/main/java/com/foodgo/apimodule/ingredient/application/IngredientFindUseCase.java @@ -16,7 +16,7 @@ @RequiredArgsConstructor public class IngredientFindUseCase { - @Value("${spring.openapi.key.recipe}") + @Value("${spring.openapi.key.ingredient}") private String apiKey; public IngredientGetResponse.Row getIngredient(User user, IngredientGetRequest request) throws URISyntaxException { From 98b6066352f6088612e8fece30614968009c35d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A0=95=ED=9B=84?= Date: Fri, 9 Aug 2024 21:20:40 +0900 Subject: [PATCH 5/7] test: for feature deploy --- .github/workflows/cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 36c2984..706015c 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -2,7 +2,7 @@ name: Backend CD # actions 이름 on: push: - branches: [ develop ] + branches: [ feature/#8 ] jobs: deploy: From 3b3a608d3eb084719884f77b9583f25375f33cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A0=95=ED=9B=84?= Date: Fri, 9 Aug 2024 21:35:09 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20cuisine=20exception=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apimodule/cuisine/application/CuisineFindUseCase.java | 4 +++- .../foodgo/coremodule/cuisine/exception/CuisineErrorCode.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineFindUseCase.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineFindUseCase.java index 33f8a5d..27d9e33 100644 --- a/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineFindUseCase.java +++ b/api-module/src/main/java/com/foodgo/apimodule/cuisine/application/CuisineFindUseCase.java @@ -6,6 +6,8 @@ import com.foodgo.apimodule.ingredient.mapper.IngredientMapper; import com.foodgo.coremodule.cuisine.domain.Ingredient; import com.foodgo.coremodule.cuisine.domain.TestType; +import com.foodgo.coremodule.cuisine.exception.CuisineErrorCode; +import com.foodgo.coremodule.cuisine.exception.CuisineException; import com.foodgo.coremodule.cuisine.service.CuisineQueryService; import com.foodgo.coremodule.user.domain.User; import lombok.RequiredArgsConstructor; @@ -59,7 +61,7 @@ public List findRecipeResult(RecipeDTO.Request request) .retrieve() .bodyToMono(RecipeDTO.TotalResponse.class) .doOnError(error -> { - throw new RuntimeException("API 호출 오류: " + error.getMessage()); + throw new CuisineException(CuisineErrorCode.OPEN_API_INFO_ERROR); }) .block(); diff --git a/core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineErrorCode.java b/core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineErrorCode.java index da449d4..fd95934 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineErrorCode.java +++ b/core-module/src/main/java/com/foodgo/coremodule/cuisine/exception/CuisineErrorCode.java @@ -10,7 +10,9 @@ @AllArgsConstructor public enum CuisineErrorCode implements BaseErrorCode { - NO_INGREDIENT_INFO(HttpStatus.BAD_REQUEST, "2000", "식재료가 존재하지 않습니다."); + NO_INGREDIENT_INFO(HttpStatus.BAD_REQUEST, "2000", "식재료가 존재하지 않습니다."), + OPEN_API_INFO_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "3000", "OPEN API 호출에 실패했습니다."), + ; private final HttpStatus httpStatus; private final String code; From 2f78e9f418f4bcaba67b3e931d8729a15c9ae9de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A0=95=ED=9B=84?= Date: Sat, 10 Aug 2024 16:02:27 +0900 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20image=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apimodule/cuisine/dto/RecipeDTO.java | 34 +++++-------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/RecipeDTO.java b/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/RecipeDTO.java index 50cb0e0..157a52b 100644 --- a/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/RecipeDTO.java +++ b/api-module/src/main/java/com/foodgo/apimodule/cuisine/dto/RecipeDTO.java @@ -6,17 +6,19 @@ public class RecipeDTO { public record Request( String rcpNm // 메뉴명 - ) {} + ) { + } // 전체 응답을 나타내는 클래스 - public record TotalResponse ( + public record TotalResponse( CookRcp COOKRCP01 ) { public record CookRcp( String total_count, List row, // 여러 개의 레시피 데이터를 포함하는 리스트 Result RESULT - ) {} + ) { + } } // 개별 레시피 데이터를 나타내는 클래스 @@ -55,32 +57,14 @@ public record RecipeDetail( String MANUAL18, // 조리법 18 String MANUAL19, // 조리법 19 String MANUAL20, // 조리법 20 - String MANUAL_IMG01, // 조리법 이미지 1 - String MANUAL_IMG02, // 조리법 이미지 2 - String MANUAL_IMG03, // 조리법 이미지 3 - String MANUAL_IMG04, // 조리법 이미지 4 - String MANUAL_IMG05, // 조리법 이미지 5 - String MANUAL_IMG06, // 조리법 이미지 6 - String MANUAL_IMG07, // 조리법 이미지 7 - String MANUAL_IMG08, // 조리법 이미지 8 - String MANUAL_IMG09, // 조리법 이미지 9 - String MANUAL_IMG10, // 조리법 이미지 10 - String MANUAL_IMG11, // 조리법 이미지 11 - String MANUAL_IMG12, // 조리법 이미지 12 - String MANUAL_IMG13, // 조리법 이미지 13 - String MANUAL_IMG14, // 조리법 이미지 14 - String MANUAL_IMG15, // 조리법 이미지 15 - String MANUAL_IMG16, // 조리법 이미지 16 - String MANUAL_IMG17, // 조리법 이미지 17 - String MANUAL_IMG18, // 조리법 이미지 18 - String MANUAL_IMG19, // 조리법 이미지 19 - String MANUAL_IMG20, // 조리법 이미지 20 String RCP_NA_TIP // 저감 조리법 TIP - ) {} + ) { + } // 결과 메시지를 나타내는 클래스 public record Result( String MSG, String CODE - ) {} + ) { + } }