ChatRoomServiceImpl.java
package com.deveagles.be15_deveagles_be.features.chat.command.application.service.impl;
import com.deveagles.be15_deveagles_be.common.exception.BusinessException;
import com.deveagles.be15_deveagles_be.common.exception.ErrorCode;
import com.deveagles.be15_deveagles_be.features.chat.command.application.dto.response.ChatMessageResponse;
import com.deveagles.be15_deveagles_be.features.chat.command.application.dto.response.ChatRoomCreateResult;
import com.deveagles.be15_deveagles_be.features.chat.command.application.service.ChatRoomService;
import com.deveagles.be15_deveagles_be.features.chat.command.domain.aggregate.ChatMessage;
import com.deveagles.be15_deveagles_be.features.chat.command.domain.aggregate.ChatRoom;
import com.deveagles.be15_deveagles_be.features.chat.command.domain.repository.ChatMessageRepository;
import com.deveagles.be15_deveagles_be.features.chat.command.domain.repository.ChatRoomRepository;
import com.deveagles.be15_deveagles_be.features.shops.command.application.service.ShopCommandService;
import java.time.LocalDateTime;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
@Slf4j
public class ChatRoomServiceImpl implements ChatRoomService {
private final ChatRoomRepository chatRoomRepository;
private final ChatMessageRepository chatMessageRepository;
private final ShopCommandService shopCommandService;
private final SimpMessagingTemplate messagingTemplate;
@Override
public ChatRoomCreateResult createChatRoom(Long shopId, Long staffId, String staffName) {
shopCommandService.validateShopExists(shopId);
String shopName = shopCommandService.getShop(shopId).getShopName();
ChatRoom.Participant participant =
ChatRoom.Participant.builder()
.id(staffId)
.name(staffName)
.shopId(shopId)
.shopName(shopName)
.build();
ChatRoom chatRoom =
ChatRoom.builder()
.participant(participant)
.isAiActive(true)
.createdAt(LocalDateTime.now())
.build();
ChatRoom saved = chatRoomRepository.save(chatRoom);
// ❌ 메시지 저장 제거!
return new ChatRoomCreateResult(saved.getId());
}
@Override
public void sendGreeting(String roomId) {
ChatRoom chatRoom =
chatRoomRepository
.findById(roomId)
.orElseThrow(() -> new BusinessException(ErrorCode.CHATROOM_NOT_FOUND));
ChatMessage message =
chatMessageRepository.save(
ChatMessage.builder()
.chatroomId(roomId)
.sender(ChatMessage.Sender.builder().id(null).name("Beautifly AI").build())
.content("어떤 도움이 필요하신가요?")
.isCustomer(false)
.createdAt(LocalDateTime.now())
.build());
ChatMessageResponse response =
ChatMessageResponse.builder()
.messageId(message.getId())
.chatroomId(roomId)
.senderId(null)
.senderName("Beautifly AI")
.content(message.getContent())
.isCustomer(false)
.createdAt(message.getCreatedAt())
.build();
messagingTemplate.convertAndSend("/sub/chatroom/" + roomId, response);
}
@Override
public void switchToStaff(String roomId) {
ChatRoom chatRoom =
chatRoomRepository
.findById(roomId)
.orElseThrow(() -> new BusinessException(ErrorCode.CHATROOM_NOT_FOUND));
if (!chatRoom.isAiActive()) {
log.info("[SWITCH] 이미 상담사로 전환된 채팅방: {}", roomId);
return;
}
Long staffId = 17L; // ✅ 지금은 하드코딩 (임시 상담사 ID)
chatRoom.updateToStaff(staffId); // isAiActive = false, assignedStaffId = 17L
chatRoomRepository.save(chatRoom);
ChatMessage message =
ChatMessage.builder()
.chatroomId(roomId)
.sender(ChatMessage.Sender.builder().id(staffId).name("상담사").build())
.content("상담사가 연결되었습니다. 무엇을 도와드릴까요?")
.isCustomer(false)
.createdAt(LocalDateTime.now())
.build();
chatMessageRepository.save(message);
messagingTemplate.convertAndSend("/sub/chatroom/" + roomId, message);
}
}