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 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()));
}

View File

@ -10,7 +10,7 @@ import java.util.Map;
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);

View File

@ -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);

View File

@ -25,34 +25,30 @@ public class UserRepositoryImpl implements UserRepository {
private final ReadWriteLock lock = new ReentrantReadWriteLock(true);
@Override
public Map<User, Boolean> linkWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException {
var result = new HashMap<User, Boolean>();
public int linkWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException {
var toAdd = new HashSet<User>();
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

View File

@ -18,7 +18,7 @@ public interface UserService {
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);

View File

@ -37,9 +37,8 @@ public class UserServiceImpl implements UserService {
}
@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);
return userRepository.usersOf(room).size();
}
@Override