diff --git a/src/main/java/com/back/catchmate/domain/board/converter/BoardConverter.java b/src/main/java/com/back/catchmate/domain/board/converter/BoardConverter.java index 2b6a8ae..6656489 100644 --- a/src/main/java/com/back/catchmate/domain/board/converter/BoardConverter.java +++ b/src/main/java/com/back/catchmate/domain/board/converter/BoardConverter.java @@ -83,10 +83,10 @@ public BoardInfo toBoardInfo(Long boardId) { .liftUpDate(board.getLiftUpDate()) .gameInfo(gameInfo) .userInfo(userInfo) + .chatRoomId(board.getChatRoom().getId()) .build(); } - public BoardInfo toBoardInfo(Board board, Game game) { GameInfo gameInfo = gameConverter.toGameInfo(game); UserInfo userInfo = userConverter.toUserInfo(board.getUser()); @@ -122,6 +122,7 @@ public BoardInfo toBoardInfo(Board board, Game game, boolean isBookMarked, Strin .buttonStatus(buttonStatus) .gameInfo(gameInfo) .userInfo(userInfo) + .chatRoomId(board.getChatRoom().getId()) .build(); } diff --git a/src/main/java/com/back/catchmate/domain/board/dto/BoardResponse.java b/src/main/java/com/back/catchmate/domain/board/dto/BoardResponse.java index 392deea..9a5c1b7 100644 --- a/src/main/java/com/back/catchmate/domain/board/dto/BoardResponse.java +++ b/src/main/java/com/back/catchmate/domain/board/dto/BoardResponse.java @@ -30,6 +30,7 @@ public static class BoardInfo { private UserInfo userInfo; private boolean isBookMarked; private String buttonStatus; + private Long chatRoomId; } @Getter 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 60d4659..2e68c5d 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 @@ -18,7 +18,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; @Tag(name = "채팅 관련 API") @RestController 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 cbbafbe..de44553 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 @@ -1,16 +1,23 @@ package com.back.catchmate.domain.chat.converter; import com.back.catchmate.domain.chat.dto.ChatResponse; +import com.back.catchmate.domain.chat.dto.ChatResponse.ChatMessageInfo; import com.back.catchmate.domain.chat.entity.ChatMessage; import org.springframework.data.domain.Page; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Locale; + +import static com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest.MessageType; @Component public class ChatMessageConverter { public ChatResponse.PagedChatMessageInfo toPagedChatMessageInfo(Page chatMessageList) { - List chatMessageInfoList = chatMessageList.stream() + List chatMessageInfoList = chatMessageList.stream() .map(this::toChatMessageInfo) .toList(); @@ -23,8 +30,8 @@ public ChatResponse.PagedChatMessageInfo toPagedChatMessageInfo(Page { Page findByRoomIdOrderByIdDesc(Long roomId, Pageable pageable); + + ChatMessage findFirstByRoomIdOrderBySendTimeDesc(Long roomId); } 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 74ab45d..c4a4440 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 @@ -4,7 +4,9 @@ import com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest; import com.back.catchmate.domain.chat.dto.ChatResponse.PagedChatMessageInfo; import com.back.catchmate.domain.chat.entity.ChatMessage; +import com.back.catchmate.domain.chat.entity.ChatRoom; import com.back.catchmate.domain.chat.repository.ChatMessageRepository; +import com.back.catchmate.domain.chat.repository.ChatRoomRepository; import com.back.catchmate.domain.chat.repository.UserChatRoomRepository; import com.back.catchmate.global.error.ErrorCode; import com.back.catchmate.global.error.exception.BaseException; @@ -16,6 +18,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.time.LocalDateTime; + import static com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest.MessageType; @Slf4j @@ -24,6 +29,7 @@ public class ChatServiceImpl implements ChatService { private final SimpMessagingTemplate messagingTemplate; private final ChatMessageRepository chatMessageRepository; + private final ChatRoomRepository chatRoomRepository; private final UserChatRoomRepository userChatRoomRepository; private final ChatMessageConverter chatMessageConverter; @@ -31,16 +37,43 @@ public class ChatServiceImpl implements ChatService { @Override @Transactional public void sendMessage(Long chatRoomId, ChatMessageRequest request) { + String destination = "/topic/chat." + chatRoomId; + if (request.getMessageType() == MessageType.TALK) { - ChatMessage chatMessage = chatMessageConverter.toChatMessage(chatRoomId, request.getContent(), request.getSenderId()); + // 날짜 메시지가 필요한지 확인 + if (isNewDateMessageNeeded(chatRoomId, LocalDateTime.now())) { + ChatMessage dateMessage = chatMessageConverter.toDateMessage(chatRoomId, LocalDateTime.now()); + messagingTemplate.convertAndSend(destination, dateMessage); + chatMessageRepository.insert(dateMessage); + } + + ChatMessage chatMessage = chatMessageConverter.toChatMessage(chatRoomId, request.getContent(), request.getSenderId(), MessageType.TALK); chatMessageRepository.insert(chatMessage); + + ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId) + .orElseThrow(() -> new BaseException(ErrorCode.CHATROOM_NOT_FOUND)); + + chatRoom.updateLastMessageTime(); } - String destination = "/topic/chat." + chatRoomId; log.info("Sending message to: {}", destination); messagingTemplate.convertAndSend(destination, request); } + private boolean isNewDateMessageNeeded(Long chatRoomId, LocalDateTime newMessageTime) { + LocalDate newDate = newMessageTime.toLocalDate(); + ChatMessage chatMessage = chatMessageRepository.findFirstByRoomIdOrderBySendTimeDesc(chatRoomId); + + if (chatMessage == null) { + return true; + } else { + LocalDate localDate = chatMessage.getSendTime().toLocalDate(); + return !localDate.equals(newDate); + } + } + + @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);