From c42dc60af110082a439df3cdc6b91fd120fbe6af Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Fri, 15 Mar 2024 01:13:26 +0700 Subject: [PATCH] Refactored linking with room --- .../picker/controller/UserRoomController.java | 3 ++- .../picker/repository/UserRepository.java | 2 +- .../repository/impl/RoomRepositoryImpl.java | 2 +- .../repository/impl/UserRepositoryImpl.java | 27 ++++++++----------- .../picker/service/UserService.java | 2 +- .../picker/service/impl/UserServiceImpl.java | 3 +-- 6 files changed, 17 insertions(+), 22 deletions(-) diff --git a/server/src/main/java/ru/dragonestia/picker/controller/UserRoomController.java b/server/src/main/java/ru/dragonestia/picker/controller/UserRoomController.java index 351d7ff..6b5e9b0 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/UserRoomController.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/UserRoomController.java @@ -55,7 +55,8 @@ public class UserRoomController { ) { var room = getNodeAndRoom(nodeId, roomId).room(); var users = namingValidator.validateUserIds(Arrays.stream(userIds.split(",")).toList()); - var usedSlots = userService.linkUsersWithRoom(room, users, force); + userService.linkUsersWithRoom(room, users, force); + var usedSlots = userService.getRoomUsers(room).size(); return ResponseEntity.ok(new LinkUsersWithRoomResponse(usedSlots, room.getMaxSlots())); } diff --git a/server/src/main/java/ru/dragonestia/picker/repository/UserRepository.java b/server/src/main/java/ru/dragonestia/picker/repository/UserRepository.java index bb1c1d5..b8ccb9e 100644 --- a/server/src/main/java/ru/dragonestia/picker/repository/UserRepository.java +++ b/server/src/main/java/ru/dragonestia/picker/repository/UserRepository.java @@ -10,7 +10,7 @@ import java.util.Map; public interface UserRepository { - Map linkWithRoom(Room room, Collection users, boolean force) throws RoomAreFullException; + int linkWithRoom(Room room, Collection users, boolean force) throws RoomAreFullException; void unlinkWithRoom(Room room, Collection users); diff --git a/server/src/main/java/ru/dragonestia/picker/repository/impl/RoomRepositoryImpl.java b/server/src/main/java/ru/dragonestia/picker/repository/impl/RoomRepositoryImpl.java index c0d4b0e..8d76f11 100644 --- a/server/src/main/java/ru/dragonestia/picker/repository/impl/RoomRepositoryImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/repository/impl/RoomRepositoryImpl.java @@ -120,7 +120,7 @@ public class RoomRepositoryImpl implements RoomRepository { if (container.isPresent()) { var cont = container.get(); var addedUsers = userRepository.linkWithRoom(cont.room(), users, false); - cont.used().getAndAdd((int) addedUsers.values().stream().filter(Boolean.TRUE::equals).count()); + cont.used().getAndAdd(addedUsers); } return container.map(RoomContainer::room); diff --git a/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java b/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java index 2860606..63ee5ee 100644 --- a/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/repository/impl/UserRepositoryImpl.java @@ -25,34 +25,30 @@ public class UserRepositoryImpl implements UserRepository { private final ReadWriteLock lock = new ReentrantReadWriteLock(true); @Override - public Map linkWithRoom(Room room, Collection users, boolean force) throws RoomAreFullException { - var result = new HashMap(); + public int linkWithRoom(Room room, Collection users, boolean force) throws RoomAreFullException { + var toAdd = new HashSet(); lock.writeLock().lock(); try { var path = new NodeRoomPath(room.getNodeIdentifier(), room.getIdentifier()); var usersSet = roomUsers.getOrDefault(path, new HashSet<>()); - if (force || room.hasUnlimitedSlots()) { - users.forEach(user -> result.put(user, true)); - } else { - for (var user : users) { - var set = usersMap.getOrDefault(user, new HashSet<>()); - result.put(user, !set.contains(room)); - } - + if (!force && !room.hasUnlimitedSlots()) { if (room.getMaxSlots() < usersSet.size() + users.size()) { throw new RoomAreFullException(room.getNodeIdentifier(), room.getIdentifier()); } } - for (var user: users) { + users.forEach(user -> { var set = usersMap.getOrDefault(user, new HashSet<>()); - set.add(room); + if (!set.contains(room)) { + toAdd.add(user); + set.add(room); + } usersMap.put(user, set); - } + }); - usersSet.addAll(users); + usersSet.addAll(toAdd); roomUsers.put(path, usersSet); var picker = nodeId2PickerModeCache.get(room.getNodeIdentifier()); @@ -62,8 +58,7 @@ public class UserRepositoryImpl implements UserRepository { } finally { lock.writeLock().unlock(); } - - return result; + return toAdd.size(); } @Override diff --git a/server/src/main/java/ru/dragonestia/picker/service/UserService.java b/server/src/main/java/ru/dragonestia/picker/service/UserService.java index 00e843c..be7644f 100644 --- a/server/src/main/java/ru/dragonestia/picker/service/UserService.java +++ b/server/src/main/java/ru/dragonestia/picker/service/UserService.java @@ -18,7 +18,7 @@ public interface UserService { List getUserRoomsWithDetails(User user, Set details); - int linkUsersWithRoom(Room room, Collection users, boolean force) throws RoomAreFullException; + void linkUsersWithRoom(Room room, Collection users, boolean force) throws RoomAreFullException; void unlinkUsersFromRoom(Room room, Collection users); diff --git a/server/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java b/server/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java index 1b68dbe..0858493 100644 --- a/server/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java @@ -37,9 +37,8 @@ public class UserServiceImpl implements UserService { } @Override - public int linkUsersWithRoom(Room room, Collection users, boolean force) { + public void linkUsersWithRoom(Room room, Collection users, boolean force) { userRepository.linkWithRoom(room, users, force); - return userRepository.usersOf(room).size(); } @Override