Refactored linking with room
This commit is contained in:
parent
1076dc5521
commit
c42dc60af1
@ -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()));
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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<>());
|
||||
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);
|
||||
|
||||
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
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user