Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

release #85

Merged
merged 3 commits into from
May 15, 2024
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
3 changes: 3 additions & 0 deletions src/main/java/site/youtogether/message/ChatHistory.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,22 @@ public class ChatHistory {

private MessageType messageType;

private Long chatId;
private Long userId;
private String content;
private String createdAt;

public ChatHistory(ChatMessage chatMessage) {
this.messageType = chatMessage.getMessageType();
this.chatId = chatMessage.getChatId();
this.userId = chatMessage.getUserId();
this.content = chatMessage.getContent();
this.createdAt = chatMessage.getCreatedAt();
}

public ChatHistory(AlarmMessage alarmMessage) {
this.messageType = alarmMessage.getMessageType();
this.chatId = alarmMessage.getChatId();
this.userId = null;
this.content = alarmMessage.getContent();
this.createdAt = alarmMessage.getCreatedAt();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@

import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;
import site.youtogether.exception.room.RoomNoExistenceException;
import site.youtogether.exception.user.UserNoExistenceException;
import site.youtogether.message.AlarmMessage;
import site.youtogether.message.ChatHistory;
import site.youtogether.message.application.MessageService;
import site.youtogether.playlist.Playlist;
import site.youtogether.playlist.infrastructure.PlaylistStorage;
Expand All @@ -37,7 +36,7 @@ public class RoomService {
private final PlaylistStorage playlistStorage;
private final UserStorage userStorage;
private final MessageService messageService;
private final RedisTemplate<String, ChatHistory> chatRedisTemplate;
private final StringRedisTemplate redisTemplate;

public NewRoom create(Long userId, RoomSettings roomSettings, LocalDateTime now) {
String roomCode = RandomUtil.generateRandomCode(ROOM_CODE_LENGTH);
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/site/youtogether/user/User.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package site.youtogether.user;

import static site.youtogether.util.AppConstants.*;

import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Queue;

import org.springframework.data.annotation.Id;

Expand Down Expand Up @@ -36,6 +40,7 @@ public class User {

private String nickname;
private Map<String, Role> history = new HashMap<>();
private Queue<String> roomCodeQueue = new ArrayDeque<>();

@Builder
private User(Long id, String nickname, String currentRoomCode, boolean activate) {
Expand Down Expand Up @@ -103,7 +108,13 @@ public void changeOtherUserRole(User targetUser, Role newUserRole) {
public void enterRoom(String roomCode) {
if (isFirstTimeEntering(roomCode)) {
history.put(roomCode, Role.GUEST);
if (roomCodeQueue.size() >= USER_HISTORY_LENGTH) {
removeOldestRoomCode();
}
} else {
roomCodeQueue.remove(roomCode);
}
roomCodeQueue.offer(roomCode);
currentRoomCode = roomCode;
activate = true;
}
Expand Down Expand Up @@ -133,6 +144,11 @@ private boolean isFirstTimeEntering(String roomCode) {
return !history.containsKey(roomCode);
}

private void removeOldestRoomCode() {
String deletedRoomCode = roomCodeQueue.poll();
history.remove(deletedRoomCode);
}

private boolean isInSameRoom(User user, User targetUser) {
return user.getCurrentRoomCode().equals(targetUser.getCurrentRoomCode());
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/site/youtogether/util/AppConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
public final class AppConstants {

public static final int ROOM_CODE_LENGTH = 10;
public static final int USER_HISTORY_LENGTH = 10;
public static final String STOMP_ENDPOINT = "/stomp";
public static final String USER_ID = "userId";
public static final String ROOM_CODE = "roomCode";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,50 @@ void changeRoom() throws Exception {
assertThat(savedRoom.getTitle()).isEqualTo(updateTitle);
}

@Test
@DisplayName("유저가 입장한 방 기록은 최대 10개만 방문 순서대로 유지된다")
void userHistory() throws Exception {
// given
User user = createUser(1L);

// when
for (int i = 0; i < 100; i++) {
Room room = createRoom(LocalDateTime.now(), "roomCode" + i);
roomService.enter(room.getCode(), user.getId(), null);
}

// then
User savedUser = userStorage.findById(user.getId()).get();
assertThat(savedUser.getHistory().size()).isEqualTo(10);
}

@Test
@DisplayName("방을 재입장하는 경우, 방 기록 순서는 갱신된다")
void userHistoryUpdate() throws Exception {
// given
User user = createUser(1L);

Room firstRoom = createRoom(LocalDateTime.now(), "firstRoomCode");
roomService.enter(firstRoom.getCode(), user.getId(), null);

Room room1 = createRoom(LocalDateTime.now(), "room1");
roomService.enter(room1.getCode(), user.getId(), null);

Room room2 = createRoom(LocalDateTime.now(), "room2");
roomService.enter(room2.getCode(), user.getId(), null);

Room room3 = createRoom(LocalDateTime.now(), "room3");
roomService.enter(room3.getCode(), user.getId(), null);

// when
roomService.enter(firstRoom.getCode(), user.getId(), null);

// then
User savedUser = userStorage.findById(user.getId()).get();
assertThat(savedUser.getHistory().size()).isEqualTo(4);
assertThat(savedUser.getRoomCodeQueue()).containsExactly(room1.getCode(), room2.getCode(), room3.getCode(), firstRoom.getCode());
}

private User createUser(Long userId) {
User user = User.builder()
.id(userId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -779,10 +779,10 @@ private List<Room> generateRooms(int count) {

private List<ChatHistory> 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.CHAT, 2L, "방가방가 햄토리", LocalDateTime.now().toString()),
new ChatHistory(MessageType.CHAT, 1L, "ㄷㄷ", LocalDateTime.now().toString())
new ChatHistory(MessageType.CHAT, 123L, 1L, "안녕하세요", LocalDateTime.now().toString()),
new ChatHistory(MessageType.ALARM, 124L, null, "yeon님이 입장하셨습니다.", LocalDateTime.now().toString()),
new ChatHistory(MessageType.CHAT, 125L, 2L, "방가방가 햄토리", LocalDateTime.now().toString()),
new ChatHistory(MessageType.CHAT, 126L, 1L, "ㄷㄷ", LocalDateTime.now().toString())
);
}

Expand Down
63 changes: 63 additions & 0 deletions src/test/java/site/youtogether/user/UserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -167,4 +167,67 @@ void changeNicknameNoEnterRoom() throws Exception {
assertThat(user.getNickname()).isEqualTo(updateNickname);
}

@Test
@DisplayName("방 참여 기록은 최대 10개까지 저장된다")
void historyLength() throws Exception {
// given
User user = User.builder()
.id(1L)
.nickname("황똥땡")
.build();

// when
for (int i = 0; i < 10; i++) {
user.enterRoom("roomCode" + i);
}

// then
assertThat(user.getHistory().size()).isEqualTo(10);
}

@Test
@DisplayName("방 참여 기록이 10개를 넘어가면, 가장 오래전에 방문한 방의 기록부터 제거한다")
void historyLimitExceed() throws Exception {
// given
User user = User.builder()
.id(1L)
.nickname("황똥땡")
.build();

String firstRoomCode = "firstRoomCode";
user.enterRoom(firstRoomCode);

// when
for (int i = 0; i < 10; i++) {
user.enterRoom("roomCode" + i);
}

// then
assertThat(user.getHistory().size()).isEqualTo(10);
assertThat(user.getHistory()).doesNotContainKey(firstRoomCode);
}

@Test
@DisplayName("방을 재입장 한 경우, 방문 순서가 갱신된다")
void historyUpdate() throws Exception {
// given
User user = User.builder()
.id(1L)
.nickname("황똥땡")
.build();

String firstRoomCode = "firstRoomCode";
user.enterRoom(firstRoomCode);

// when
for (int i = 0; i < 3; i++) {
user.enterRoom("roomCode" + i);
}
user.enterRoom(firstRoomCode);

// then
assertThat(user.getHistory().size()).isEqualTo(4);
assertThat(user.getRoomCodeQueue()).containsExactly("roomCode0", "roomCode1", "roomCode2", "firstRoomCode");
}

}
Loading