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 @@ -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}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,25 +33,35 @@ public ChatResponse.PagedChatMessageInfo toPagedChatMessageInfo(Page<ChatMessage
private ChatMessageInfo toChatMessageInfo(ChatMessage chatMessage) {
return ChatMessageInfo.builder()
.id(chatMessage.getId())
.roomId(chatMessage.getRoomId())
.roomId(chatMessage.getChatRoomId())
.content(chatMessage.getContent())
.senderId(chatMessage.getSenderId())
.build();
}

public ChatMessage toChatMessage(Long chatRoomId, String content, Long senderId, MessageType messageType) {
return ChatMessage.builder()
.roomId(chatRoomId)
.chatRoomId(chatRoomId)
.content(content)
.senderId(senderId)
.sendTime(LocalDateTime.now(ZoneId.of("Asia/Seoul")))
.messageType(messageType.name())
.build();
}

public ChatMessage toEnterLeaveMessage(Long chatRoomId, String content, Long userId, MessageType messageType) {
return ChatMessage.builder()
.chatRoomId(chatRoomId)
.content(content)
.senderId(userId)
.sendTime(LocalDateTime.now(ZoneId.of("Asia/Seoul"))) // 서울 시간으로 시간 설정
.messageType(messageType.name()) // 메시지 타입 설정 (ENTER 또는 LEAVE)
.build();
}

public ChatMessage toDateMessage(Long chatRoomId, LocalDateTime localDateTime) {
return ChatMessage.builder()
.roomId(chatRoomId)
.chatRoomId(chatRoomId)
.content(formatDate(localDateTime))
.senderId(-1L)
.messageType(MessageType.DATE.name())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
public class ChatMessage {
@Id
private ObjectId id;
private Long roomId;
private Long chatRoomId;
private String content;
private Long senderId;
private LocalDateTime sendTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import org.springframework.data.mongodb.repository.MongoRepository;

public interface ChatMessageRepository extends MongoRepository<ChatMessage, String> {
Page<ChatMessage> findByRoomIdOrderByIdDesc(Long roomId, Pageable pageable);
Page<ChatMessage> findByChatRoomIdOrderByIdDesc(Long roomId, Pageable pageable);

ChatMessage findFirstByRoomIdOrderBySendTimeDesc(Long roomId);
ChatMessage findFirstByChatRoomIdOrderBySendTimeDesc(Long roomId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
Expand All @@ -72,14 +72,25 @@ 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) {
if (!userChatRoomRepository.existsByUserIdAndChatRoomId(userId, chatRoomId)) {
throw new BaseException(ErrorCode.USER_CHATROOM_NOT_FOUND);
}

Page<ChatMessage> chatMessageList = chatMessageRepository.findByRoomIdOrderByIdDesc(chatRoomId, pageable);
Page<ChatMessage> chatMessageList = chatMessageRepository.findByChatRoomIdOrderByIdDesc(chatRoomId, pageable);
return chatMessageConverter.toPagedChatMessageInfo(chatMessageList);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -34,13 +35,15 @@
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
@RequiredArgsConstructor
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;
Expand Down Expand Up @@ -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
Expand Down