Skip to content

Commit ed4f8d7

Browse files
authored
Merge branch 'dev' into test#179
2 parents 3d8d0d4 + dc3f499 commit ed4f8d7

File tree

45 files changed

+1464
-171
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1464
-171
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ dependencies {
5050

5151
// AWS S3
5252
implementation("io.awspring.cloud:spring-cloud-aws-starter-s3:3.4.0")
53+
implementation("com.amazonaws:aws-java-sdk-s3:1.12.777")
5354

5455
runtimeOnly("com.h2database:h2")
5556
runtimeOnly("com.mysql:mysql-connector-j")

src/main/java/com/back/domain/chatbot/controller/ChatbotController.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import com.back.domain.chatbot.dto.ChatRequestDto;
44
import com.back.domain.chatbot.dto.ChatResponseDto;
5+
import com.back.domain.chatbot.dto.SaveBotMessageDto;
56
import com.back.domain.chatbot.entity.ChatConversation;
67
import com.back.domain.chatbot.service.ChatbotService;
78
import com.back.global.rsData.RsData;
9+
import io.swagger.v3.oas.annotations.Operation;
810
import jakarta.validation.Valid;
911
import lombok.RequiredArgsConstructor;
1012
import lombok.extern.slf4j.Slf4j;
@@ -22,6 +24,7 @@ public class ChatbotController {
2224
private final ChatbotService chatbotService;
2325

2426
@PostMapping("/chat")
27+
@Operation(summary = "채팅 메시지 보내기", description = "자율형 대화 및 단계별 추천 두가지 모드 지원")
2528
public ResponseEntity<RsData<ChatResponseDto>> sendMessage(@Valid @RequestBody ChatRequestDto requestDto) {
2629
try {
2730
ChatResponseDto response = chatbotService.sendMessage(requestDto);
@@ -34,6 +37,7 @@ public ResponseEntity<RsData<ChatResponseDto>> sendMessage(@Valid @RequestBody C
3437
}
3538

3639
@GetMapping("/history/user/{userId}")
40+
@Operation(summary = "유저 대화 히스토리", description = "사용자 채팅 기록 조회")
3741
public ResponseEntity<RsData<List<ChatConversation>>> getUserChatHistory(@PathVariable Long userId) {
3842
try {
3943
List<ChatConversation> history = chatbotService.getUserChatHistory(userId);
@@ -44,4 +48,31 @@ public ResponseEntity<RsData<List<ChatConversation>>> getUserChatHistory(@PathVa
4448
.body(RsData.failOf("서버 오류가 발생했습니다."));
4549
}
4650
}
51+
52+
@PostMapping("/bot-message")
53+
@Operation(summary = "봇 메시지 저장", description = "FE에서 생성한 봇 메시지(인사말 등)를 DB에 저장")
54+
public ResponseEntity<RsData<ChatConversation>> saveBotMessage(@Valid @RequestBody SaveBotMessageDto requestDto) {
55+
try {
56+
ChatConversation savedMessage = chatbotService.saveBotMessage(requestDto);
57+
return ResponseEntity.ok(RsData.successOf(savedMessage));
58+
} catch (Exception e) {
59+
log.error("봇 메시지 저장 중 오류 발생: ", e);
60+
return ResponseEntity.internalServerError()
61+
.body(RsData.failOf("서버 오류가 발생했습니다."));
62+
}
63+
}
64+
65+
@PostMapping("/greeting/{userId}")
66+
@Operation(summary = "인사말 생성", description = "사용자가 채팅을 시작할 때 기본 인사말을 생성하고 저장")
67+
public ResponseEntity<RsData<ChatConversation>> createGreeting(@PathVariable Long userId) {
68+
try {
69+
ChatConversation greeting = chatbotService.createGreetingMessage(userId);
70+
return ResponseEntity.ok(RsData.successOf(greeting));
71+
} catch (Exception e) {
72+
log.error("인사말 생성 중 오류 발생: ", e);
73+
return ResponseEntity.internalServerError()
74+
.body(RsData.failOf("서버 오류가 발생했습니다."));
75+
}
76+
}
77+
4778
}

src/main/java/com/back/domain/chatbot/dto/ChatRequestDto.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.back.domain.chatbot.dto;
22

3+
import com.back.domain.cocktail.enums.AlcoholBaseType;
4+
import com.back.domain.cocktail.enums.AlcoholStrength;
5+
import com.back.domain.cocktail.enums.CocktailType;
36
import jakarta.validation.constraints.NotBlank;
47
import lombok.Getter;
58
import lombok.NoArgsConstructor;
@@ -13,6 +16,12 @@ public class ChatRequestDto {
1316
@NotBlank(message = "메시지는 필수입니다.")
1417
private String message;
1518

16-
1719
private Long userId;
20+
21+
// 단계별 추천 관련 필드들
22+
private boolean isStepRecommendation = false;
23+
private Integer currentStep;
24+
private AlcoholStrength selectedAlcoholStrength;
25+
private AlcoholBaseType selectedAlcoholBaseType;
26+
private CocktailType selectedCocktailType;
1827
}

src/main/java/com/back/domain/chatbot/dto/ChatResponseDto.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,17 @@ public class ChatResponseDto {
1616
private String response;
1717
private LocalDateTime timestamp;
1818

19+
// 단계별 추천 관련 필드 (선택사항)
20+
private StepRecommendationResponseDto stepRecommendation;
21+
1922
public ChatResponseDto(String response) {
2023
this.response = response;
2124
this.timestamp = LocalDateTime.now();
2225
}
26+
27+
public ChatResponseDto(String response, StepRecommendationResponseDto stepRecommendation) {
28+
this.response = response;
29+
this.timestamp = LocalDateTime.now();
30+
this.stepRecommendation = stepRecommendation;
31+
}
2332
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
package com.back.domain.chatbot.dto;
3+
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.NotNull;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
10+
11+
@Getter
12+
@Setter
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class SaveBotMessageDto {
16+
17+
@NotNull(message = "사용자 ID는 필수입니다.")
18+
private Long userId;
19+
20+
@NotBlank(message = "메시지 내용은 필수입니다.")
21+
private String message;
22+
23+
// 선택적: 메시지 타입 (GREETING, HELP, ERROR 등)
24+
private String messageType;
25+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.back.domain.chatbot.dto;
2+
3+
import com.back.domain.cocktail.dto.CocktailSummaryResponseDto;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Setter;
8+
9+
import java.util.List;
10+
11+
@Getter
12+
@Setter
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class StepRecommendationResponseDto {
16+
17+
private Integer currentStep; // 현재 단계
18+
private String stepTitle; // 단계 제목 (예: "원하시는 도수를 선택해주세요!")
19+
private List<StepOption> options; // 선택 옵션들
20+
private List<CocktailSummaryResponseDto> recommendations; // 최종 추천 칵테일 (4단계에서만)
21+
private boolean isCompleted; // 추천이 완료되었는지 여부
22+
23+
@Getter
24+
@Setter
25+
@NoArgsConstructor
26+
@AllArgsConstructor
27+
public static class StepOption {
28+
private String value; // enum 값 (예: "NON_ALCOHOLIC")
29+
private String label; // 화면에 표시될 텍스트 (예: "논알콜 (0%)")
30+
private String description; // 부가 설명 (선택사항)
31+
}
32+
}

src/main/java/com/back/domain/chatbot/entity/ChatConversation.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.back.domain.chatbot.entity;
22

3+
import com.back.domain.chatbot.enums.MessageSender;
34
import jakarta.persistence.*;
45
import lombok.*;
6+
import org.springframework.data.annotation.CreatedDate;
57

68
import java.time.LocalDateTime;
79

@@ -19,18 +21,17 @@ public class ChatConversation {
1921
@GeneratedValue(strategy = IDENTITY)
2022
private Long id;
2123

24+
@Column(nullable = false)
2225
private Long userId;
2326

24-
@Column(columnDefinition = "TEXT")
25-
private String userMessage;
27+
@Column(columnDefinition = "TEXT", nullable = false)
28+
private String message;
2629

27-
@Column(columnDefinition = "TEXT")
28-
private String botResponse;
30+
@Enumerated(EnumType.STRING)
31+
@Column(nullable = false, length = 20)
32+
@Builder.Default
33+
private MessageSender sender = MessageSender.USER;
2934

35+
@CreatedDate
3036
private LocalDateTime createdAt;
31-
32-
@PrePersist
33-
protected void onCreate() {
34-
createdAt = LocalDateTime.now();
35-
}
3637
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.back.domain.chatbot.enums;
2+
3+
public enum MessageSender {
4+
USER("사용자"),
5+
CHATBOT("챗봇");
6+
7+
private final String description;
8+
9+
MessageSender(String description) {
10+
this.description = description;
11+
}
12+
13+
public String getDescription() {
14+
return description;
15+
}
16+
}
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.back.domain.chatbot.repository;
22

33
import com.back.domain.chatbot.entity.ChatConversation;
4-
import org.springframework.data.domain.Page;
5-
import org.springframework.data.domain.Pageable;
64
import org.springframework.data.jpa.repository.JpaRepository;
75
import org.springframework.stereotype.Repository;
86

@@ -11,7 +9,7 @@
119
@Repository
1210
public interface ChatConversationRepository extends JpaRepository<ChatConversation, Long> {
1311

14-
Page<ChatConversation> findByUserIdOrderByCreatedAtDesc(Long userId, Pageable pageable);
12+
List<ChatConversation> findByUserIdOrderByCreatedAtDesc(Long userId);
1513

16-
List<ChatConversation> findTop5ByUserIdOrderByCreatedAtDesc(Long userId);
14+
List<ChatConversation> findTop20ByUserIdOrderByCreatedAtDesc(Long userId);
1715
}

0 commit comments

Comments
 (0)