Skip to content

Commit

Permalink
feat: 메시지 읽음 표시 쿼리 구현
Browse files Browse the repository at this point in the history
Related to: #136
  • Loading branch information
rudeh1253 committed Jan 6, 2025
1 parent b16c1ca commit f4aa214
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

Expand All @@ -18,4 +19,12 @@ public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long>,
ORDER BY cm.creationTime DESC
""")
Page<ChatMessage> findByChatroomId(@Param("chatroomId") Long chatroomId, Pageable page);

@Modifying(clearAutomatically = true)
@Query("""
UPDATE ChatMessage
SET readByOpponent = TRUE
WHERE chatroom.chatroomId = :chatroomId
""")
void readMessagesInChatroomByOpponent(@Param("chatroomId") Long chatroomId);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.hf.healthfriend.domain.chat.repository;

import com.hf.healthfriend.domain.chat.constant.ChatMessageType;
import com.hf.healthfriend.domain.chat.entity.Chatroom;
import com.hf.healthfriend.domain.chat.entity.chatmessage.ChatMessage;
import com.hf.healthfriend.domain.chat.entity.chatmessage.ImageChatMessage;
Expand All @@ -10,8 +9,8 @@
import com.hf.healthfriend.testutil.MysqlTestcontainerConfig;
import com.hf.healthfriend.testutil.SampleEntityGenerator;
import com.hf.healthfriend.testutil.TestConfig;
import jakarta.persistence.EntityManager;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
Expand Down Expand Up @@ -52,6 +51,9 @@ class TestChatMessageRepository {
@Autowired
ChatParticipationRepository chatParticipationRepository;

@Autowired
EntityManager em;

@Test
@DisplayName("save() - 이미지 메시지 저장 성공")
void saveImageMessage_success() {
Expand Down Expand Up @@ -91,7 +93,7 @@ void saveImageMessage_success() {
@DisplayName("findByChatroomId() - Pagination을 적용한 채팅 메시지 목록 불러오기 테스트")
void findByChatroomId_success_fetchWithPagination(int page, int pageSize) {
// Given
int index = page - 1;
int zeroBasedPage = page - 1;
Member participant1 = SampleEntityGenerator.generateSampleMember("[email protected]", "part1");
Member participant2 = SampleEntityGenerator.generateSampleMember("[email protected]", "part2");
this.memberRepository.save(participant1);
Expand All @@ -108,35 +110,44 @@ void findByChatroomId_success_fetchWithPagination(int page, int pageSize) {
}

// When
PageRequest pageObj = PageRequest.of(zeroBasedPage, pageSize);
log.info("pageObj={}", pageObj);
Page<ChatMessage> result = this.chatMessageRepository.findByChatroomId(chatroom.getChatroomId(),
PageRequest.of(index, pageSize));
pageObj);

// Then
List<ChatMessage> expected = getSubList(messages, index, pageSize);
List<ChatMessage> expected = getSubList(messages, zeroBasedPage, pageSize);

log.info("message.size()={}", messages.size());
log.info("messages.size() / pageSize = {}", messages.size() / pageSize);
assertThat(result.getTotalElements()).isEqualTo(messages.size());
assertThat(result.getTotalPages())
.isEqualTo(messages.size() / pageSize + (messages.size() % pageSize > 0 ? 1 : 0));

Long[] resultIds = result.getContent().stream().map(ChatMessage::getChatMessageId).toArray(Long[]::new);
log.info("resultIds={}", Arrays.toString(resultIds));
log.info("expected={}", expected.stream().map(ChatMessage::getChatMessageId).toList());
// 순서 보장
assertThat(expected.stream().map(ChatMessage::getChatMessageId))
.containsExactly(result.getContent().stream().map(ChatMessage::getChatMessageId).toArray(Long[]::new));
.containsExactly(resultIds);
}

private List<ChatMessage> inputSampleChatMessages(Chatroom chatroom, Member participant1, Member participant2) {
final int DUMMY_COUNT = 100;
List<ChatMessage> chatMessages = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();

Set<Integer> usedRandomValue = new HashSet<>();
for (int i = 0; i < DUMMY_COUNT; i++) {
int num = i + 1;
Random random = new Random();
int randomValue = random.nextInt(DUMMY_COUNT * 100);
log.info("DUMMY_COUNT * 100 = {}", DUMMY_COUNT * 100);
log.info("randomValue={}", randomValue);
LocalDateTime randomCreationTime = now.minus(randomValue, ChronoUnit.SECONDS);
int randomValue;
while (true) {
randomValue = random.nextInt();
if (!usedRandomValue.contains(randomValue)) {
usedRandomValue.add(randomValue);
break;
}
}
LocalDateTime randomCreationTime = now.minus(randomValue, ChronoUnit.MILLIS);
TextChatMessage message = new TextChatMessage(chatroom, num % 2 == 0 ? participant1 : participant2, "text" + num);
ReflectionTestUtils.setField(message, "creationTime", randomCreationTime);
ReflectionTestUtils.setField(message, "lastModified", randomCreationTime);
Expand All @@ -158,13 +169,40 @@ private List<ChatMessage> inputSampleChatMessages(Chatroom chatroom, Member part
return chatMessages;
}

private List<ChatMessage> getSubList(List<ChatMessage> original, int index, int pageSize) {
int fromIndex = index * pageSize;
int toIndex = (index + 1) * pageSize;
if (fromIndex >= original.size()) {
private List<ChatMessage> getSubList(List<ChatMessage> original, int zeroBasedPage, int pageSize) {
int originalSize = original.size();
int fromIndex = zeroBasedPage * pageSize;
int toIndex = Math.min((zeroBasedPage + 1) * pageSize, originalSize);
if (fromIndex >= originalSize) {
return new ArrayList<>();
}

return original.subList(fromIndex, Math.min(toIndex, pageSize));
return original.subList(fromIndex, toIndex);
}

@Test
@DisplayName("readMessagesInChatroomByOpponent() - success")
void readByChatroomId_success() {
// Given
Member participant1 = SampleEntityGenerator.generateSampleMember("[email protected]", "part1");
Member participant2 = SampleEntityGenerator.generateSampleMember("[email protected]", "part2");
this.memberRepository.save(participant1);
this.memberRepository.save(participant2);

Chatroom chatroom = SampleEntityGenerator.generateSampleChatroom(participant1, participant2);
this.chatroomRepository.save(chatroom);

List<ChatMessage> chatMessages = inputSampleChatMessages(chatroom, participant1, participant2);
int chatMessageCount = chatMessages.size();

// When
this.chatMessageRepository.readMessagesInChatroomByOpponent(chatroom.getChatroomId());

// Then
List<ChatMessage> found =
this.chatMessageRepository.findByChatroomId(chatroom.getChatroomId(), PageRequest.of(0, chatMessageCount))
.getContent();

found.forEach((f) -> assertThat(f.isReadByOpponent()).isTrue());
}
}

0 comments on commit f4aa214

Please sign in to comment.