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
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ dependencies {

// MongoDB
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
}

//tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ public void sendMessage(@DestinationVariable Long chatRoomId, ChatMessageRequest

@GetMapping("/{chatRoomId}")
@Operation(summary = "특정 채팅방의 채팅 내역 조회 API", description = "특정 채팅방의 채팅 내역 조회 API 입니다.")
public Mono<PagedChatMessageInfo> findChatMessageList(@JwtValidation Long userId,
@PathVariable Long chatRoomId,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
public PagedChatMessageInfo findChatMessageList(@JwtValidation Long userId,
@PathVariable Long chatRoomId,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Order.desc("id.timestamp")));
return chatService.getChatMessageList(userId, chatRoomId, pageable);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,50 +1,42 @@
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.Pageable;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.stream.Collectors;

@Component
public class ChatMessageConverter {
public Mono<ChatResponse.PagedChatMessageInfo> toPagedMessageInfo(Flux<ChatMessage> chatMessageFlux, Pageable pageable) {
return chatMessageFlux.collectList()
.flatMap(chatMessages -> {
// 전체 메시지 수를 구하고 페이지 계산
int totalElements = chatMessages.size();
int totalPages = (int) Math.ceil((double) totalElements / pageable.getPageSize());
boolean isFirst = pageable.getPageNumber() == 0;
boolean isLast = pageable.getPageNumber() == totalPages - 1;
public ChatResponse.PagedChatMessageInfo toPagedChatMessageInfo(Page<ChatMessage> chatMessageList) {
List<ChatResponse.ChatMessageInfo> chatMessageInfoList = chatMessageList.stream()
.map(this::toChatMessageInfo)
.toList();

// ChatMessageInfo 리스트로 변환
List<ChatResponse.ChatMessageInfo> chatMessageInfoList = chatMessages.stream()
.map(this::toChatMessageInfo)
.collect(Collectors.toList());

// PagedChatMessageInfo 반환
return Mono.just(ChatResponse.PagedChatMessageInfo.builder()
.chatMessageInfoList(chatMessageInfoList)
.totalPages(totalPages)
.totalElements((long) totalElements)
.isFirst(isFirst)
.isLast(isLast)
.build());
});
return ChatResponse.PagedChatMessageInfo.builder()
.chatMessageInfoList(chatMessageInfoList)
.totalPages(chatMessageList.getTotalPages())
.totalElements(chatMessageList.getTotalElements())
.isFirst(chatMessageList.isFirst())
.isLast(chatMessageList.isLast())
.build();
}


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

public ChatMessage toChatMessage(Long chatRoomId, String content, Long senderId) {
return ChatMessage.builder()
.roomId(chatRoomId)
.content(content)
.senderId(senderId)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.back.catchmate.domain.chat.repository;

import com.back.catchmate.domain.chat.entity.ChatMessage;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import reactor.core.publisher.Flux;

public interface ChatMessageRepository extends ReactiveMongoRepository<ChatMessage, String> {
Flux<ChatMessage> findByRoomIdOrderByIdDesc(Long roomId, Pageable pageable);
import org.springframework.data.mongodb.repository.MongoRepository;

public interface ChatMessageRepository extends MongoRepository<ChatMessage, String> {
Page<ChatMessage> findByRoomIdOrderByIdDesc(Long roomId, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
import com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest;
import com.back.catchmate.domain.chat.dto.ChatResponse;
import org.springframework.data.domain.Pageable;
import reactor.core.publisher.Mono;

public interface ChatService {
void sendMessage(Long chatRoomId, ChatMessageRequest request);

Mono<ChatResponse.PagedChatMessageInfo> getChatMessageList(Long userId, Long roomId, Pageable pageable);
ChatResponse.PagedChatMessageInfo getChatMessageList(Long userId, Long roomId, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,11 @@
import com.back.catchmate.global.error.exception.BaseException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import static com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest.MessageType;

Expand All @@ -25,37 +24,29 @@
public class ChatServiceImpl implements ChatService {
private final SimpMessagingTemplate messagingTemplate;
private final ChatMessageRepository chatMessageRepository;
private final ChatMessageConverter chatMessageConverter;
private final UserChatRoomRepository userChatRoomRepository;
private final ChatMessageConverter chatMessageConverter;

// 메시지를 특정 채팅방으로 전송
@Override
@Transactional
public void sendMessage(Long chatRoomId, ChatMessageRequest request) {
if (request.getMessageType() == MessageType.TALK) {
ChatMessage chatMessage = new ChatMessage(
chatRoomId, request.getContent(), request.getSenderId()
);

// DB에 메시지 저장
chatMessageRepository.insert(chatMessage)
.doOnSuccess(savedMessage ->
log.info("Saving chat message: {}", chatMessage))
.subscribe();
ChatMessage chatMessage = chatMessageConverter.toChatMessage(chatRoomId, request.getContent(), request.getSenderId());
chatMessageRepository.insert(chatMessage);
}

String destination = "/topic/chat." + chatRoomId;
log.info("Sending message to: {}", destination); // 디버깅
log.info("Sending message to: {}", destination);
messagingTemplate.convertAndSend(destination, request);
}

public Mono<PagedChatMessageInfo> getChatMessageList(Long userId, Long chatRoomId, Pageable pageable) {
// 동기 방식으로 수정된 메서드 호출
public PagedChatMessageInfo getChatMessageList(Long userId, Long chatRoomId, Pageable pageable) {
if (!userChatRoomRepository.existsByUserIdAndChatRoomId(userId, chatRoomId)) {
throw new BaseException(ErrorCode.USER_CHATROOM_NOT_FOUND);
}

Flux<ChatMessage> chatMessageList = chatMessageRepository.findByRoomIdOrderByIdDesc(chatRoomId, pageable);
return chatMessageConverter.toPagedMessageInfo(chatMessageList, pageable);
Page<ChatMessage> chatMessageList = chatMessageRepository.findByRoomIdOrderByIdDesc(chatRoomId, pageable);
return chatMessageConverter.toPagedChatMessageInfo(chatMessageList);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package com.back.catchmate.global.config;

import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoDatabase;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;

Expand Down