Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import com.back.domain.chatbot.dto.ChatRequestDto;
import com.back.domain.chatbot.dto.ChatResponseDto;
import com.back.domain.chatbot.dto.SaveBotMessageDto;
import com.back.domain.chatbot.entity.ChatConversation;
import com.back.domain.chatbot.service.ChatbotService;
import com.back.global.rsData.RsData;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -22,6 +24,7 @@ public class ChatbotController {
private final ChatbotService chatbotService;

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

@GetMapping("/history/user/{userId}")
@Operation(summary = "유저 대화 히스토리", description = "사용자 채팅 기록 조회")
public ResponseEntity<RsData<List<ChatConversation>>> getUserChatHistory(@PathVariable Long userId) {
try {
List<ChatConversation> history = chatbotService.getUserChatHistory(userId);
Expand All @@ -45,4 +49,30 @@ public ResponseEntity<RsData<List<ChatConversation>>> getUserChatHistory(@PathVa
}
}

@PostMapping("/bot-message")
@Operation(summary = "봇 메시지 저장", description = "FE에서 생성한 봇 메시지(인사말 등)를 DB에 저장")
public ResponseEntity<RsData<ChatConversation>> saveBotMessage(@Valid @RequestBody SaveBotMessageDto requestDto) {
try {
ChatConversation savedMessage = chatbotService.saveBotMessage(requestDto);
return ResponseEntity.ok(RsData.successOf(savedMessage));
} catch (Exception e) {
log.error("봇 메시지 저장 중 오류 발생: ", e);
return ResponseEntity.internalServerError()
.body(RsData.failOf("서버 오류가 발생했습니다."));
}
}

@PostMapping("/greeting/{userId}")
@Operation(summary = "인사말 생성", description = "사용자가 채팅을 시작할 때 기본 인사말을 생성하고 저장")
public ResponseEntity<RsData<ChatConversation>> createGreeting(@PathVariable Long userId) {
try {
ChatConversation greeting = chatbotService.createGreetingMessage(userId);
return ResponseEntity.ok(RsData.successOf(greeting));
} catch (Exception e) {
log.error("인사말 생성 중 오류 발생: ", e);
return ResponseEntity.internalServerError()
.body(RsData.failOf("서버 오류가 발생했습니다."));
}
}

}
25 changes: 25 additions & 0 deletions src/main/java/com/back/domain/chatbot/dto/SaveBotMessageDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

package com.back.domain.chatbot.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class SaveBotMessageDto {

@NotNull(message = "사용자 ID는 필수입니다.")
private Long userId;

@NotBlank(message = "메시지 내용은 필수입니다.")
private String message;

// 선택적: 메시지 타입 (GREETING, HELP, ERROR 등)
private String messageType;
}
19 changes: 10 additions & 9 deletions src/main/java/com/back/domain/chatbot/entity/ChatConversation.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.back.domain.chatbot.entity;

import com.back.domain.chatbot.enums.MessageSender;
import jakarta.persistence.*;
import lombok.*;
import org.springframework.data.annotation.CreatedDate;

import java.time.LocalDateTime;

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

@Column(nullable = false)
private Long userId;

@Column(columnDefinition = "TEXT")
private String userMessage;
@Column(columnDefinition = "TEXT", nullable = false)
private String message;

@Column(columnDefinition = "TEXT")
private String botResponse;
@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 20)
@Builder.Default
private MessageSender sender = MessageSender.USER;

@CreatedDate
private LocalDateTime createdAt;

@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
}
}
16 changes: 16 additions & 0 deletions src/main/java/com/back/domain/chatbot/enums/MessageSender.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.back.domain.chatbot.enums;

public enum MessageSender {
USER("사용자"),
CHATBOT("챗봇");

private final String description;

MessageSender(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.back.domain.chatbot.repository;

import com.back.domain.chatbot.entity.ChatConversation;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

Expand All @@ -11,7 +9,7 @@
@Repository
public interface ChatConversationRepository extends JpaRepository<ChatConversation, Long> {

Page<ChatConversation> findByUserIdOrderByCreatedAtDesc(Long userId, Pageable pageable);
List<ChatConversation> findByUserIdOrderByCreatedAtDesc(Long userId);

List<ChatConversation> findTop5ByUserIdOrderByCreatedAtDesc(Long userId);
List<ChatConversation> findTop20ByUserIdOrderByCreatedAtDesc(Long userId);
}
Loading