Skip to content

Commit

Permalink
Merge pull request #100 from KUSITMS-MOAMOA/refactor/#99
Browse files Browse the repository at this point in the history
[Refactor/#99] : 외부 API 와 DB 호출 서비스 분리
  • Loading branch information
oosedus authored Nov 20, 2024
2 parents 22bac93 + fed5706 commit 56d339a
Show file tree
Hide file tree
Showing 4 changed files with 157 additions and 119 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package corecord.dev.domain.chat.application;

import corecord.dev.domain.chat.domain.converter.ChatConverter;
import corecord.dev.domain.chat.domain.entity.Chat;
import corecord.dev.domain.chat.domain.entity.ChatRoom;
import corecord.dev.domain.chat.domain.repository.ChatRepository;
import corecord.dev.domain.chat.domain.repository.ChatRoomRepository;
import corecord.dev.domain.user.domain.entity.User;
import corecord.dev.domain.user.domain.repository.UserRepository;
import corecord.dev.domain.chat.exception.ChatException;
import corecord.dev.domain.chat.status.ChatErrorStatus;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class ChatDbService {

private final ChatRepository chatRepository;
private final ChatRoomRepository chatRoomRepository;
private final UserRepository userRepository;

@Transactional
public ChatRoom createChatRoom(User user) {
ChatRoom chatRoom = ChatConverter.toChatRoomEntity(user);
return chatRoomRepository.save(chatRoom);
}

@Transactional
public Chat saveChat(int author, String content, ChatRoom chatRoom) {
Chat chat = ChatConverter.toChatEntity(author, content, chatRoom);
return chatRepository.save(chat);
}

public ChatRoom findChatRoomById(Long chatRoomId, User user) {
return chatRoomRepository.findByChatRoomIdAndUser(chatRoomId, user)
.orElseThrow(() -> new ChatException(ChatErrorStatus.CHAT_ROOM_NOT_FOUND));
}

public User findUserById(Long userId) {
return userRepository.findById(userId)
.orElseThrow(() -> new ChatException(ChatErrorStatus.CHAT_ROOM_NOT_FOUND));
}

@Transactional
public void deleteChatRoom(ChatRoom chatRoom) {
chatRepository.deleteByChatRoomId(chatRoom.getChatRoomId());
chatRoomRepository.delete(chatRoom);
}

public List<Chat> findChatsByChatRoom(ChatRoom chatRoom) {
return chatRepository.findByChatRoomOrderByChatId(chatRoom);
}

@Transactional
public void updateUserTmpChat(User user, Long chatRoomId) {
user.updateTmpChat(chatRoomId);
}

@Transactional
public void deleteUserTmpChat(User user) {
user.deleteTmpChat();
}
}
93 changes: 33 additions & 60 deletions src/main/java/corecord/dev/domain/chat/application/ChatService.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,26 +30,23 @@
@RequiredArgsConstructor
public class ChatService {

private final ChatRoomRepository chatRoomRepository;
private final ChatRepository chatRepository;
private final UserRepository userRepository;
private final ChatDbService chatDbService;
private final ClovaService clovaService;

/*
* user의 채팅방을 생성하고 생성된 채팅방 정보를 반환
* @param userId
* @return chatRoomDto
*/
@Transactional
public ChatResponse.ChatRoomDto createChatRoom(Long userId) {
User user = findUserById(userId);
User user = chatDbService.findUserById(userId);

// 채팅방 생성
ChatRoom chatRoom = ChatConverter.toChatRoomEntity(user);
chatRoomRepository.save(chatRoom);
ChatRoom chatRoom = chatDbService.createChatRoom(user);

// 첫번째 채팅 생성 - "안녕하세요! {nickName}님! {nickName}님의 경험이 궁금해요. {nickName}님의 경험을 들려주세요!"
Chat firstChat = createFirstChat(user, chatRoom);
String firstChatContent = String.format("안녕하세요! %s님\n오늘은 어떤 경험을 했나요?\n저와 함께 정리해보아요!", user.getNickName());
Chat firstChat = chatDbService.saveChat(0, firstChatContent, chatRoom);

return ChatConverter.toChatRoomDto(chatRoom, firstChat);
}
Expand All @@ -60,24 +57,22 @@ public ChatResponse.ChatRoomDto createChatRoom(Long userId) {
* @param chatDto
* @return
*/
@Transactional
public ChatResponse.ChatsDto createChat(Long userId, Long chatRoomId, ChatRequest.ChatDto chatDto) {
User user = findUserById(userId);
ChatRoom chatRoom = findChatRoomById(chatRoomId, user);
User user = chatDbService.findUserById(userId);
ChatRoom chatRoom = chatDbService.findChatRoomById(chatRoomId, user);

// 사용자 채팅 생성
Chat chat = ChatConverter.toChatEntity(1, chatDto.getContent(), chatRoom);
chatRepository.save(chat);
chatDbService.saveChat(1, chatDto.getContent(), chatRoom);

// 가이드이면 가이드 채팅 생성
if(chatDto.isGuide()) {
if (chatDto.isGuide()) {
checkGuideChat(chatRoom);
return generateGuideChats(chatRoom);
}

// AI 답변 생성
String aiAnswer = createChatAiAnswer(chatRoom, chatDto.getContent());
Chat aiChat = chatRepository.save(ChatConverter.toChatEntity(0, aiAnswer, chatRoom));
Chat aiChat = chatDbService.saveChat(0, aiAnswer, chatRoom);

return ChatConverter.toChatsDto(List.of(aiChat));
}
Expand All @@ -89,9 +84,9 @@ public ChatResponse.ChatsDto createChat(Long userId, Long chatRoomId, ChatReques
* @return chatListDto
*/
public ChatResponse.ChatListDto getChatList(Long userId, Long chatRoomId) {
User user = findUserById(userId);
ChatRoom chatRoom = findChatRoomById(chatRoomId, user);
List<Chat> chatList = chatRepository.findByChatRoomOrderByChatId(chatRoom);
User user = chatDbService.findUserById(userId);
ChatRoom chatRoom = chatDbService.findChatRoomById(chatRoomId, user);
List<Chat> chatList = chatDbService.findChatsByChatRoom(chatRoom);

return ChatConverter.toChatListDto(chatList);
}
Expand All @@ -101,15 +96,13 @@ public ChatResponse.ChatListDto getChatList(Long userId, Long chatRoomId) {
* @param userId
* @param chatRoomId
*/
@Transactional
public void deleteChatRoom(Long userId, Long chatRoomId) {
User user = findUserById(userId);
ChatRoom chatRoom = findChatRoomById(chatRoomId, user);
User user = chatDbService.findUserById(userId);
ChatRoom chatRoom = chatDbService.findChatRoomById(chatRoomId, user);

// 임시 저장된 ChatRoom 인지 확인 후 삭제
checkTmpChat(user, chatRoom);
chatRepository.deleteByChatRoomId(chatRoomId);
chatRoomRepository.delete(chatRoom);
chatDbService.deleteChatRoom(chatRoom);
}

/*
Expand All @@ -119,9 +112,9 @@ public void deleteChatRoom(Long userId, Long chatRoomId) {
* @return chatSummaryDto
*/
public ChatResponse.ChatSummaryDto getChatSummary(Long userId, Long chatRoomId) {
User user = findUserById(userId);
ChatRoom chatRoom = findChatRoomById(chatRoomId, user);
List<Chat> chatList = chatRepository.findByChatRoomOrderByChatId(chatRoom);
User user = chatDbService.findUserById(userId);
ChatRoom chatRoom = chatDbService.findChatRoomById(chatRoomId, user);
List<Chat> chatList = chatDbService.findChatsByChatRoom(chatRoom);

// 사용자 입력 없이 저장하려는 경우 체크
validateChatList(chatList);
Expand All @@ -141,13 +134,13 @@ public ChatResponse.ChatSummaryDto getChatSummary(Long userId, Long chatRoomId)
*/
@Transactional
public ChatResponse.ChatTmpDto getChatTmp(Long userId) {
User user = findUserById(userId);
if(user.getTmpChat() == null) {
User user = chatDbService.findUserById(userId);
if (user.getTmpChat() == null) {
return ChatConverter.toNotExistingChatTmpDto();
}
// 임시 채팅 제거 후 반환
Long chatRoomId = user.getTmpChat();
user.deleteTmpChat();
chatDbService.deleteUserTmpChat(user);
return ChatConverter.toExistingChatTmpDto(chatRoomId);
}

Expand All @@ -158,27 +151,25 @@ public ChatResponse.ChatTmpDto getChatTmp(Long userId) {
*/
@Transactional
public void saveChatTmp(Long userId, Long chatRoomId) {
User user = findUserById(userId);
ChatRoom chatRoom = findChatRoomById(chatRoomId, user);
User user = chatDbService.findUserById(userId);
ChatRoom chatRoom = chatDbService.findChatRoomById(chatRoomId, user);

// 이미 임시 저장된 채팅방이 있는 경우
if(user.getTmpChat() != null) {
if (user.getTmpChat() != null) {
throw new ChatException(ChatErrorStatus.TMP_CHAT_EXIST);
}
user.updateTmpChat(chatRoom.getChatRoomId());
chatDbService.updateUserTmpChat(user, chatRoom.getChatRoomId());
}

private static void checkGuideChat(ChatRoom chatRoom) {
if(chatRoom.getChatList().size() > 2) {
if (chatRoom.getChatList().size() > 2) {
throw new ChatException(ChatErrorStatus.INVALID_GUIDE_CHAT);
}
}

private ChatResponse.ChatsDto generateGuideChats(ChatRoom chatRoom) {
Chat guideChat1 = ChatConverter.toChatEntity(0, "걱정 마세요!\n저와 대화하다 보면 경험이 정리될 거예요\uD83D\uDCDD", chatRoom);
Chat guideChat2 = ChatConverter.toChatEntity(0, "오늘은 어떤 경험을 했나요?\n상황과 해결한 문제를 말해주세요!", chatRoom);
chatRepository.save(guideChat1);
chatRepository.save(guideChat2);
Chat guideChat1 = chatDbService.saveChat(0, "걱정 마세요!\n저와 대화하다 보면 경험이 정리될 거예요\uD83D\uDCDD", chatRoom);
Chat guideChat2 = chatDbService.saveChat(0, "오늘은 어떤 경험을 했나요?\n상황과 해결한 문제를 말해주세요!", chatRoom);
return ChatConverter.toChatsDto(List.of(guideChat1, guideChat2));
}

Expand All @@ -197,7 +188,7 @@ private static void validateResponse(ChatSummaryAiResponse response) {
}

private static void validateChatList(List<Chat> chatList) {
if(chatList.size() <= 1) {
if (chatList.size() <= 1) {
throw new ChatException(ChatErrorStatus.NO_RECORD);
}
}
Expand All @@ -218,36 +209,18 @@ private ChatSummaryAiResponse parseChatSummaryResponse(String aiResponse) {
}

private void checkTmpChat(User user, ChatRoom chatRoom) {
if(user.getTmpChat() == null) {
if (user.getTmpChat() == null) {
return;
}
if(user.getTmpChat().equals(chatRoom.getChatRoomId())) {
if (user.getTmpChat().equals(chatRoom.getChatRoomId())) {
user.deleteTmpChat();
}
}

private String createChatAiAnswer(ChatRoom chatRoom, String userInput) {
List<Chat> chatHistory = chatRepository.findByChatRoomOrderByChatId(chatRoom);
List<Chat> chatHistory = chatDbService.findChatsByChatRoom(chatRoom);
ClovaRequest clovaRequest = ClovaRequest.createChatRequest(chatHistory, userInput);
return clovaService.generateAiResponse(clovaRequest);
}

private ChatRoom findChatRoomById(Long chatRoomId, User user) {
return chatRoomRepository.findByChatRoomIdAndUser(chatRoomId, user)
.orElseThrow(() -> new ChatException(ChatErrorStatus.CHAT_ROOM_NOT_FOUND));
}

private Chat createFirstChat(User user, ChatRoom chatRoom) {
String nickName = user.getNickName();
String firstChatContent = String.format("안녕하세요! %s님\n오늘은 어떤 경험을 했나요?\n저와 함께 정리해보아요!", nickName);
Chat chat = ChatConverter.toChatEntity(0, firstChatContent, chatRoom);
chatRepository.save(chat);
return chat;
}

private User findUserById(Long userId) {
return userRepository.findById(userId)
.orElseThrow(() -> new GeneralException(ErrorStatus.UNAUTHORIZED));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,22 @@

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

public class FolderRequest {

@Data @Builder
@AllArgsConstructor @NoArgsConstructor
public static class FolderDto {
@NotBlank(message = "폴더 명을 입력해주세요.")
private String title;
}

@Data @Builder
@AllArgsConstructor @NoArgsConstructor
public static class FolderUpdateDto {
@NotNull(message = "수정할 폴더 id를 입력해주세요.")
private Long folderId;
Expand Down
Loading

0 comments on commit 56d339a

Please sign in to comment.