Skip to content

Commit

Permalink
Merge pull request #84 from mujik-tigers/feat/83-limit-user-history
Browse files Browse the repository at this point in the history
feat: 유저 히스토리 길이 제한
  • Loading branch information
yeonise authored May 15, 2024
2 parents 530bfbf + e4a123f commit 5f660f8
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 3 deletions.
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
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");
}

}

0 comments on commit 5f660f8

Please sign in to comment.