ChatServiceImpl.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.request.ChatMessageRequest;
import com.deveagles.be15_deveagles_be.features.chat.command.application.dto.response.ChatMessageResponse;
import com.deveagles.be15_deveagles_be.features.chat.command.application.service.ChatService;
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 java.time.LocalDateTime;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class ChatServiceImpl implements ChatService {

  private final ChatRoomRepository chatRoomRepository;
  private final ChatMessageRepository chatMessageRepository;
  private final SimpMessagingTemplate messagingTemplate;

  @Override
  public ChatMessageResponse saveMessage(ChatMessageRequest request, Long userId) {
    // 채팅방 검증
    ChatRoom chatRoom =
        chatRoomRepository
            .findById(request.getRoomId())
            .orElseThrow(() -> new BusinessException(ErrorCode.CHATROOM_NOT_FOUND));

    // 메시지 저장
    ChatMessage saved =
        chatMessageRepository.save(
            ChatMessage.builder()
                .chatroomId(chatRoom.getId())
                .sender(
                    ChatMessage.Sender.builder().id(userId).name(request.getSenderName()).build())
                .content(request.getContent())
                .isCustomer(request.isCustomer())
                .createdAt(LocalDateTime.now())
                .build());

    // 응답 DTO 생성
    ChatMessageResponse response =
        ChatMessageResponse.builder()
            .messageId(saved.getId())
            .chatroomId(saved.getChatroomId())
            .senderId(saved.getSender().getId())
            .senderName(saved.getSender().getName())
            .content(saved.getContent())
            .isCustomer(saved.isCustomer())
            .createdAt(saved.getCreatedAt())
            .build();

    // WebSocket 브로커 전송
    messagingTemplate.convertAndSend("/sub/chatroom/" + chatRoom.getId(), response);

    return response;
  }
}