diff --git a/src/main/java/site/youtogether/message/ChatHistoriesMessage.java b/src/main/java/site/youtogether/message/ChatHistoriesMessage.java new file mode 100644 index 0000000..2d73578 --- /dev/null +++ b/src/main/java/site/youtogether/message/ChatHistoriesMessage.java @@ -0,0 +1,16 @@ +package site.youtogether.message; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class ChatHistoriesMessage { + + private final MessageType messageType = MessageType.CHAT_HISTORIES; + private final List chatHistories; + +} + diff --git a/src/main/java/site/youtogether/message/MessageType.java b/src/main/java/site/youtogether/message/MessageType.java index 64d2607..aff2f7b 100644 --- a/src/main/java/site/youtogether/message/MessageType.java +++ b/src/main/java/site/youtogether/message/MessageType.java @@ -2,6 +2,6 @@ public enum MessageType { - CHAT, PARTICIPANTS, ROOM_TITLE, PLAYLIST, ALARM, VIDEO_SYNC_INFO + CHAT, PARTICIPANTS, ROOM_TITLE, PLAYLIST, ALARM, CHAT_HISTORIES, VIDEO_SYNC_INFO } diff --git a/src/main/java/site/youtogether/message/application/MessageService.java b/src/main/java/site/youtogether/message/application/MessageService.java index 8c2887c..699094a 100644 --- a/src/main/java/site/youtogether/message/application/MessageService.java +++ b/src/main/java/site/youtogether/message/application/MessageService.java @@ -12,6 +12,7 @@ import site.youtogether.exception.playlist.PlaylistNoExistenceException; import site.youtogether.exception.room.RoomNoExistenceException; import site.youtogether.message.AlarmMessage; +import site.youtogether.message.ChatHistoriesMessage; import site.youtogether.message.ChatHistory; import site.youtogether.message.ChatMessage; import site.youtogether.message.ParticipantsMessage; @@ -87,4 +88,9 @@ public void sendAlarm(AlarmMessage message) { chatRedisTemplate.opsForList().trim(CHAT_PREFIX + message.getRoomCode(), -100, -1); } + public void sendChatHistories(String roomCode) { + List chatHistories = chatRedisTemplate.opsForList().range(CHAT_PREFIX + roomCode, 0, -1); + + messagingTemplate.convertAndSend(SUBSCRIBE_PATH + roomCode, new ChatHistoriesMessage(chatHistories)); + } } diff --git a/src/main/java/site/youtogether/message/presentation/MessageController.java b/src/main/java/site/youtogether/message/presentation/MessageController.java index 2a30197..f0ca77e 100644 --- a/src/main/java/site/youtogether/message/presentation/MessageController.java +++ b/src/main/java/site/youtogether/message/presentation/MessageController.java @@ -38,7 +38,6 @@ public void handleChatMessage(ChatMessage chatMessage, SimpMessageHeaderAccessor chatMessage.setChatId(RandomUtil.generateChatId()); chatMessage.setUserId(user.getId()); - chatMessage.setNickname(user.getNickname()); messageService.sendChat(chatMessage); } diff --git a/src/main/java/site/youtogether/message/presentation/MessageEventListener.java b/src/main/java/site/youtogether/message/presentation/MessageEventListener.java index 583d221..1cc2883 100644 --- a/src/main/java/site/youtogether/message/presentation/MessageEventListener.java +++ b/src/main/java/site/youtogether/message/presentation/MessageEventListener.java @@ -11,12 +11,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import site.youtogether.exception.user.UserNoExistenceException; -import site.youtogether.message.AlarmMessage; import site.youtogether.message.application.MessageService; import site.youtogether.room.application.RoomService; import site.youtogether.user.User; import site.youtogether.user.infrastructure.UserStorage; -import site.youtogether.util.RandomUtil; @Component @RequiredArgsConstructor @@ -42,7 +40,7 @@ public void handleWebSocketSubscriberListener(SessionSubscribeEvent event) { messageService.sendParticipants(roomCode); messageService.sendPlaylist(roomCode); - messageService.sendAlarm(new AlarmMessage(RandomUtil.generateChatId(), roomCode, "[알림] " + user.getNickname() + "님이 입장하셨습니다.")); + messageService.sendChatHistories(roomCode); } @EventListener @@ -57,7 +55,6 @@ public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) { log.info("--USER {} 웹 소켓 커넥션 종료 시도--", userId); roomService.leave(userId); messageService.sendParticipants(roomCode); - messageService.sendAlarm(new AlarmMessage(RandomUtil.generateChatId(), roomCode, "[알림] " + user.getNickname() + "님이 퇴장하셨습니다.")); } } diff --git a/src/main/java/site/youtogether/room/application/RoomService.java b/src/main/java/site/youtogether/room/application/RoomService.java index ced1eb8..fe51b08 100644 --- a/src/main/java/site/youtogether/room/application/RoomService.java +++ b/src/main/java/site/youtogether/room/application/RoomService.java @@ -3,7 +3,6 @@ import static site.youtogether.util.AppConstants.*; import java.time.LocalDateTime; -import java.util.List; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -76,7 +75,6 @@ public RoomDetail enter(String roomCode, Long userId, String passwordInput) { .orElseThrow(UserNoExistenceException::new); Room room = roomStorage.findById(roomCode) .orElseThrow(RoomNoExistenceException::new); - List chatHistories = chatRedisTemplate.opsForList().range(CHAT_PREFIX + roomCode, 0, -1); user.enterRoom(roomCode); room.enter(passwordInput); @@ -84,7 +82,7 @@ public RoomDetail enter(String roomCode, Long userId, String passwordInput) { userStorage.save(user); roomStorage.save(room); - return new RoomDetail(room, user, chatHistories); + return new RoomDetail(room, user); } @RoomSynchronize @@ -111,7 +109,7 @@ public ChangedRoomTitle changeRoomTitle(Long userId, String newTitle) { roomStorage.save(room); messageService.sendRoomTitle(user.getCurrentRoomCode()); - messageService.sendAlarm(new AlarmMessage(RandomUtil.generateChatId(), room.getCode(), "[알림] 방 제목이 " + newTitle + "(으)로 변경되었습니다.")); + messageService.sendAlarm(new AlarmMessage(RandomUtil.generateChatId(), room.getCode(), "방 제목이 " + newTitle + "(으)로 변경되었습니다.")); return new ChangedRoomTitle(room); } diff --git a/src/main/java/site/youtogether/room/dto/RoomDetail.java b/src/main/java/site/youtogether/room/dto/RoomDetail.java index 989a51f..28e477f 100644 --- a/src/main/java/site/youtogether/room/dto/RoomDetail.java +++ b/src/main/java/site/youtogether/room/dto/RoomDetail.java @@ -1,10 +1,7 @@ package site.youtogether.room.dto; -import java.util.List; - import lombok.AllArgsConstructor; import lombok.Getter; -import site.youtogether.message.ChatHistory; import site.youtogether.room.Participant; import site.youtogether.room.Room; import site.youtogether.user.User; @@ -19,16 +16,14 @@ public class RoomDetail { private final int capacity; private final int currentParticipant; private final boolean passwordExist; - private final List chatHistories; - public RoomDetail(Room room, User user, List chatHistories) { + public RoomDetail(Room room, User user) { this.roomCode = room.getCode(); this.roomTitle = room.getTitle(); this.user = new Participant(user); this.capacity = room.getCapacity(); this.currentParticipant = room.getParticipantCount(); this.passwordExist = room.getPassword() != null; - this.chatHistories = chatHistories; } } diff --git a/src/main/java/site/youtogether/user/application/UserService.java b/src/main/java/site/youtogether/user/application/UserService.java index ce4e963..351fe87 100644 --- a/src/main/java/site/youtogether/user/application/UserService.java +++ b/src/main/java/site/youtogether/user/application/UserService.java @@ -23,15 +23,11 @@ public class UserService { public Participant changeUserNickname(Long userId, String newNickname) { User user = userStorage.findById(userId) .orElseThrow(UserNoExistenceException::new); - String previousNickname = user.getNickname(); user.changeNickname(newNickname); userStorage.save(user); if (user.isParticipant()) { messageService.sendParticipants(user.getCurrentRoomCode()); - messageService.sendAlarm( - new AlarmMessage(RandomUtil.generateChatId(), user.getCurrentRoomCode(), - "[알림] " + previousNickname + "님이 " + newNickname + "(으)로 닉네임을 변경했습니다.")); } return new Participant(user); @@ -49,7 +45,7 @@ public Participant changeUserRole(Long userId, UserRoleChangeForm form) { messageService.sendParticipants(user.getCurrentRoomCode()); messageService.sendAlarm( new AlarmMessage(RandomUtil.generateChatId(), user.getCurrentRoomCode(), - "[알림] " + targetUser.getNickname() + "님의 역할이 " + form.getNewUserRole().name() + "(으)로 변경되었습니다.")); + targetUser.getNickname() + "님의 역할이 " + form.getNewUserRole().name() + "(으)로 변경되었습니다.")); return new Participant(targetUser); } diff --git a/src/test/java/site/youtogether/room/application/RoomServiceTest.java b/src/test/java/site/youtogether/room/application/RoomServiceTest.java index 8db8e37..f46b126 100644 --- a/src/test/java/site/youtogether/room/application/RoomServiceTest.java +++ b/src/test/java/site/youtogether/room/application/RoomServiceTest.java @@ -119,23 +119,24 @@ void fetchRoomSlice() throws Exception { assertThat(roomList3.isHasNext()).isFalse(); } - @Test - @DisplayName("빈 방은 목록 조회 시 포함하지 않는다") - void fetchOnlyActiveRoom() throws Exception { - // given - Room room1 = createRoom(LocalDateTime.of(2024, 4, 6, 12, 0, 0), "room title1"); - Room room2 = createRoom(LocalDateTime.of(2024, 4, 6, 12, 0, 0), "room title2"); - Room room3 = createEmptyRoom(LocalDateTime.of(2024, 4, 6, 12, 0, 0), "empty room1"); - Room room4 = createEmptyRoom(LocalDateTime.of(2024, 4, 6, 12, 0, 0), "empty room2"); - - PageRequest pageRequest = PageRequest.of(0, 5); - - // when - RoomList roomList = roomService.fetchAll(pageRequest, null); - - // then - assertThat(roomList.getRooms()).hasSize(2); - } + // TODO: 최종 배포 전 주석 해제하기 + // @Test + // @DisplayName("빈 방은 목록 조회 시 포함하지 않는다") + // void fetchOnlyActiveRoom() throws Exception { + // // given + // Room room1 = createRoom(LocalDateTime.of(2024, 4, 6, 12, 0, 0), "room title1"); + // Room room2 = createRoom(LocalDateTime.of(2024, 4, 6, 12, 0, 0), "room title2"); + // Room room3 = createEmptyRoom(LocalDateTime.of(2024, 4, 6, 12, 0, 0), "empty room1"); + // Room room4 = createEmptyRoom(LocalDateTime.of(2024, 4, 6, 12, 0, 0), "empty room2"); + // + // PageRequest pageRequest = PageRequest.of(0, 5); + // + // // when + // RoomList roomList = roomService.fetchAll(pageRequest, null); + // + // // then + // assertThat(roomList.getRooms()).hasSize(2); + // } @Test @DisplayName("방에 입장 한다") diff --git a/src/test/java/site/youtogether/room/presentation/RoomControllerTest.java b/src/test/java/site/youtogether/room/presentation/RoomControllerTest.java index 2526527..5ff6804 100644 --- a/src/test/java/site/youtogether/room/presentation/RoomControllerTest.java +++ b/src/test/java/site/youtogether/room/presentation/RoomControllerTest.java @@ -340,8 +340,7 @@ void enterRoom() throws Exception { int capacity = 10; Participant participantInfo = new Participant(10L, "황똥땡", Role.HOST); - List chatHistory = createChatHistory(roomCode); - RoomDetail createdRoomDetail = new RoomDetail(roomCode, roomTitle, participantInfo, capacity, 2, false, chatHistory); + RoomDetail createdRoomDetail = new RoomDetail(roomCode, roomTitle, participantInfo, capacity, 2, false); Optional user = Optional.of(User.builder() .currentRoomCode(null) .build()); @@ -367,7 +366,6 @@ void enterRoom() throws Exception { .andExpect(jsonPath("$.data.capacity").value(capacity)) .andExpect(jsonPath("$.data.currentParticipant").value(2)) .andExpect(jsonPath("$.data.passwordExist").value(false)) - .andExpect(jsonPath("$.data.chatHistories").isArray()) .andDo(document("enter-room-success", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), @@ -384,12 +382,7 @@ void enterRoom() throws Exception { fieldWithPath("data.user.role").type(JsonFieldType.STRING).description("유저 역할"), fieldWithPath("data.capacity").type(JsonFieldType.NUMBER).description("정원"), fieldWithPath("data.currentParticipant").type(JsonFieldType.NUMBER).description("현재 참가자 수"), - fieldWithPath("data.passwordExist").type(JsonFieldType.BOOLEAN).description("비밀번호 존재 여부"), - fieldWithPath("data.chatHistories").type(JsonFieldType.ARRAY).description("채팅 기록"), - fieldWithPath("data.chatHistories[].messageType").type(JsonFieldType.STRING).description("메세지 타입"), - fieldWithPath("data.chatHistories[].userId").type(JsonFieldType.NUMBER).optional().description("유저 아이디"), - fieldWithPath("data.chatHistories[].content").type(JsonFieldType.STRING).description("메시지 내용"), - fieldWithPath("data.chatHistories[].createdAt").type(JsonFieldType.STRING).description("전송 시간") + fieldWithPath("data.passwordExist").type(JsonFieldType.BOOLEAN).description("비밀번호 존재 여부") ) )); } @@ -404,7 +397,7 @@ void enterRoomFail() throws Exception { int capacity = 10; Participant participantInfo = new Participant(10L, "황똥땡", Role.HOST); - RoomDetail createdRoomDetail = new RoomDetail(roomCode, roomTitle, participantInfo, capacity, 2, false, null); + RoomDetail createdRoomDetail = new RoomDetail(roomCode, roomTitle, participantInfo, capacity, 2, false); Optional user = Optional.of(User.builder() .currentRoomCode("1e7050f7d7") .build()); @@ -451,8 +444,7 @@ void enterPasswordRoom() throws Exception { int capacity = 10; Participant participantInfo = new Participant(10L, "황똥땡", Role.HOST); - List chatHistory = createChatHistory(roomCode); - RoomDetail createdRoomDetail = new RoomDetail(roomCode, roomTitle, participantInfo, capacity, 2, true, chatHistory); + RoomDetail createdRoomDetail = new RoomDetail(roomCode, roomTitle, participantInfo, capacity, 2, true); Optional user = Optional.of(User.builder() .currentRoomCode(null) .build()); @@ -480,7 +472,6 @@ void enterPasswordRoom() throws Exception { .andExpect(jsonPath("$.data.capacity").value(capacity)) .andExpect(jsonPath("$.data.currentParticipant").value(2)) .andExpect(jsonPath("$.data.passwordExist").value(true)) - .andExpect(jsonPath("$.data.chatHistories").isArray()) .andDo(document("enter-password-room-success", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), @@ -500,12 +491,7 @@ void enterPasswordRoom() throws Exception { fieldWithPath("data.user.role").type(JsonFieldType.STRING).description("유저 역할"), fieldWithPath("data.capacity").type(JsonFieldType.NUMBER).description("정원"), fieldWithPath("data.currentParticipant").type(JsonFieldType.NUMBER).description("현재 참가자 수"), - fieldWithPath("data.passwordExist").type(JsonFieldType.BOOLEAN).description("비밀번호 존재 여부"), - fieldWithPath("data.chatHistories").type(JsonFieldType.ARRAY).description("채팅 기록"), - fieldWithPath("data.chatHistories[].messageType").type(JsonFieldType.STRING).description("메세지 타입"), - fieldWithPath("data.chatHistories[].userId").type(JsonFieldType.NUMBER).optional().description("유저 아이디"), - fieldWithPath("data.chatHistories[].content").type(JsonFieldType.STRING).description("메시지 내용"), - fieldWithPath("data.chatHistories[].createdAt").type(JsonFieldType.STRING).description("전송 시간") + fieldWithPath("data.passwordExist").type(JsonFieldType.BOOLEAN).description("비밀번호 존재 여부") ) )); } @@ -794,7 +780,7 @@ private List generateRooms(int count) { private List createChatHistory(String roomCode) { return List.of( new ChatHistory(MessageType.CHAT, 1L, "안녕하세요", LocalDateTime.now().toString()), - new ChatHistory(MessageType.ALARM, null, "[알림] yeon님이 입장하셨습니다.", LocalDateTime.now().toString()), + new ChatHistory(MessageType.ALARM, null, "yeon님이 입장하셨습니다.", LocalDateTime.now().toString()), new ChatHistory(MessageType.CHAT, 2L, "방가방가 햄토리", LocalDateTime.now().toString()), new ChatHistory(MessageType.CHAT, 1L, "ㄷㄷ", LocalDateTime.now().toString()) );