diff --git a/src/main/java/com/back/catchmate/domain/chat/controller/ChatController.java b/src/main/java/com/back/catchmate/domain/chat/controller/ChatController.java index 2e68c5d..e7d2e21 100644 --- a/src/main/java/com/back/catchmate/domain/chat/controller/ChatController.java +++ b/src/main/java/com/back/catchmate/domain/chat/controller/ChatController.java @@ -29,7 +29,7 @@ public class ChatController { @MessageMapping("/chat.{chatRoomId}") @SendTo("/topic/chat.{chatRoomId}") public void sendMessage(@DestinationVariable Long chatRoomId, ChatMessageRequest request) { - chatService.sendMessage(chatRoomId, request); + chatService.sendChatMessage(chatRoomId, request); } @GetMapping("/{chatRoomId}") diff --git a/src/main/java/com/back/catchmate/domain/chat/converter/ChatMessageConverter.java b/src/main/java/com/back/catchmate/domain/chat/converter/ChatMessageConverter.java index de44553..f53f13e 100644 --- a/src/main/java/com/back/catchmate/domain/chat/converter/ChatMessageConverter.java +++ b/src/main/java/com/back/catchmate/domain/chat/converter/ChatMessageConverter.java @@ -33,7 +33,7 @@ public ChatResponse.PagedChatMessageInfo toPagedChatMessageInfo(Page { - Page findByRoomIdOrderByIdDesc(Long roomId, Pageable pageable); + Page findByChatRoomIdOrderByIdDesc(Long roomId, Pageable pageable); - ChatMessage findFirstByRoomIdOrderBySendTimeDesc(Long roomId); + ChatMessage findFirstByChatRoomIdOrderBySendTimeDesc(Long roomId); } diff --git a/src/main/java/com/back/catchmate/domain/chat/service/ChatRoomServiceImpl.java b/src/main/java/com/back/catchmate/domain/chat/service/ChatRoomServiceImpl.java index 845b03a..d8ee06a 100644 --- a/src/main/java/com/back/catchmate/domain/chat/service/ChatRoomServiceImpl.java +++ b/src/main/java/com/back/catchmate/domain/chat/service/ChatRoomServiceImpl.java @@ -17,9 +17,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import static com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest.MessageType; + @Service @RequiredArgsConstructor public class ChatRoomServiceImpl implements ChatRoomService { + private final ChatService chatService; private final UserRepository userRepository; private final ChatRoomRepository chatRoomRepository; private final UserChatRoomRepository userChatRoomRepository; @@ -54,6 +57,10 @@ public StateResponse leaveChatRoom(Long userId, Long chatRoomId) { // 채팅방에서 참여자 수 감소 chatRoom.decrementParticipantCount(); + // 퇴장 메시지 보내기 + String content = user.getNickName() + " 님이 채팅을 떠났어요"; // 퇴장 메시지 내용 + chatService.sendEnterLeaveMessage(chatRoom.getId(), content, user.getId(), MessageType.LEAVE); + return new StateResponse(true); } } diff --git a/src/main/java/com/back/catchmate/domain/chat/service/ChatService.java b/src/main/java/com/back/catchmate/domain/chat/service/ChatService.java index 0679920..a54cfc4 100644 --- a/src/main/java/com/back/catchmate/domain/chat/service/ChatService.java +++ b/src/main/java/com/back/catchmate/domain/chat/service/ChatService.java @@ -5,7 +5,9 @@ import org.springframework.data.domain.Pageable; public interface ChatService { - void sendMessage(Long chatRoomId, ChatMessageRequest request); + void sendChatMessage(Long chatRoomId, ChatMessageRequest request); + + void sendEnterLeaveMessage(Long chatRoomId, String content, Long senderId, ChatMessageRequest.MessageType messageType); ChatResponse.PagedChatMessageInfo getChatMessageList(Long userId, Long roomId, Pageable pageable); } diff --git a/src/main/java/com/back/catchmate/domain/chat/service/ChatServiceImpl.java b/src/main/java/com/back/catchmate/domain/chat/service/ChatServiceImpl.java index c4a4440..6da6d91 100644 --- a/src/main/java/com/back/catchmate/domain/chat/service/ChatServiceImpl.java +++ b/src/main/java/com/back/catchmate/domain/chat/service/ChatServiceImpl.java @@ -36,7 +36,7 @@ public class ChatServiceImpl implements ChatService { // 메시지를 특정 채팅방으로 전송 @Override @Transactional - public void sendMessage(Long chatRoomId, ChatMessageRequest request) { + public void sendChatMessage(Long chatRoomId, ChatMessageRequest request) { String destination = "/topic/chat." + chatRoomId; if (request.getMessageType() == MessageType.TALK) { @@ -62,7 +62,7 @@ public void sendMessage(Long chatRoomId, ChatMessageRequest request) { private boolean isNewDateMessageNeeded(Long chatRoomId, LocalDateTime newMessageTime) { LocalDate newDate = newMessageTime.toLocalDate(); - ChatMessage chatMessage = chatMessageRepository.findFirstByRoomIdOrderBySendTimeDesc(chatRoomId); + ChatMessage chatMessage = chatMessageRepository.findFirstByChatRoomIdOrderBySendTimeDesc(chatRoomId); if (chatMessage == null) { return true; @@ -72,6 +72,17 @@ private boolean isNewDateMessageNeeded(Long chatRoomId, LocalDateTime newMessage } } + @Override + @Transactional + public void sendEnterLeaveMessage(Long chatRoomId, String content, Long senderId, MessageType messageType) { + // 메시지를 DB에 저장 + ChatMessage chatMessage = chatMessageConverter.toEnterLeaveMessage(chatRoomId, content, senderId, messageType); + chatMessageRepository.save(chatMessage); + + // WebSocket을 통해 실시간 메시지 전송 + messagingTemplate.convertAndSend("/topic/chat." + chatRoomId, chatMessage); + } + @Override @Transactional(readOnly = true) public PagedChatMessageInfo getChatMessageList(Long userId, Long chatRoomId, Pageable pageable) { @@ -79,7 +90,7 @@ public PagedChatMessageInfo getChatMessageList(Long userId, Long chatRoomId, Pag throw new BaseException(ErrorCode.USER_CHATROOM_NOT_FOUND); } - Page chatMessageList = chatMessageRepository.findByRoomIdOrderByIdDesc(chatRoomId, pageable); + Page chatMessageList = chatMessageRepository.findByChatRoomIdOrderByIdDesc(chatRoomId, pageable); return chatMessageConverter.toPagedChatMessageInfo(chatMessageList); } } diff --git a/src/main/java/com/back/catchmate/domain/enroll/service/EnrollServiceImpl.java b/src/main/java/com/back/catchmate/domain/enroll/service/EnrollServiceImpl.java index 2e45649..80a75d0 100644 --- a/src/main/java/com/back/catchmate/domain/enroll/service/EnrollServiceImpl.java +++ b/src/main/java/com/back/catchmate/domain/enroll/service/EnrollServiceImpl.java @@ -7,6 +7,7 @@ import com.back.catchmate.domain.chat.entity.UserChatRoom; import com.back.catchmate.domain.chat.repository.ChatRoomRepository; import com.back.catchmate.domain.chat.repository.UserChatRoomRepository; +import com.back.catchmate.domain.chat.service.ChatService; import com.back.catchmate.domain.enroll.converter.EnrollConverter; import com.back.catchmate.domain.enroll.dto.EnrollRequest.CreateEnrollRequest; import com.back.catchmate.domain.enroll.dto.EnrollResponse; @@ -34,6 +35,7 @@ import java.io.IOException; import java.util.List; +import static com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest.MessageType; import static com.back.catchmate.domain.notification.message.NotificationMessages.*; @Service @@ -41,6 +43,7 @@ public class EnrollServiceImpl implements EnrollService { private final FCMService fcmService; private final NotificationService notificationService; + private final ChatService chatService; private final EnrollRepository enrollRepository; private final UserRepository userRepository; private final BoardRepository boardRepository; @@ -199,6 +202,9 @@ private void enterChatRoom(User user, Board board) { UserChatRoom userChatRoom = userChatRoomConverter.toEntity(user, chatRoom); userChatRoomRepository.save(userChatRoom); + + String content = user.getNickName() + " 님이 채팅에 참여했어요"; + chatService.sendEnterLeaveMessage(chatRoom.getId(), content, user.getId(), MessageType.ENTER); } @Override