diff --git a/src/main/java/hanium/modic/backend/domain/ai/aiChat/service/AiChatMessageService.java b/src/main/java/hanium/modic/backend/domain/ai/aiChat/service/AiChatMessageService.java index 5c7474ca..e51fb2aa 100644 --- a/src/main/java/hanium/modic/backend/domain/ai/aiChat/service/AiChatMessageService.java +++ b/src/main/java/hanium/modic/backend/domain/ai/aiChat/service/AiChatMessageService.java @@ -3,8 +3,6 @@ import static hanium.modic.backend.common.error.ErrorCode.*; import static hanium.modic.backend.domain.ai.aiServer.enums.AiImageStatus.*; -import java.util.List; - import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -19,7 +17,6 @@ import hanium.modic.backend.domain.ai.aiChat.entity.AiChatRoomEntity; import hanium.modic.backend.domain.ai.aiChat.repository.AiChatMessageRepository; import hanium.modic.backend.domain.ai.aiChat.repository.AiChatRoomRepository; -import hanium.modic.backend.domain.ai.aiServer.entity.AiChatImageEntity; import hanium.modic.backend.domain.ai.aiServer.enums.SenderType; import hanium.modic.backend.domain.ai.aiServer.repository.AiChatImageRepository; import hanium.modic.backend.domain.ai.aiServer.service.AiServerService; @@ -58,6 +55,8 @@ public class AiChatMessageService { public ChatMessageResponse sendUserMessage(Long userId, Long postId, ChatMessageRequest request) { // 메시지랑 이미지 둘 다 비어있으면 에러 validateRequestMessageNotEmpty(request); + // 이미지가 다른 사람의 이미지면 에러 + validateAiChatImageOwnership(userId, request.aiChatImageId()); // 채팅방 조회 AiChatRoomEntity aiChatRoom = aiChatRoomRepository.findByUserIdAndPostId(userId, postId) @@ -85,18 +84,8 @@ public ChatMessageResponse sendUserMessage(Long userId, Long postId, ChatMessage .build(); aiChatMessageRepository.save(message); - // 이미지 조회 - List aiChatImages = List.of(); - if (request.aiChatImageId() != null) { - aiChatImages = aiChatImageRepository.findById(request.aiChatImageId()) - .map(List::of) - .orElse(List.of()); - // 이미지들이 자신의 것인지 확인 - validateAiChatImagesOwnership(userId, aiChatImages); - } - // Ai 요청 - aiServerService.processAiRequest(userId, message, aiChatImages); + aiServerService.processAiRequest(userId, message.getId(), request.aiChatImageId()); // 이미지 유무에 따른 응답 생성 return createChatMessageResponseByAiChatImageId(message); @@ -135,11 +124,13 @@ private void validateRequestMessageNotEmpty(ChatMessageRequest request) { } // 이미지들이 자신의 것인지 확인 - private void validateAiChatImagesOwnership(Long userId, List aiChatImages) { - for (AiChatImageEntity image : aiChatImages) { - if (!image.getUserId().equals(userId)) { - throw new AppException(ErrorCode.IMAGE_CAN_NOT_BE_STOLEN_EXCEPTION); - } + private void validateAiChatImageOwnership(Long userId, Long aiChatImageId) { + if (aiChatImageId == null) { + return; // 이미지 ID가 null인 경우 소유권 검증 불필요 + } + boolean hasUserImage = aiChatImageRepository.existsByIdAndUserId(aiChatImageId, userId); + if (!hasUserImage) { + throw new AppException(ErrorCode.IMAGE_CAN_NOT_BE_STOLEN_EXCEPTION); } } diff --git a/src/main/java/hanium/modic/backend/domain/ai/aiServer/service/AiServerService.java b/src/main/java/hanium/modic/backend/domain/ai/aiServer/service/AiServerService.java index 4b69b0a0..5acd4c6e 100644 --- a/src/main/java/hanium/modic/backend/domain/ai/aiServer/service/AiServerService.java +++ b/src/main/java/hanium/modic/backend/domain/ai/aiServer/service/AiServerService.java @@ -67,9 +67,21 @@ public class AiServerService { @Async("llmTaskExecutor") public void processAiRequest( final Long nowUserId, - AiChatMessageEntity chatMessage, - List aiChatImages // 없으면 빈 리스트 + final Long messageId, + final Long aiChatImageId // 없으면 null, null이 아니면 해당 이미지는 반드시 존재해야 함 ) { + // 비동기 통신이라 chatMessage를 외부에서 받아오지 않고 여기서 다시 조회 + AiChatMessageEntity chatMessage = aiChatMessageRepository.findById(messageId) + .orElseThrow(() -> new AppException(ErrorCode.AI_CHAT_MESSAGE_NOT_FOUND)); + + // 이미지가 있으면 해당 이미지 조회 + List aiChatImages = List.of(); + if (aiChatImageId != null) { + aiChatImages = aiChatImageRepository.findById(aiChatImageId) + .map(List::of) + .orElse(List.of()); + } + final Long postId = chatMessage.getPostId(); // 해당 Post에 대한 AI 이미지 생성 권한 검증