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 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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user