Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@ public record AdminRatePlanResponse(
String ratePlanId,
String planName,
String summary,
int monthlyFee,
int discountFee,
Integer monthlyFee,
Integer discountFee,
String dataAllowance,
String voiceAllowance,
String smsAllowance,
Map<String, Object> basicBenefit,
Map<String, Object> specialBenefit,
Map<String, Object> discountBenefit,
boolean isEnabled,
boolean isDeleted,
Boolean isEnabled,
Boolean isDeleted,
LocalDateTime createdAt
) {
}
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