Refactored linking with room

This commit is contained in:
Andrey Terentev 2024-03-15 01:13:26 +07:00 committed by Andrey Terentev
parent 1076dc5521
commit c42dc60af1
6 changed files with 17 additions and 22 deletions

View File

@ -55,7 +55,8 @@ public class UserRoomController {
) { ) {
var room = getNodeAndRoom(nodeId, roomId).room(); var room = getNodeAndRoom(nodeId, roomId).room();
var users = namingValidator.validateUserIds(Arrays.stream(userIds.split(",")).toList()); 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())); return ResponseEntity.ok(new LinkUsersWithRoomResponse(usedSlots, room.getMaxSlots()));
} }

View File

@ -10,7 +10,7 @@ import java.util.Map;
public interface UserRepository { public interface UserRepository {
Map<User, Boolean> linkWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException; int linkWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException;
void unlinkWithRoom(Room room, Collection<User> users); void unlinkWithRoom(Room room, Collection<User> users);

View File

@ -120,7 +120,7 @@ public class RoomRepositoryImpl implements RoomRepository {
if (container.isPresent()) { if (container.isPresent()) {
var cont = container.get(); var cont = container.get();
var addedUsers = userRepository.linkWithRoom(cont.room(), users, false); 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); return container.map(RoomContainer::room);

View File

@ -25,34 +25,30 @@ public class UserRepositoryImpl implements UserRepository {
private final ReadWriteLock lock = new ReentrantReadWriteLock(true); private final ReadWriteLock lock = new ReentrantReadWriteLock(true);
@Override @Override
public Map<User, Boolean> linkWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException { public int linkWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException {
var result = new HashMap<User, Boolean>(); var toAdd = new HashSet<User>();
lock.writeLock().lock(); lock.writeLock().lock();
try { try {
var path = new NodeRoomPath(room.getNodeIdentifier(), room.getIdentifier()); var path = new NodeRoomPath(room.getNodeIdentifier(), room.getIdentifier());
var usersSet = roomUsers.getOrDefault(path, new HashSet<>()); var usersSet = roomUsers.getOrDefault(path, new HashSet<>());
if (force || room.hasUnlimitedSlots()) { 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 (room.getMaxSlots() < usersSet.size() + users.size()) { if (room.getMaxSlots() < usersSet.size() + users.size()) {
throw new RoomAreFullException(room.getNodeIdentifier(), room.getIdentifier()); throw new RoomAreFullException(room.getNodeIdentifier(), room.getIdentifier());
} }
} }
for (var user: users) { users.forEach(user -> {
var set = usersMap.getOrDefault(user, new HashSet<>()); var set = usersMap.getOrDefault(user, new HashSet<>());
set.add(room); if (!set.contains(room)) {
toAdd.add(user);
set.add(room);
}
usersMap.put(user, set); usersMap.put(user, set);
} });
usersSet.addAll(users); usersSet.addAll(toAdd);
roomUsers.put(path, usersSet); roomUsers.put(path, usersSet);
var picker = nodeId2PickerModeCache.get(room.getNodeIdentifier()); var picker = nodeId2PickerModeCache.get(room.getNodeIdentifier());
@ -62,8 +58,7 @@ public class UserRepositoryImpl implements UserRepository {
} finally { } finally {
lock.writeLock().unlock(); lock.writeLock().unlock();
} }
return toAdd.size();
return result;
} }
@Override @Override

View File

@ -18,7 +18,7 @@ public interface UserService {
List<ShortResponseRoom> getUserRoomsWithDetails(User user, Set<RoomDetails> details); List<ShortResponseRoom> getUserRoomsWithDetails(User user, Set<RoomDetails> details);
int linkUsersWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException; void linkUsersWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException;
void unlinkUsersFromRoom(Room room, Collection<User> users); void unlinkUsersFromRoom(Room room, Collection<User> users);

View File

@ -37,9 +37,8 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
public int linkUsersWithRoom(Room room, Collection<User> users, boolean force) { public void linkUsersWithRoom(Room room, Collection<User> users, boolean force) {
userRepository.linkWithRoom(room, users, force); userRepository.linkWithRoom(room, users, force);
return userRepository.usersOf(room).size();
} }
@Override @Override