From 0afd47497f6b280ccb78b6390874a8340f541c6a Mon Sep 17 00:00:00 2001 From: SeHwan Bong Date: Tue, 26 Dec 2023 17:03:24 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20HEEXE=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EC=B6=94=EC=B2=9C=20=EC=A0=84=EB=9E=B5=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?#138=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/adaptor/ProductAdaptor.java | 4 ++ .../repository/ProductCustomRepository.java | 2 + .../ProductCustomRepositoryImpl.java | 11 +++ .../strategy/HEEXERecommendationStrategy.java | 71 +++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 Domain/src/main/java/tify/server/domain/domains/question/strategy/HEEXERecommendationStrategy.java diff --git a/Domain/src/main/java/tify/server/domain/domains/product/adaptor/ProductAdaptor.java b/Domain/src/main/java/tify/server/domain/domains/product/adaptor/ProductAdaptor.java index 0c851dab..9b6d06d8 100644 --- a/Domain/src/main/java/tify/server/domain/domains/product/adaptor/ProductAdaptor.java +++ b/Domain/src/main/java/tify/server/domain/domains/product/adaptor/ProductAdaptor.java @@ -52,4 +52,8 @@ public List findAllBySmallCategoryId( ProductCategoryCondition productCategoryCondition) { return productRepository.findAllBySmallCategory(productCategoryCondition); } + + public List queryAllByCategoryName(String categoryName) { + return productRepository.searchAllByCategoryName(categoryName); + } } diff --git a/Domain/src/main/java/tify/server/domain/domains/product/repository/ProductCustomRepository.java b/Domain/src/main/java/tify/server/domain/domains/product/repository/ProductCustomRepository.java index 0ba484d0..21554f42 100644 --- a/Domain/src/main/java/tify/server/domain/domains/product/repository/ProductCustomRepository.java +++ b/Domain/src/main/java/tify/server/domain/domains/product/repository/ProductCustomRepository.java @@ -24,4 +24,6 @@ Slice searchBySmallCategory( List findAllBySmallCategory( ProductCategoryCondition productCategoryCondition); + + List searchAllByCategoryName(String categoryName); } diff --git a/Domain/src/main/java/tify/server/domain/domains/product/repository/ProductCustomRepositoryImpl.java b/Domain/src/main/java/tify/server/domain/domains/product/repository/ProductCustomRepositoryImpl.java index cf53d61d..7000949c 100644 --- a/Domain/src/main/java/tify/server/domain/domains/product/repository/ProductCustomRepositoryImpl.java +++ b/Domain/src/main/java/tify/server/domain/domains/product/repository/ProductCustomRepositoryImpl.java @@ -129,6 +129,17 @@ public List findAllBySmallCategory( .fetch(); } + @Override + public List searchAllByCategoryName(String categoryName) { + return queryFactory + .selectFrom(product) + .innerJoin(favorQuestionCategory) + .on( + favorQuestionCategory.id.eq(product.favorQuestionCategoryId), + favorQuestionCategory.name.eq(categoryName)) + .fetch(); + } + private OrderSpecifier[] orderByPrice(PriceOrder priceOrder) { List orderSpecifiers = new ArrayList<>(); if (priceOrder.equals(PRICE_ASC)) { diff --git a/Domain/src/main/java/tify/server/domain/domains/question/strategy/HEEXERecommendationStrategy.java b/Domain/src/main/java/tify/server/domain/domains/question/strategy/HEEXERecommendationStrategy.java new file mode 100644 index 00000000..5a361bf7 --- /dev/null +++ b/Domain/src/main/java/tify/server/domain/domains/question/strategy/HEEXERecommendationStrategy.java @@ -0,0 +1,71 @@ +package tify.server.domain.domains.question.strategy; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; +import tify.server.domain.domains.product.adaptor.ProductAdaptor; +import tify.server.domain.domains.product.domain.Product; +import tify.server.domain.domains.question.adaptor.FavorAnswerAdaptor; +import tify.server.domain.domains.question.domain.FavorAnswer; +import tify.server.domain.domains.question.dto.condition.FavorRecommendationDTO; + +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class HEEXERecommendationStrategy implements ProductRecommendationStrategy { + + private final ProductAdaptor productAdaptor; + private final FavorAnswerAdaptor favorAnswerAdaptor; + + private static final String CATEGORY_NAME = "HEEXE"; + + @Override + public List recommendation(Long userId, String categoryName, + List dto) { + + List recommendationDTO = getRecommendDTO(userId); + + List splitAnswer = Arrays.stream(recommendationDTO.get(0).getAnswer().split(", ")) + .toList(); + + if (splitAnswer.contains("그 외")) { + return etcStep(splitAnswer); + } else { + return specificStep(splitAnswer); + } + } + + private List getRecommendDTO(Long userId) { + List favorAnswers = new ArrayList<>(); + favorAnswers.add( + favorAnswerAdaptor.searchByCategoryNameAndNumber(userId, CATEGORY_NAME, 2L)); + return favorAnswers.stream().map(FavorRecommendationDTO::from).toList(); + } + + private List etcStep(List splitAnswer) { // 그 외 라는 답변 존재할 때 + if (splitAnswer.size() > 1) { // ex) 그 외, 헬스 + String answer = splitAnswer.stream().filter(s -> !s.contains("그 외")).toString(); + return productAdaptor.queryAllByCategoryNameAndCharacter(CATEGORY_NAME, answer); + } else { // ex) 그 외 + return productAdaptor.queryAllByCategoryName(CATEGORY_NAME); + } + } + + private List specificStep(List splitAnswer) { // 그 외 라는 답변 존재하지 않을 때 + List result = new ArrayList<>(); + if (splitAnswer.size() > 1) { // ex) 헬스, 요가&필라테스 + result.addAll(productAdaptor.queryAllByCategoryNameAndCharacter(CATEGORY_NAME, + splitAnswer.get(0))); + result.addAll(productAdaptor.queryAllByCategoryNameAndCharacter(CATEGORY_NAME, + splitAnswer.get(1))); + } else { // ex) 헬스 + result.addAll(productAdaptor.queryAllByCategoryNameAndCharacter(CATEGORY_NAME, + splitAnswer.get(0))); + } + return result; + } +}