Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ public class ChatRequestDto {
private boolean isStepRecommendation = false;

private Integer currentStep;
// "ALL" 처리를 위해 스텝 3개 String으로 변경
// "ALL" 처리를 위해 스텝 2개 String으로 변경
private String selectedAlcoholStrength;
private String selectedAlcoholBaseType;
private String selectedCocktailType;
// selectedCocktailType 삭제
}
3 changes: 2 additions & 1 deletion src/main/java/com/back/domain/chatbot/enums/MessageType.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ public enum MessageType {
RADIO_OPTIONS("라디오옵션"), // 라디오 버튼 선택지
CARD_LIST("카드리스트"), // 칵테일 추천 카드 리스트
LOADING("로딩중"), // 로딩 메시지
ERROR("에러"); // 에러 메시지
ERROR("에러"), // 에러 메시지
INPUT("입력"); // 텍스트 입력 요청

private final String description;

Expand Down
61 changes: 10 additions & 51 deletions src/main/java/com/back/domain/chatbot/service/ChatbotService.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import com.back.domain.cocktail.entity.Cocktail;
import com.back.domain.cocktail.enums.AlcoholBaseType;
import com.back.domain.cocktail.enums.AlcoholStrength;
import com.back.domain.cocktail.enums.CocktailType;
import com.back.domain.cocktail.repository.CocktailRepository;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -496,19 +495,16 @@ private ChatResponseDto handleStepRecommendation(ChatRequestDto requestDto) {
break;

case 3:
stepData = getCocktailTypeOptions(
parseAlcoholStrength(requestDto.getSelectedAlcoholStrength()),
parseAlcoholBaseType(requestDto.getSelectedAlcoholBaseType())
);
message = "완벽해요! 마지막으로 어떤 스타일로 즐기실 건가요? 🥃";
type = MessageType.RADIO_OPTIONS;
stepData = null;
message = "좋아요! 이제 원하는 칵테일 스타일을 자유롭게 말씀해주세요 💬\n 없으면 'x', 또는 '없음' 과 같이 입력해주세요!";
type = MessageType.INPUT;
break;

case 4:
stepData = getFinalRecommendations(
stepData = getFinalRecommendationsWithMessage(
parseAlcoholStrength(requestDto.getSelectedAlcoholStrength()),
parseAlcoholBaseType(requestDto.getSelectedAlcoholBaseType()),
parseCocktailType(requestDto.getSelectedCocktailType())
requestDto.getMessage()
);
message = stepData.getStepTitle();
type = MessageType.CARD_LIST; // 최종 추천은 카드 리스트
Expand Down Expand Up @@ -585,17 +581,6 @@ private AlcoholBaseType parseAlcoholBaseType(String value) {
}
}

private CocktailType parseCocktailType(String value) {
if (value == null || value.trim().isEmpty() || "ALL".equalsIgnoreCase(value)) {
return null;
}
try {
return CocktailType.valueOf(value);
} catch (IllegalArgumentException e) {
log.warn("Invalid CocktailType value: {}", value);
return null;
}
}

private StepRecommendationResponseDto getAlcoholStrengthOptions() {
List<StepRecommendationResponseDto.StepOption> options = new ArrayList<>();
Expand Down Expand Up @@ -651,47 +636,21 @@ private StepRecommendationResponseDto getAlcoholBaseTypeOptions(AlcoholStrength
);
}

private StepRecommendationResponseDto getCocktailTypeOptions(AlcoholStrength alcoholStrength, AlcoholBaseType alcoholBaseType) {
List<StepRecommendationResponseDto.StepOption> options = new ArrayList<>();

// "전체" 옵션 추가
options.add(new StepRecommendationResponseDto.StepOption(
"ALL",
"전체",
null
));

for (CocktailType cocktailType : CocktailType.values()) {
options.add(new StepRecommendationResponseDto.StepOption(
cocktailType.name(),
cocktailType.getDescription(),
null
));
}

return new StepRecommendationResponseDto(
3,
"어떤 종류의 잔으로 드시겠어요?",
options,
null,
false
);
}

private StepRecommendationResponseDto getFinalRecommendations(
private StepRecommendationResponseDto getFinalRecommendationsWithMessage(
AlcoholStrength alcoholStrength,
AlcoholBaseType alcoholBaseType,
CocktailType cocktailType) {
String userMessage) {
// 필터링 조건에 맞는 칵테일 검색
// "ALL" 선택 시 해당 필터를 null로 처리하여 전체 검색
List<AlcoholStrength> strengths = (alcoholStrength == null) ? null : List.of(alcoholStrength);
List<AlcoholBaseType> baseTypes = (alcoholBaseType == null) ? null : List.of(alcoholBaseType);
List<CocktailType> cocktailTypes = (cocktailType == null) ? null : List.of(cocktailType);

// userMessage를 키워드로 사용하여 검색
Page<Cocktail> cocktailPage = cocktailRepository.searchWithFilters(
null, // 키워드 없음
userMessage, // 사용자 입력 메시지를 키워드로 사용
strengths,
cocktailTypes,
null, // cocktailType 사용 안 함
baseTypes,
PageRequest.of(0, 3) // 최대 3개 추천
);
Expand Down