Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.ureca.ufit.domain.chatbot.client;

import com.ureca.ufit.domain.chatbot.dto.request.CreateUserQuerySummaryRequest;
import com.ureca.ufit.domain.chatbot.dto.response.QuestionSummaryDto;

public interface ChatClient {
QuestionSummaryDto getSummary(CreateUserQuerySummaryRequest request, long chatRoomId);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.ureca.ufit.domain.chatbot.controller;

import java.util.concurrent.CompletableFuture;

import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand Down Expand Up @@ -50,12 +52,14 @@ public ResponseEntity<CreateChatBotReviewResponse> createChatBotReview(CreateCha
}

@Override
public ResponseEntity<CreateChatBotMessageResponse> createChatBotMessage(CustomUserDetails userDetails,
public ResponseEntity<CompletableFuture<CreateChatBotMessageResponse>> createChatBotMessage(
CustomUserDetails userDetails,
CreateChatBotMessageRequest request) {

Long userId = (userDetails != null) ? userDetails.userId() : nonUserId;

CreateChatBotMessageResponse response = chatBotMessageService.createChatBotMessage(request, userId);
CompletableFuture<CreateChatBotMessageResponse> response = chatBotMessageService.createChatBotMessage(request,
userId);
return ResponseEntity.status(HttpStatus.CREATED).body(response);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.ureca.ufit.domain.chatbot.controller;

import java.util.concurrent.CompletableFuture;

import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
Expand Down Expand Up @@ -107,7 +109,7 @@ public ResponseEntity<CreateChatBotReviewResponse> createChatBotReview(
content = @Content(schema = @Schema(implementation = CreateChatBotMessageResponse.class))
))
@PostMapping("/message")
public ResponseEntity<CreateChatBotMessageResponse> createChatBotMessage(
public ResponseEntity<CompletableFuture<CreateChatBotMessageResponse>> createChatBotMessage(
@Parameter(hidden = true)
@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestBody @Valid CreateChatBotMessageRequest request
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static com.ureca.ufit.global.profanity.BanwordFilterPolicy.*;

import java.util.Set;
import java.util.concurrent.CompletableFuture;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Pageable;
Expand Down Expand Up @@ -45,7 +46,8 @@ public CursorPageResponse<ChatMessageDto> getChatMessages(Long chatRoomId, Pagea
}

@Async
public CreateChatBotMessageResponse createChatBotMessage(CreateChatBotMessageRequest request, Long userId) {
public CompletableFuture<CreateChatBotMessageResponse> createChatBotMessage(CreateChatBotMessageRequest request,
Long userId) {

Set<BanwordFilterPolicy> policies = Set.of(NUMBERS, WHITESPACES);

Expand All @@ -58,11 +60,12 @@ public CreateChatBotMessageResponse createChatBotMessage(CreateChatBotMessageReq
CreateAIAnswerRequest createAIAnswerRequest = ChatMessageMapper.toCreateAIAnswerRequest(request, userId);

try {
return restTemplate.postForObject(
CreateChatBotMessageResponse response = restTemplate.postForObject(
fastApiUrl,
createAIAnswerRequest,
CreateChatBotMessageResponse.class
);
return CompletableFuture.completedFuture(response);

} catch (Exception e) {
throw new RestApiException(ChatBotErrorCode.LLM_TIMEOUT);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestClient;
import org.springframework.web.client.RestTemplate;

import com.ureca.ufit.domain.admin.dto.ChatBotReviewMapper;
Expand Down Expand Up @@ -73,8 +74,15 @@ private QuestionSummaryDto requestUserQuerySummary(CreateChatBotReviewRequest re
CreateUserQuerySummaryRequest chatReviewSummaryRequest = new CreateUserQuerySummaryRequest(
request.recommendationMessageId());

QuestionSummaryDto questionSummaryDto = restTemplate.postForObject(url, chatReviewSummaryRequest,
QuestionSummaryDto.class);
// QuestionSummaryDto questionSummaryDto = restTemplate.postForObject(url, chatReviewSummaryRequest,
// QuestionSummaryDto.class);

RestClient restClient = RestClient.create();
QuestionSummaryDto questionSummaryDto = restClient.post()
.uri(url)
.body(chatReviewSummaryRequest)
.retrieve()
.body(QuestionSummaryDto.class);

validateSummary(questionSummaryDto);
return questionSummaryDto;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,22 +42,33 @@ public void logout(HttpServletRequest request, HttpServletResponse response,
throw new RestApiException(CommonErrorCode.NOT_EXIST_BEARER_SUFFIX);
}
String accessToken = bearerToken.substring(BEARER_PREFIX.length());
JwtUtil.validateAccessToken(accessToken, secretKey);

// 블랙 리스트에 어세스 토큰 추가
addToBlacklistRedis(accessToken);
try {
JwtUtil.validateAccessToken(accessToken, secretKey);

// 레디스에서 리프레시 토큰 삭제
String refreshToken = JwtUtil.getRefreshTokenCookies(request);
if (refreshToken != null) {
// Redis에서 해당 리프레시 토큰 키 삭제
refreshTokenRepository.findById(refreshToken)
.ifPresent(refreshTokenRepository::delete);
// 블랙 리스트에 어세스 토큰 추가
addToBlacklistRedis(accessToken);
} catch (RestApiException e) {
// 어세스토큰 만료는 정상 처리
if( !e.getErrorCode().equals(CommonErrorCode.EXPIRED_TOKEN))
throw e;
}

String refreshToken = JwtUtil.getRefreshTokenCookies(request);
// 쿠키에서 리프레시 토큰 삭제 (timeout을 0으로 두어 즉시 삭제)
JwtUtil.updateRefreshTokenCookie(response, null, 0);

// Redis에서 해당 리프레시 토큰 키 삭제
refreshTokenRepository.delete(
refreshTokenRepository.findById(refreshToken).orElseThrow( () ->
new RestApiException(CommonErrorCode.REFRESH_NOT_FOUND)
)
);

} catch (RestApiException e) {
// 쿠키나 레디스에서 리프레시 토큰을 찾지 못했을 경우 정상처리
if(e.getErrorCode().equals(CommonErrorCode.REFRESH_NOT_FOUND))
return;
try {
SendErrorResponseUtil.sendErrorResponse(response, e.getErrorCode());
} catch (IOException ex) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/ureca/ufit/global/auth/util/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -155,15 +155,15 @@ public static String getRefreshTokenCookies(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();

if (cookies == null)
throw new RestApiException(CommonErrorCode.REFRESH_DENIED);
throw new RestApiException(CommonErrorCode.REFRESH_NOT_FOUND);

for (Cookie cookie : cookies) {
if (REFRESH_TOKEN_COOKIE_NAME.equals(cookie.getName())) {
return cookie.getValue();
}
}

throw new RestApiException(CommonErrorCode.REFRESH_DENIED);
throw new RestApiException(CommonErrorCode.REFRESH_NOT_FOUND);
}

}
Loading