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 @@ -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());
Expand Down Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public static class BoardInfo {
private UserInfo userInfo;
private boolean isBookMarked;
private String buttonStatus;
private Long chatRoomId;
}

@Getter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ChatMessage> chatMessageList) {
List<ChatResponse.ChatMessageInfo> chatMessageInfoList = chatMessageList.stream()
List<ChatMessageInfo> chatMessageInfoList = chatMessageList.stream()
.map(this::toChatMessageInfo)
.toList();

Expand All @@ -23,20 +30,36 @@ public ChatResponse.PagedChatMessageInfo toPagedChatMessageInfo(Page<ChatMessage
.build();
}

private ChatResponse.ChatMessageInfo toChatMessageInfo(ChatMessage chatMessage) {
return ChatResponse.ChatMessageInfo.builder()
private ChatMessageInfo toChatMessageInfo(ChatMessage chatMessage) {
return ChatMessageInfo.builder()
.id(chatMessage.getId())
.roomId(chatMessage.getRoomId())
.content(chatMessage.getContent())
.senderId(chatMessage.getSenderId())
.build();
}

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

public ChatMessage toDateMessage(Long chatRoomId, LocalDateTime localDateTime) {
return ChatMessage.builder()
.roomId(chatRoomId)
.content(formatDate(localDateTime))
.senderId(-1L)
.messageType(MessageType.DATE.name())
.build();
}

private String formatDate(LocalDateTime dateTime) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M월 d일", Locale.KOREAN);
return dateTime.format(formatter);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,18 @@
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

public abstract class ChatRequest {
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class ChatMessageRequest {
public enum MessageType {
ENTER, TALK, LEAVE;
ENTER, TALK, LEAVE, DATE;
}

private MessageType messageType;
private Long senderId; // 보낸 사람
private String content; // 메시지 내용
private LocalDateTime sendTime;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.mapping.Document;

import java.time.LocalDateTime;

@Document(collection = "chatting_content") // 실제 몽고 DB 컬렉션 이름
@Getter
@Builder
Expand All @@ -19,10 +21,6 @@ public class ChatMessage {
private Long roomId;
private String content;
private Long senderId;

public ChatMessage(Long roomId, String content, Long senderId) {
this.roomId = roomId;
this.content = content;
this.senderId = senderId;
}
private LocalDateTime sendTime;
private String messageType;
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@

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

ChatMessage findFirstByRoomIdOrderBySendTimeDesc(Long roomId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -24,23 +29,51 @@
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;

// 메시지를 특정 채팅방으로 전송
@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);
Expand Down