Skip to content

Commit eb0ff00

Browse files
committed
Merge branch 'feat/issue-24' into develop
2 parents e96f5e4 + 53a50fd commit eb0ff00

File tree

16 files changed

+181
-50
lines changed

16 files changed

+181
-50
lines changed

api/src/main/java/com/mbtips/common/exception/handler/GlobalExceptionHandler.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.mbtips.common.exception.handler;
22

33
import com.mbtips.common.exception.CustomException;
4+
import com.mbtips.common.exception.ErrorResponse;
45
import com.mbtips.common.exception.enums.CommonException;
56
import com.mbtips.common.response.ApiResponse;
67
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.http.HttpStatus;
79
import org.springframework.http.ResponseEntity;
810
import org.springframework.validation.FieldError;
911
import org.springframework.web.bind.MethodArgumentNotValidException;
@@ -18,9 +20,12 @@
1820
public class GlobalExceptionHandler {
1921

2022
@ExceptionHandler(CustomException.class)
21-
public ResponseEntity<Void> customExceptionHandler(CustomException e) {
23+
// 반환타입 void -> ErrorResponse, 클라이언트에서 코드, 메시지를 확인하도록
24+
public ResponseEntity<ErrorResponse> customExceptionHandler(CustomException e) {
2225
log.error("### CustomExceptionHandler : {}", e.getMessage(), e);
23-
return ResponseEntity.internalServerError().build();
26+
// return ResponseEntity.internalServerError().build();
27+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
28+
.body(new ErrorResponse(e.getException().getCode(), e.getException().getMessage()));
2429
}
2530

2631
@ExceptionHandler(IllegalArgumentException.class)
@@ -35,9 +40,6 @@ public ResponseEntity<Void> exceptionHandler(Exception e) {
3540
return ResponseEntity.internalServerError().build();
3641
}
3742

38-
/**
39-
* to-do customexception 적용하기
40-
*/
4143
@ExceptionHandler(MethodArgumentNotValidException.class)
4244
public ApiResponse<Void> exceptionsHandler(MethodArgumentNotValidException e) {
4345

@@ -50,8 +52,6 @@ public ApiResponse<Void> exceptionsHandler(MethodArgumentNotValidException e) {
5052
return ApiResponse.fail(CommonException.INVALID_REQUEST_ERROR);
5153
}
5254

53-
/**
54-
* VirtualFriendNotFoundException 구현 변경
55-
*/
55+
5656

5757
}

api/src/main/java/com/mbtips/domain/addition/service/AdditionService.java

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.mbtips.domain.addition.service;
22

33
import com.mbtips.clova.dto.Message;
4+
import com.mbtips.common.exception.CustomException;
5+
import com.mbtips.common.exception.enums.CommonException;
46
import com.mbtips.common.mbtiinfo.MbtiTraits;
57
import com.mbtips.common.mbtiinfo.MbtiType;
8+
import com.mbtips.domain.addtion.exception.AdditionException;
69
import com.mbtips.domain.conversation.service.ConversationService;
710
import com.mbtips.domain.converstation.Conversation;
811
import com.mbtips.domain.message.dto.response.GetMessageResponseDto;
@@ -14,6 +17,7 @@
1417
import lombok.RequiredArgsConstructor;
1518
import lombok.extern.slf4j.Slf4j;
1619
import org.springframework.stereotype.Service;
20+
import org.springframework.transaction.annotation.Transactional;
1721

1822
import java.util.ArrayList;
1923
import java.util.List;
@@ -27,6 +31,7 @@ public class AdditionService {
2731
public final ConversationService conversationService;
2832
public final MessageService messageService;
2933
public final VirtualFriendService virtualFriendService;
34+
3035
public String requestConversationTips(Long virtualFriendId) {
3136
VirtualFriendInfoResponse virtualFriend = virtualFriendService.findFriendInfoById(virtualFriendId);
3237

@@ -39,17 +44,25 @@ public String requestConversationTips(Long virtualFriendId) {
3944
}
4045

4146
public String requestTemperature(Long conversationId) {
42-
Conversation conversation = conversationService.findById(conversationId);
47+
4348
List<GetMessageResponseDto> messages = messageService.getMessagesOfConversationId(conversationId);
49+
log.debug("messages.size: {}", messages.size());
50+
StringBuilder messageBuilder = new StringBuilder();
4451

45-
String[] messageList = {
46-
"사용자: 안녕하세요, 오늘 기분이 어떠세요?",
47-
"AI: 안녕하세요, 오늘 기분이 활기차고 즐거워요.",
48-
"사용자: 오늘 특별한 계획이 있으세요?",
49-
"AI: 네, 친구와 함께 신나는 시간을 보낼 예정입니다."
50-
};
51-
String requestConversation = String.join(", ", messageList);
52-
String prompt = requestConversation + "현재까지의 대화 온도 측정해서 0~100 사이의 숫자로만 대답해줘 냉정하게 판단해주고, 숫자로만 대답해.";
52+
if(messages.size() <= 5) throw new CustomException(AdditionException.TOO_FEW_CONVERSATIONS);
53+
for(int i = messages.size() - 6; i < messages.size(); i++){
54+
if(messages.get(i).userId() != null) {
55+
messageBuilder.append("사용자 : ");
56+
messageBuilder.append(messages.get(i).messageContent());
57+
}
58+
if(messages.get(i).virtualFriendId() != null) {
59+
messageBuilder.append("가상 친구 : ");
60+
messageBuilder.append(messages.get(i).messageContent());
61+
}
62+
if(i != messages.size() -1 ) messageBuilder.append(", ");
63+
}
64+
log.debug("대화 내역 : {}", messageBuilder.toString());
65+
String prompt = messageBuilder + "현재까지의 대화 온도 측정해서 0~100 사이의 숫자로만 대답해줘 냉정하게 판단해주고, 숫자로만 대답해.";
5366
log.debug("prompt : {}", prompt);
5467
String temperatureResponse = messageManager.messageRequest(prompt);
5568
String result = temperatureResponse.replaceAll("[^0-9]", "");
Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
package com.mbtips.domain.fastfriend.service;
22

33
import com.mbtips.clova.client.ClovaApiFeignClient;
4+
import com.mbtips.common.exception.CustomException;
5+
import com.mbtips.common.mbtiinfo.MbtiTraits;
6+
import com.mbtips.common.mbtiinfo.MbtiType;
47
import com.mbtips.common.provider.ClovaApiKeyProvider;
58
import com.mbtips.domain.fastfriend.controller.dto.request.FastFriendMessageRequest;
69
import com.mbtips.domain.fastfriend.controller.dto.request.FastFriendRequest;
10+
import com.mbtips.domain.fastfriend.exception.FastFriendException;
711
import com.mbtips.fastfriend.FastFriendRepository;
812
import com.mbtips.fastfriend.entity.FastFriend;
913
import com.mbtips.message.application.manager.MessageManager;
1014
import lombok.RequiredArgsConstructor;
1115
import lombok.extern.slf4j.Slf4j;
1216
import org.springframework.stereotype.Service;
1317

18+
import java.util.Optional;
19+
1420

1521
@Service
1622
@RequiredArgsConstructor
@@ -20,10 +26,7 @@ public class FastFriendService {
2026
private final ClovaApiFeignClient clovaApiFeignClient;
2127
private final ClovaApiKeyProvider clovaApiKeyProvider;
2228
private final MessageManager messageManager;
23-
/**
24-
* to-do
25-
* - 가상친구생성api 호출 로직 작성
26-
*/
29+
2730
public Long createFastFriend(FastFriendRequest fastFriendRequest) {
2831
FastFriend friend = fastFriendRequest.toEntity(fastFriendRequest);
2932
FastFriend saveFriend = fastFriendRepository.save(friend);
@@ -33,8 +36,26 @@ public Long createFastFriend(FastFriendRequest fastFriendRequest) {
3336
}
3437

3538
public String messageRequest(FastFriendMessageRequest request) {
36-
String result = messageManager.messageRequest(request.content());
39+
FastFriend fastFriend = fastFriendRepository.findById(request.fastFriendId()).orElseThrow(() ->
40+
new CustomException(FastFriendException.NOT_FOUND));
41+
String prompt = getfastFriendPrompt(fastFriend);
42+
String result = messageManager.messageRequest(prompt + request.content());
3743
log.debug(result);
3844
return result;
3945
}
46+
47+
private String getfastFriendPrompt(FastFriend fastFriend) {
48+
StringBuilder result = new StringBuilder();
49+
50+
MbtiType mbtiType = MbtiType.valueOf(fastFriend.getMbti());
51+
result.append(MbtiTraits.getTrait(mbtiType));
52+
if(fastFriend.getFastFriendName() != null) result.append(" 너의 이름은 " + fastFriend.getFastFriendName() +"이야. ");
53+
if(fastFriend.getFastFriendAge() != 0) result.append(" 너의 나이는 " + fastFriend.getFastFriendAge() + "이야. ");
54+
if(fastFriend.getFastFriendSex() != null) result.append(" 너의 성별은 " + fastFriend.getFastFriendSex() + "이야. ");
55+
if(fastFriend.getFastFriendRelationship() != null) result.append("너와 나의 관계는 " + fastFriend.getFastFriendRelationship() + "이야");
56+
result.append("이제 대화를 시작해보자. 20~40자로 짧게해줘. ");
57+
58+
log.debug("fastfriend prompt : {}", result.toString());
59+
return result.toString();
60+
}
4061
}

api/src/main/java/com/mbtips/domain/virtualfriend/VirtualFriendService.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import lombok.RequiredArgsConstructor;
1717
import lombok.extern.slf4j.Slf4j;
1818
import org.springframework.stereotype.Service;
19+
import org.springframework.transaction.annotation.Transactional;
1920

2021
import java.util.ArrayList;
2122
import java.util.List;
@@ -31,6 +32,7 @@ public class VirtualFriendService {
3132
private final InterestRepository interestRepository;
3233
private final ConversationRepository conversationRepository;
3334

35+
@Transactional(readOnly = true)
3436
public List<VirtualFriendResponse> getVirtualFriendsByUserId(User user) {
3537
List<Object[]> friends = virtualFriendRepository.findVirtualFriendAndConversation(user.getUserId());
3638

@@ -42,6 +44,7 @@ public List<VirtualFriendResponse> getVirtualFriendsByUserId(User user) {
4244
.collect(Collectors.toList());
4345
}
4446

47+
@Transactional
4548
public VirtualFriendResponse createVirtualFriend(VirtualFriendRequest req, User user) {
4649

4750
VirtualFriend virtualFriend = VirtualFriend.builder()
@@ -68,6 +71,8 @@ public VirtualFriendResponse createVirtualFriend(VirtualFriendRequest req, User
6871
return VirtualFriendResponse.from(saveVirtualFriend, conversation.getConversationId());
6972
}
7073

74+
75+
@Transactional
7176
public void deleteVirtualFriend(Long virtualFriendId, User user) {
7277

7378
VirtualFriend virtualFriend = virtualFriendRepository.findById(virtualFriendId);
@@ -78,19 +83,8 @@ public void deleteVirtualFriend(Long virtualFriendId, User user) {
7883

7984
}
8085

81-
public String makePrompt(Long conversationId) {
82-
Conversation conversation = conversationRepository.findById(conversationId);
83-
VirtualFriend virtualFriend = conversation.getVirtualFriend();
84-
// 대화방 기록
85-
// 가상친구 특성
86-
String mbti = virtualFriend.getMbti();
87-
MbtiType mbtiType = MbtiType.valueOf(mbti);
88-
String result = MbtiTraits.getTrait(mbtiType);
89-
// 가상친구 관심사
90-
result += ". 이제 대화를 시작해보자!";
91-
return result;
92-
}
9386

87+
@Transactional(readOnly = true)
9488
public VirtualFriendInfoResponse findFriendInfoById(Long virtualFriendId) {
9589
VirtualFriend virtualFriend = virtualFriendRepository.findById(virtualFriendId);
9690
List<String> interest = interestRepository.findTopicsByVirtualFriendId(virtualFriendId);
@@ -99,6 +93,7 @@ public VirtualFriendInfoResponse findFriendInfoById(Long virtualFriendId) {
9993
return result;
10094
}
10195

96+
@Transactional
10297
public VirtualFriendInfoResponse updateVirtualFriend(Long virtualFriendId, VirtualFriendRequest req, User user) {
10398
VirtualFriend virtualFriend = VirtualFriend.builder()
10499
.user(user)

api/src/main/java/com/mbtips/message/application/manager/MessageManager.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,24 @@
55
import com.mbtips.clova.client.ClovaApiFeignClient;
66
import com.mbtips.clova.dto.ChatRequest;
77
import com.mbtips.clova.dto.ClovaApiResponse;
8+
import com.mbtips.common.mbtiinfo.MbtiTraits;
9+
import com.mbtips.common.mbtiinfo.MbtiType;
810
import com.mbtips.common.provider.ClovaApiKeyProvider;
11+
import com.mbtips.conversation.interfaces.ConversationRepository;
912
import com.mbtips.domain.conversation.service.ConversationService;
1013
import com.mbtips.domain.converstation.Conversation;
1114
import com.mbtips.domain.message.Message;
1215
import com.mbtips.domain.message.dto.request.CreateMessageRequestDto;
16+
import com.mbtips.domain.message.dto.response.GetMessageResponseDto;
1317
import com.mbtips.domain.user.User;
18+
import com.mbtips.domain.virtualfriend.VirtualFriend;
1419
import com.mbtips.message.application.service.MessageService;
1520
import lombok.RequiredArgsConstructor;
1621
import lombok.extern.slf4j.Slf4j;
1722
import org.springframework.stereotype.Service;
1823

1924
import java.util.Arrays;
20-
import java.util.Objects;
25+
import java.util.List;
2126
import java.util.UUID;
2227

2328
@Service
@@ -29,21 +34,52 @@ public class MessageManager {
2934
private final ConversationService conversationService;
3035
private final ClovaApiFeignClient clovaApiFeignClient;
3136
private final ClovaApiKeyProvider clovaApiKeyProvider;
37+
private final ConversationRepository conversationRepository;
3238
private final ObjectMapper objectMapper;
3339

34-
public void sendMessage(User user, CreateMessageRequestDto createMessageRequestDto) {
40+
public String sendMessage(User user, CreateMessageRequestDto createMessageRequestDto) {
3541
Conversation conversation = conversationService.findById(createMessageRequestDto.conversationId());
3642

3743

3844
Message requestMessage = Message.builder()
3945
.user(user)
4046
.conversation(conversation)
41-
.virtualFriend(conversation.getVirtualFriend())
47+
// .virtualFriend(conversation.getVirtualFriend())
4248
.messageContent(createMessageRequestDto.messageContent())
4349
.build();
4450

4551
messageService.saveMessage(requestMessage);
4652

53+
String prompt = makePrompt(createMessageRequestDto.conversationId());
54+
log.debug("prompt : {} ", prompt);
55+
String responseContent = messageRequest(prompt + " " + createMessageRequestDto.messageContent());
56+
log.debug("responseMessage : {} ", responseContent);
57+
58+
List<GetMessageResponseDto> messages = messageService.getRecentMessagesOfConversationId(conversation.getConversationId());
59+
60+
61+
Message responseMessage = Message.builder()
62+
.conversation(conversation)
63+
.virtualFriend(conversation.getVirtualFriend())
64+
.messageContent(responseContent)
65+
.build();
66+
67+
messageService.saveMessage(responseMessage);
68+
return responseContent;
69+
}
70+
71+
private String makePrompt(Long conversationId) {
72+
Conversation conversation = conversationRepository.findById(conversationId);
73+
VirtualFriend virtualFriend = conversation.getVirtualFriend();
74+
// 대화방 기록
75+
// 가상친구 특성
76+
String mbti = virtualFriend.getMbti();
77+
MbtiType mbtiType = MbtiType.valueOf(mbti);
78+
String result = MbtiTraits.getTrait(mbtiType);
79+
// 가상친구 관심사
80+
result += ". 이제 대화를 시작해보자!";
81+
return result;
82+
4783
}
4884

4985
public String messageRequest(String content){
@@ -65,4 +101,5 @@ public String messageRequest(String content){
65101
}
66102
return resultResponse;
67103
}
104+
68105
}

api/src/main/java/com/mbtips/message/application/service/MessageService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@ public List<GetMessageResponseDto> getMessagesOfConversationId(Long conversation
2323
public void saveMessage(Message message) {
2424
messageRepository.createMessage(message);
2525
}
26+
27+
public List<GetMessageResponseDto> getRecentMessagesOfConversationId(Long conversationId) {
28+
return messageRepository.findRecentMessagesByConversationId(conversationId);
29+
}
2630
}

api/src/main/java/com/mbtips/message/controller/MessageController.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,7 @@ public ApiResponse<List<GetMessageResponseDto>> getMessagesOfConversationId(@Pat
3434

3535
@PostMapping
3636
public ApiResponse<String> createMessage(@RequestBody CreateMessageRequestDto createMessageRequestDto, @LoginUser User user){
37-
messageManager.sendMessage(user, createMessageRequestDto);
38-
String content = createMessageRequestDto.messageContent();
39-
String prompt = virtualFriendService.makePrompt(createMessageRequestDto.conversationId());
40-
log.debug("prompt : {}", prompt);
41-
String clovaResponse = messageManager.messageRequest(content);
37+
String clovaResponse = messageManager.sendMessage(user, createMessageRequestDto);
4238
return ApiResponse.success(clovaResponse);
4339
}
4440

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.mbtips.common.exception;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
@Getter
7+
@AllArgsConstructor
8+
public class ErrorResponse {
9+
private final int code;
10+
private final String message;
11+
}

core/src/main/java/com/mbtips/common/exception/enums/CommonException.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ public enum CommonException implements ExceptionInterface {
99
INVALID_REQUEST_ERROR(400, "잘못된 요청입니다."),
1010
LOGIN_EXPIRATION(403, "로그인이 만료되었습니다."),
1111
INTERNAL_SERVER_ERROR(500, "서버 오류입니다."),
12-
JSON_PROCESS_ERROR(501, "JSON 변형 도중 오류가 발생했습니다.")
13-
12+
JSON_PROCESS_ERROR(501, "JSON 변형 도중 오류가 발생했습니다."),
1413
;
1514

1615
private final int code;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.mbtips.domain.addtion.exception;
2+
3+
import com.mbtips.common.exception.interfaces.ExceptionInterface;
4+
import lombok.Getter;
5+
6+
@Getter
7+
public enum AdditionException implements ExceptionInterface {
8+
9+
TOO_FEW_CONVERSATIONS(40001, "대화의 개수가 부족합니다.(5회 이상)")
10+
11+
;
12+
13+
private final int code;
14+
private final String message;
15+
16+
AdditionException(int code, String message) {
17+
this.code = code;
18+
this.message = message;
19+
}
20+
}

0 commit comments

Comments
 (0)