!renamed User to Entity
This commit is contained in:
parent
cdb4f69a0f
commit
b4b0cf2a64
12
README.md
12
README.md
@ -22,7 +22,7 @@ After that, you can connect to the server using `RoomPicker Client`.
|
|||||||
Example of using the RoomPicker Client
|
Example of using the RoomPicker Client
|
||||||
----------
|
----------
|
||||||
|
|
||||||
Create a Node and a Room, after that, system pick up a room for 5 users.
|
Create a Node and a Room, after that, system pick up a room for 5 entities.
|
||||||
```java
|
```java
|
||||||
class Example {
|
class Example {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
@ -45,14 +45,14 @@ class Example {
|
|||||||
.setPayload("Hello world!");
|
.setPayload("Hello world!");
|
||||||
client.getRoomRepository().saveRoom(roomDefinition);
|
client.getRoomRepository().saveRoom(roomDefinition);
|
||||||
|
|
||||||
// Picking room for 5 users
|
// Picking room for 5 entities
|
||||||
var users = new HashSet<UserIdentifier>();
|
var entities = new HashSet<UserIdentifier>();
|
||||||
for (int i = 0 ; i < 5; i++) {
|
for (int i = 0 ; i < 5; i++) {
|
||||||
var user = UserIdentifier.of("test-user-" + i);
|
var entity = UserIdentifier.of("test-entity-" + i);
|
||||||
users.add(user);
|
entities.add(entity);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
var response = client.getNodeRepository().pickRoom(nodeId, users);
|
var response = client.getNodeRepository().pickRoom(nodeId, entities);
|
||||||
// TODO...
|
// TODO...
|
||||||
} catch (NoRoomsAvailableException ex) {
|
} catch (NoRoomsAvailableException ex) {
|
||||||
// Cannot pick room
|
// Cannot pick room
|
||||||
|
|||||||
@ -18,8 +18,8 @@ public class ExceptionFactory {
|
|||||||
factory.put(InvalidInstanceIdentifierException.ERROR_ID, InvalidInstanceIdentifierException::new);
|
factory.put(InvalidInstanceIdentifierException.ERROR_ID, InvalidInstanceIdentifierException::new);
|
||||||
factory.put(InvalidRoomIdentifierException.ERROR_ID, InvalidRoomIdentifierException::new);
|
factory.put(InvalidRoomIdentifierException.ERROR_ID, InvalidRoomIdentifierException::new);
|
||||||
factory.put(InvalidUsernamesException.ERROR_ID, InvalidUsernamesException::new);
|
factory.put(InvalidUsernamesException.ERROR_ID, InvalidUsernamesException::new);
|
||||||
factory.put(NodeAlreadyExistException.ERROR_ID, NodeAlreadyExistException::new);
|
factory.put(InstanceAlreadyExistException.ERROR_ID, InstanceAlreadyExistException::new);
|
||||||
factory.put(NodeNotFoundException.ERROR_ID, NodeNotFoundException::new);
|
factory.put(InstanceNotFoundException.ERROR_ID, InstanceNotFoundException::new);
|
||||||
factory.put(NoRoomsAvailableException.ERROR_ID, NoRoomsAvailableException::new);
|
factory.put(NoRoomsAvailableException.ERROR_ID, NoRoomsAvailableException::new);
|
||||||
factory.put(RoomAlreadyExistException.ERROR_ID, RoomAlreadyExistException::new);
|
factory.put(RoomAlreadyExistException.ERROR_ID, RoomAlreadyExistException::new);
|
||||||
factory.put(RoomAreFullException.ERROR_ID, RoomAreFullException::new);
|
factory.put(RoomAreFullException.ERROR_ID, RoomAreFullException::new);
|
||||||
|
|||||||
@ -4,17 +4,17 @@ import ru.dragonestia.picker.api.repository.response.ErrorResponse;
|
|||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public final class NodeAlreadyExistException extends ApiException {
|
public final class InstanceAlreadyExistException extends ApiException {
|
||||||
|
|
||||||
public static final String ERROR_ID = "err.node.already_exists";
|
public static final String ERROR_ID = "err.node.already_exists";
|
||||||
|
|
||||||
private final String nodeId;
|
private final String nodeId;
|
||||||
|
|
||||||
public NodeAlreadyExistException(String nodeId) {
|
public InstanceAlreadyExistException(String nodeId) {
|
||||||
this.nodeId = nodeId;
|
this.nodeId = nodeId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NodeAlreadyExistException(ErrorResponse errorResponse) {
|
public InstanceAlreadyExistException(ErrorResponse errorResponse) {
|
||||||
this(errorResponse.details().get("nodeId"));
|
this(errorResponse.details().get("nodeId"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4,23 +4,23 @@ import ru.dragonestia.picker.api.repository.response.ErrorResponse;
|
|||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public final class NodeNotFoundException extends ApiException {
|
public final class InstanceNotFoundException extends ApiException {
|
||||||
|
|
||||||
public static final String ERROR_ID = "err.node.not_found";
|
public static final String ERROR_ID = "err.instance.not_found";
|
||||||
|
|
||||||
private final String nodeId;
|
private final String nodeId;
|
||||||
|
|
||||||
public NodeNotFoundException(String nodeId) {
|
public InstanceNotFoundException(String nodeId) {
|
||||||
this.nodeId = nodeId;
|
this.nodeId = nodeId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NodeNotFoundException(ErrorResponse errorResponse) {
|
public InstanceNotFoundException(ErrorResponse errorResponse) {
|
||||||
this(errorResponse.details().get("node"));
|
this(errorResponse.details().get("instance"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getMessage() {
|
public String getMessage() {
|
||||||
return "Node '" + nodeId + "' does not found";
|
return "Instance '" + nodeId + "' does not found";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getNodeId() {
|
public String getNodeId() {
|
||||||
@ -34,6 +34,6 @@ public final class NodeNotFoundException extends ApiException {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void appendDetailsToErrorResponse(Map<String, String> details) {
|
public void appendDetailsToErrorResponse(Map<String, String> details) {
|
||||||
details.put("node", getNodeId());
|
details.put("instance", getNodeId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2,7 +2,7 @@ package ru.dragonestia.picker.api.model.user;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.beans.Transient;
|
import java.beans.Transient;
|
||||||
|
|
||||||
@ -11,8 +11,8 @@ public interface IUser {
|
|||||||
@NotNull String getIdentifier();
|
@NotNull String getIdentifier();
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
default @NotNull UserIdentifier getIdentifierObject() {
|
default @NotNull EntityIdentifier getIdentifierObject() {
|
||||||
return UserIdentifier.of(getIdentifier());
|
return EntityIdentifier.of(getIdentifier());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable String getDetail(@NotNull UserDetails detail);
|
@Nullable String getDetail(@NotNull UserDetails detail);
|
||||||
|
|||||||
@ -2,13 +2,13 @@ package ru.dragonestia.picker.api.model.user;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
public class UserDefinition implements IUser {
|
public class UserDefinition implements IUser {
|
||||||
|
|
||||||
private final String id;
|
private final String id;
|
||||||
|
|
||||||
public UserDefinition(@NotNull UserIdentifier identifier) {
|
public UserDefinition(@NotNull EntityIdentifier identifier) {
|
||||||
id = identifier.getValue();
|
id = identifier.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import ru.dragonestia.picker.api.repository.query.node.GetAllNodes;
|
|||||||
import ru.dragonestia.picker.api.repository.query.node.RemoveNodesByIds;
|
import ru.dragonestia.picker.api.repository.query.node.RemoveNodesByIds;
|
||||||
import ru.dragonestia.picker.api.repository.response.PickedRoomResponse;
|
import ru.dragonestia.picker.api.repository.response.PickedRoomResponse;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -26,5 +26,5 @@ public interface NodeRepository {
|
|||||||
|
|
||||||
void saveNode(@NotNull NodeDefinition definition);
|
void saveNode(@NotNull NodeDefinition definition);
|
||||||
|
|
||||||
@NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set<UserIdentifier> users);
|
@NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set<EntityIdentifier> users);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package ru.dragonestia.picker.api.repository.query.user;
|
|||||||
import org.jetbrains.annotations.Contract;
|
import org.jetbrains.annotations.Contract;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import ru.dragonestia.picker.api.model.room.RoomDetails;
|
import ru.dragonestia.picker.api.model.room.RoomDetails;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -29,14 +29,14 @@ public class FindRoomsLinkedWithUser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> new")
|
@Contract("_ -> new")
|
||||||
public static @NotNull FindRoomsLinkedWithUser just(@NotNull UserIdentifier identifier) {
|
public static @NotNull FindRoomsLinkedWithUser just(@NotNull EntityIdentifier identifier) {
|
||||||
return FindRoomsLinkedWithUser.builder()
|
return FindRoomsLinkedWithUser.builder()
|
||||||
.setUserId(identifier)
|
.setUserId(identifier)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> new")
|
@Contract("_ -> new")
|
||||||
public static @NotNull FindRoomsLinkedWithUser withAllDetails(@NotNull UserIdentifier identifier) {
|
public static @NotNull FindRoomsLinkedWithUser withAllDetails(@NotNull EntityIdentifier identifier) {
|
||||||
return FindRoomsLinkedWithUser.builder()
|
return FindRoomsLinkedWithUser.builder()
|
||||||
.setUserId(identifier)
|
.setUserId(identifier)
|
||||||
.setDetails(Arrays.stream(RoomDetails.values()).collect(Collectors.toSet()))
|
.setDetails(Arrays.stream(RoomDetails.values()).collect(Collectors.toSet()))
|
||||||
@ -55,7 +55,7 @@ public class FindRoomsLinkedWithUser {
|
|||||||
private Builder() {}
|
private Builder() {}
|
||||||
|
|
||||||
@Contract("_ -> this")
|
@Contract("_ -> this")
|
||||||
public @NotNull Builder setUserId(@NotNull UserIdentifier identifier) {
|
public @NotNull Builder setUserId(@NotNull EntityIdentifier identifier) {
|
||||||
userId = identifier.getValue();
|
userId = identifier.getValue();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package ru.dragonestia.picker.api.repository.query.user;
|
|||||||
import org.jetbrains.annotations.Contract;
|
import org.jetbrains.annotations.Contract;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import ru.dragonestia.picker.api.model.user.UserDetails;
|
import ru.dragonestia.picker.api.model.user.UserDetails;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -27,14 +27,14 @@ public class FindUserById {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> new")
|
@Contract("_ -> new")
|
||||||
public static @NotNull FindUserById just(@NotNull UserIdentifier userId) {
|
public static @NotNull FindUserById just(@NotNull EntityIdentifier userId) {
|
||||||
return builder()
|
return builder()
|
||||||
.setUserId(userId)
|
.setUserId(userId)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> new")
|
@Contract("_ -> new")
|
||||||
public static @NotNull FindUserById withAllDetails(@NotNull UserIdentifier userId) {
|
public static @NotNull FindUserById withAllDetails(@NotNull EntityIdentifier userId) {
|
||||||
return builder()
|
return builder()
|
||||||
.setUserId(userId)
|
.setUserId(userId)
|
||||||
.setDetails(Arrays.stream(UserDetails.values()).collect(Collectors.toSet()))
|
.setDetails(Arrays.stream(UserDetails.values()).collect(Collectors.toSet()))
|
||||||
@ -53,7 +53,7 @@ public class FindUserById {
|
|||||||
private Builder() {}
|
private Builder() {}
|
||||||
|
|
||||||
@Contract("_ -> this")
|
@Contract("_ -> this")
|
||||||
public @NotNull Builder setUserId(@NotNull UserIdentifier identifier) {
|
public @NotNull Builder setUserId(@NotNull EntityIdentifier identifier) {
|
||||||
userId = identifier.getValue();
|
userId = identifier.getValue();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import org.jetbrains.annotations.Contract;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -48,7 +48,7 @@ public class LinkUsersWithRoom {
|
|||||||
|
|
||||||
private String nodeId = null;
|
private String nodeId = null;
|
||||||
private String roomId = null;
|
private String roomId = null;
|
||||||
private Set<UserIdentifier> users = new HashSet<>();
|
private Set<EntityIdentifier> users = new HashSet<>();
|
||||||
private boolean ignoreSlotLimitation = false;
|
private boolean ignoreSlotLimitation = false;
|
||||||
|
|
||||||
private Builder() {}
|
private Builder() {}
|
||||||
@ -66,13 +66,13 @@ public class LinkUsersWithRoom {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> this")
|
@Contract("_ -> this")
|
||||||
public @NotNull Builder setUsers(@NotNull Set<UserIdentifier> users) {
|
public @NotNull Builder setUsers(@NotNull Set<EntityIdentifier> users) {
|
||||||
this.users = users;
|
this.users = users;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> this")
|
@Contract("_ -> this")
|
||||||
public @NotNull Builder appendUser(@NotNull UserIdentifier user) {
|
public @NotNull Builder appendUser(@NotNull EntityIdentifier user) {
|
||||||
users.add(user);
|
users.add(user);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package ru.dragonestia.picker.api.repository.query.user;
|
|||||||
import org.jetbrains.annotations.Contract;
|
import org.jetbrains.annotations.Contract;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import ru.dragonestia.picker.api.model.user.UserDetails;
|
import ru.dragonestia.picker.api.model.user.UserDetails;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -30,14 +30,14 @@ public class SearchUsers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> new")
|
@Contract("_ -> new")
|
||||||
public static @NotNull SearchUsers just(@NotNull UserIdentifier searchInput) {
|
public static @NotNull SearchUsers just(@NotNull EntityIdentifier searchInput) {
|
||||||
return SearchUsers.builder()
|
return SearchUsers.builder()
|
||||||
.setSearchInput(searchInput)
|
.setSearchInput(searchInput)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> new")
|
@Contract("_ -> new")
|
||||||
public static @NotNull SearchUsers withAllDetails(@NotNull UserIdentifier searchInput) {
|
public static @NotNull SearchUsers withAllDetails(@NotNull EntityIdentifier searchInput) {
|
||||||
return SearchUsers.builder()
|
return SearchUsers.builder()
|
||||||
.setSearchInput(searchInput)
|
.setSearchInput(searchInput)
|
||||||
.setDetails(Arrays.stream(UserDetails.values()).collect(Collectors.toSet()))
|
.setDetails(Arrays.stream(UserDetails.values()).collect(Collectors.toSet()))
|
||||||
@ -56,7 +56,7 @@ public class SearchUsers {
|
|||||||
private Builder() {}
|
private Builder() {}
|
||||||
|
|
||||||
@Contract("_ -> this")
|
@Contract("_ -> this")
|
||||||
public @NotNull Builder setSearchInput(@NotNull UserIdentifier input) {
|
public @NotNull Builder setSearchInput(@NotNull EntityIdentifier input) {
|
||||||
searchInput = input.getValue();
|
searchInput = input.getValue();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import org.jetbrains.annotations.Contract;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -42,7 +42,7 @@ public class UnlinkUsersFromRoom {
|
|||||||
|
|
||||||
private String nodeId = null;
|
private String nodeId = null;
|
||||||
private String roomId = null;
|
private String roomId = null;
|
||||||
private Set<UserIdentifier> users = new HashSet<>();
|
private Set<EntityIdentifier> users = new HashSet<>();
|
||||||
|
|
||||||
private Builder() {}
|
private Builder() {}
|
||||||
|
|
||||||
@ -59,13 +59,13 @@ public class UnlinkUsersFromRoom {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> this")
|
@Contract("_ -> this")
|
||||||
public @NotNull Builder setUsers(@NotNull Set<UserIdentifier> users) {
|
public @NotNull Builder setUsers(@NotNull Set<EntityIdentifier> users) {
|
||||||
this.users = users;
|
this.users = users;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Contract("_ -> this")
|
@Contract("_ -> this")
|
||||||
public @NotNull Builder appendUser(@NotNull UserIdentifier user) {
|
public @NotNull Builder appendUser(@NotNull EntityIdentifier user) {
|
||||||
users.add(user);
|
users.add(user);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,9 +5,9 @@ import ru.dragonestia.picker.api.util.IdentifierValidator;
|
|||||||
|
|
||||||
import java.security.InvalidParameterException;
|
import java.security.InvalidParameterException;
|
||||||
|
|
||||||
public class UserIdentifier extends ValueObject<String> {
|
public class EntityIdentifier extends ValueObject<String> {
|
||||||
|
|
||||||
private UserIdentifier(String value) {
|
private EntityIdentifier(String value) {
|
||||||
super(value);
|
super(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ public class UserIdentifier extends ValueObject<String> {
|
|||||||
throw new InvalidParameterException("Invalid user identifier");
|
throw new InvalidParameterException("Invalid user identifier");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NotNull UserIdentifier of(@NotNull String identifier) {
|
public static @NotNull EntityIdentifier of(@NotNull String identifier) {
|
||||||
return new UserIdentifier(identifier);
|
return new EntityIdentifier(identifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2,7 +2,7 @@ package ru.dragonestia.picker.api.impl.repository;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.ApiStatus.Internal;
|
import org.jetbrains.annotations.ApiStatus.Internal;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import ru.dragonestia.picker.api.exception.NodeNotFoundException;
|
import ru.dragonestia.picker.api.exception.InstanceNotFoundException;
|
||||||
import ru.dragonestia.picker.api.impl.RoomPickerClient;
|
import ru.dragonestia.picker.api.impl.RoomPickerClient;
|
||||||
import ru.dragonestia.picker.api.impl.util.EnumUtils;
|
import ru.dragonestia.picker.api.impl.util.EnumUtils;
|
||||||
import ru.dragonestia.picker.api.impl.util.RestTemplate;
|
import ru.dragonestia.picker.api.impl.util.RestTemplate;
|
||||||
@ -17,7 +17,7 @@ import ru.dragonestia.picker.api.repository.response.NodeDetailsResponse;
|
|||||||
import ru.dragonestia.picker.api.repository.response.NodeListResponse;
|
import ru.dragonestia.picker.api.repository.response.NodeListResponse;
|
||||||
import ru.dragonestia.picker.api.repository.response.PickedRoomResponse;
|
import ru.dragonestia.picker.api.repository.response.PickedRoomResponse;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -46,7 +46,7 @@ public class NodeRepositoryImpl implements NodeRepository {
|
|||||||
params.put("requiredDetails", EnumUtils.enumSetToString(data.getDetails()));
|
params.put("requiredDetails", EnumUtils.enumSetToString(data.getDetails()));
|
||||||
});
|
});
|
||||||
return Optional.of(response.node());
|
return Optional.of(response.node());
|
||||||
} catch (NodeNotFoundException ex) {
|
} catch (InstanceNotFoundException ex) {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,7 +75,7 @@ public class NodeRepositoryImpl implements NodeRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set<UserIdentifier> users) {
|
public @NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set<EntityIdentifier> users) {
|
||||||
return rest.queryPostWithBody(
|
return rest.queryPostWithBody(
|
||||||
"/nodes/" + identifier.getValue() + "/pick",
|
"/nodes/" + identifier.getValue() + "/pick",
|
||||||
PickedRoomResponse.class,
|
PickedRoomResponse.class,
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import lombok.Getter;
|
|||||||
import ru.dragonestia.picker.api.model.room.IRoom;
|
import ru.dragonestia.picker.api.model.room.IRoom;
|
||||||
import ru.dragonestia.picker.api.model.user.IUser;
|
import ru.dragonestia.picker.api.model.user.IUser;
|
||||||
import ru.dragonestia.picker.api.model.user.UserDefinition;
|
import ru.dragonestia.picker.api.model.user.UserDefinition;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -56,7 +56,7 @@ public class AddUsers extends Details {
|
|||||||
.map(user -> user.getUserIdentifierField().getValue())
|
.map(user -> user.getUserIdentifierField().getValue())
|
||||||
.map(String::trim)
|
.map(String::trim)
|
||||||
.filter(user -> !user.isEmpty())
|
.filter(user -> !user.isEmpty())
|
||||||
.map(id -> (IUser) new UserDefinition(UserIdentifier.of(id)))
|
.map(id -> (IUser) new UserDefinition(EntityIdentifier.of(id)))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -48,8 +48,8 @@ public class SecurityConfig extends VaadinWebSecurity {
|
|||||||
super.configure(http);
|
super.configure(http);
|
||||||
|
|
||||||
http.formLogin(login -> {
|
http.formLogin(login -> {
|
||||||
login.successForwardUrl("/nodes");
|
login.successForwardUrl("/instances");
|
||||||
login.defaultSuccessUrl("/nodes");
|
login.defaultSuccessUrl("/instances");
|
||||||
});
|
});
|
||||||
setLoginView(http, LoginPage.class);
|
setLoginView(http, LoginPage.class);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,7 @@ import ru.dragonestia.picker.cp.util.RouteParamsExtractor;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@RolesAllowed("USER")
|
@RolesAllowed("USER")
|
||||||
@PageTitle("Rooms")
|
@PageTitle("Rooms")
|
||||||
@Route(value = "/nodes/:nodeId", layout = MainLayout.class)
|
@Route(value = "/instances/:nodeId", layout = MainLayout.class)
|
||||||
public class NodeDetailsPage extends VerticalLayout implements BeforeEnterObserver {
|
public class NodeDetailsPage extends VerticalLayout implements BeforeEnterObserver {
|
||||||
|
|
||||||
private final SecurityService securityService;
|
private final SecurityService securityService;
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import ru.dragonestia.picker.cp.service.SecurityService;
|
|||||||
@RolesAllowed("USER")
|
@RolesAllowed("USER")
|
||||||
@PageTitle("Nodes")
|
@PageTitle("Nodes")
|
||||||
@RouteAlias(value = "/", layout = MainLayout.class)
|
@RouteAlias(value = "/", layout = MainLayout.class)
|
||||||
@Route(value = "/nodes", layout = MainLayout.class)
|
@Route(value = "/instances", layout = MainLayout.class)
|
||||||
public class NodesPage extends VerticalLayout {
|
public class NodesPage extends VerticalLayout {
|
||||||
|
|
||||||
private final NodeRepository nodeRepository;
|
private final NodeRepository nodeRepository;
|
||||||
|
|||||||
@ -36,7 +36,7 @@ import java.util.stream.Collectors;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@RolesAllowed("USER")
|
@RolesAllowed("USER")
|
||||||
@PageTitle("Room details")
|
@PageTitle("Room details")
|
||||||
@Route(value = "/nodes/:nodeId/rooms/:roomId", layout = MainLayout.class)
|
@Route(value = "/instances/:nodeId/rooms/:roomId", layout = MainLayout.class)
|
||||||
public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserver {
|
public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserver {
|
||||||
|
|
||||||
private final SecurityService securityService;
|
private final SecurityService securityService;
|
||||||
|
|||||||
@ -19,7 +19,7 @@ import ru.dragonestia.picker.api.model.user.IUser;
|
|||||||
import ru.dragonestia.picker.api.model.user.UserDetails;
|
import ru.dragonestia.picker.api.model.user.UserDetails;
|
||||||
import ru.dragonestia.picker.api.repository.UserRepository;
|
import ru.dragonestia.picker.api.repository.UserRepository;
|
||||||
import ru.dragonestia.picker.api.repository.query.user.SearchUsers;
|
import ru.dragonestia.picker.api.repository.query.user.SearchUsers;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
import ru.dragonestia.picker.cp.component.RefreshableTable;
|
import ru.dragonestia.picker.cp.component.RefreshableTable;
|
||||||
import ru.dragonestia.picker.cp.service.SecurityService;
|
import ru.dragonestia.picker.cp.service.SecurityService;
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ public class UserSearchPage extends VerticalLayout implements RefreshableTable {
|
|||||||
userGrid.setItems();
|
userGrid.setItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
userGrid.setItems(cachedUsers = userRepository.searchUsers(SearchUsers.withAllDetails(UserIdentifier.of(input)))
|
userGrid.setItems(cachedUsers = userRepository.searchUsers(SearchUsers.withAllDetails(EntityIdentifier.of(input)))
|
||||||
.stream().map(user -> (IUser) user).toList());
|
.stream().map(user -> (IUser) user).toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,13 +4,13 @@ import com.vaadin.flow.router.BeforeEnterEvent;
|
|||||||
import com.vaadin.flow.router.ErrorParameter;
|
import com.vaadin.flow.router.ErrorParameter;
|
||||||
import com.vaadin.flow.router.HasErrorParameter;
|
import com.vaadin.flow.router.HasErrorParameter;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import ru.dragonestia.picker.api.exception.NodeNotFoundException;
|
import ru.dragonestia.picker.api.exception.InstanceNotFoundException;
|
||||||
import ru.dragonestia.picker.cp.component.NavPath;
|
import ru.dragonestia.picker.cp.component.NavPath;
|
||||||
|
|
||||||
public class NodeNotFoundPlug extends ErrorPlug implements HasErrorParameter<NodeNotFoundException> {
|
public class NodeNotFoundPlug extends ErrorPlug implements HasErrorParameter<InstanceNotFoundException> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int setErrorParameter(BeforeEnterEvent beforeEnterEvent, ErrorParameter<NodeNotFoundException> errorParameter) {
|
public int setErrorParameter(BeforeEnterEvent beforeEnterEvent, ErrorParameter<InstanceNotFoundException> errorParameter) {
|
||||||
var ex = errorParameter.getException();
|
var ex = errorParameter.getException();
|
||||||
var nodeId = ex.getNodeId();
|
var nodeId = ex.getNodeId();
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package ru.dragonestia.picker.cp.util;
|
|||||||
import com.vaadin.flow.router.BeforeEnterEvent;
|
import com.vaadin.flow.router.BeforeEnterEvent;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import ru.dragonestia.picker.api.exception.NodeNotFoundException;
|
import ru.dragonestia.picker.api.exception.InstanceNotFoundException;
|
||||||
import ru.dragonestia.picker.api.exception.RoomNotFoundException;
|
import ru.dragonestia.picker.api.exception.RoomNotFoundException;
|
||||||
import ru.dragonestia.picker.api.impl.RoomPickerClient;
|
import ru.dragonestia.picker.api.impl.RoomPickerClient;
|
||||||
import ru.dragonestia.picker.api.model.account.IAccount;
|
import ru.dragonestia.picker.api.model.account.IAccount;
|
||||||
@ -15,7 +15,7 @@ import ru.dragonestia.picker.api.repository.query.room.FindRoomById;
|
|||||||
import ru.dragonestia.picker.api.repository.query.user.FindUserById;
|
import ru.dragonestia.picker.api.repository.query.user.FindUserById;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -23,19 +23,19 @@ public class RouteParamsExtractor {
|
|||||||
|
|
||||||
private final RoomPickerClient client;
|
private final RoomPickerClient client;
|
||||||
|
|
||||||
public INode extractNode(BeforeEnterEvent e) throws NodeNotFoundException {
|
public INode extractNode(BeforeEnterEvent e) throws InstanceNotFoundException {
|
||||||
var nodeId = NodeIdentifier.of(e.getRouteParameters().get("nodeId").orElseThrow(() -> new NodeNotFoundException("null")));
|
var nodeId = NodeIdentifier.of(e.getRouteParameters().get("nodeId").orElseThrow(() -> new InstanceNotFoundException("null")));
|
||||||
return client.getNodeRepository().findNodeById(FindNodeById.justFind(nodeId)).orElseThrow(() -> new NodeNotFoundException(nodeId.getValue()));
|
return client.getNodeRepository().findNodeById(FindNodeById.justFind(nodeId)).orElseThrow(() -> new InstanceNotFoundException(nodeId.getValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public IRoom extractRoom(BeforeEnterEvent e, INode node) throws RoomNotFoundException {
|
public IRoom extractRoom(BeforeEnterEvent e, INode node) throws RoomNotFoundException {
|
||||||
var nodeId = node.getIdentifierObject();
|
var nodeId = node.getIdentifierObject();
|
||||||
var roomId = RoomIdentifier.of(e.getRouteParameters().get("roomId").orElseThrow(() -> new NodeNotFoundException("null")));
|
var roomId = RoomIdentifier.of(e.getRouteParameters().get("roomId").orElseThrow(() -> new InstanceNotFoundException("null")));
|
||||||
return client.getRoomRepository().find(FindRoomById.just(nodeId, roomId)).orElseThrow(() -> new NodeNotFoundException(roomId.getValue()));
|
return client.getRoomRepository().find(FindRoomById.just(nodeId, roomId)).orElseThrow(() -> new InstanceNotFoundException(roomId.getValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public IUser extractUser(BeforeEnterEvent e) {
|
public IUser extractUser(BeforeEnterEvent e) {
|
||||||
var userId = UserIdentifier.of(e.getRouteParameters().get("userId").orElseThrow(RuntimeException::new));
|
var userId = EntityIdentifier.of(e.getRouteParameters().get("userId").orElseThrow(RuntimeException::new));
|
||||||
return client.getUserRepository().findUserById(FindUserById.withAllDetails(userId));
|
return client.getUserRepository().findUserById(FindUserById.withAllDetails(userId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import ru.dragonestia.picker.api.repository.query.node.GetAllNodes;
|
|||||||
import ru.dragonestia.picker.api.repository.query.user.UnlinkUsersFromRoom;
|
import ru.dragonestia.picker.api.repository.query.user.UnlinkUsersFromRoom;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@ -76,13 +76,13 @@ public class Main {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
synchronized (usersInNode) {
|
synchronized (usersInNode) {
|
||||||
var users = new HashSet<UserIdentifier>();
|
var users = new HashSet<EntityIdentifier>();
|
||||||
var maxAdd = Math.min(10, (expectedUsers / nodes.size()) - usersInNode.get());
|
var maxAdd = Math.min(10, (expectedUsers / nodes.size()) - usersInNode.get());
|
||||||
|
|
||||||
if (maxAdd == 0) return;
|
if (maxAdd == 0) return;
|
||||||
var add = maxAdd == 1 ? 1 : (random.nextInt(maxAdd - 1) + 1);
|
var add = maxAdd == 1 ? 1 : (random.nextInt(maxAdd - 1) + 1);
|
||||||
for (int i = 0; i < add; i++) {
|
for (int i = 0; i < add; i++) {
|
||||||
users.add(UserIdentifier.of(UUID.randomUUID().toString()));
|
users.add(EntityIdentifier.of(UUID.randomUUID().toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
var request = client.getNodeRepository().pickRoom(nodeId, users);
|
var request = client.getNodeRepository().pickRoom(nodeId, users);
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import org.springframework.stereotype.Component;
|
|||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.repository.RoomRepository;
|
import ru.dragonestia.picker.repository.RoomRepository;
|
||||||
import ru.dragonestia.picker.repository.UserRepository;
|
import ru.dragonestia.picker.repository.EntityRepository;
|
||||||
import ru.dragonestia.picker.repository.impl.ContainerRepository;
|
import ru.dragonestia.picker.repository.impl.ContainerRepository;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -30,7 +30,7 @@ public class UserMetricsAspect {
|
|||||||
|
|
||||||
private final ContainerRepository containerRepository;
|
private final ContainerRepository containerRepository;
|
||||||
private final RoomRepository roomRepository;
|
private final RoomRepository roomRepository;
|
||||||
private final UserRepository userRepository;
|
private final EntityRepository entityRepository;
|
||||||
private final MeterRegistry meterRegistry;
|
private final MeterRegistry meterRegistry;
|
||||||
|
|
||||||
private final AtomicInteger totalUsers = new AtomicInteger(0);
|
private final AtomicInteger totalUsers = new AtomicInteger(0);
|
||||||
@ -41,18 +41,18 @@ public class UserMetricsAspect {
|
|||||||
meterRegistry.gauge("roompicker_total_users", totalUsers);
|
meterRegistry.gauge("roompicker_total_users", totalUsers);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After(value = "execution(* ru.dragonestia.picker.repository.UserRepository.linkWithRoom(ru.dragonestia.picker.model.room.Room, ..)) && args(room, ..)", argNames = "room")
|
@After(value = "execution(* ru.dragonestia.picker.repository.EntityRepository.linkWithRoom(ru.dragonestia.picker.model.room.Room, ..)) && args(room, ..)", argNames = "room")
|
||||||
void onLinkUsers(Room room) {
|
void onLinkUsers(Room room) {
|
||||||
countAllUsers(room);
|
countAllUsers(room);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After(value = "execution(void ru.dragonestia.picker.repository.UserRepository.unlinkWithRoom(ru.dragonestia.picker.model.room.Room, ..)) && args(room, ..)", argNames = "room")
|
@After(value = "execution(void ru.dragonestia.picker.repository.EntityRepository.unlinkWithRoom(ru.dragonestia.picker.model.room.Room, ..)) && args(room, ..)", argNames = "room")
|
||||||
void onUnlinkUsers(Room room) {
|
void onUnlinkUsers(Room room) {
|
||||||
countAllUsers(room);
|
countAllUsers(room);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void countAllUsers(Room room) {
|
private void countAllUsers(Room room) {
|
||||||
totalUsers.set(userRepository.countAllUsers());
|
totalUsers.set(entityRepository.countAllEntities());
|
||||||
}
|
}
|
||||||
|
|
||||||
@After(value = "execution(void ru.dragonestia.picker.repository.InstanceRepository.create(ru.dragonestia.picker.model.instance.Instance)) && args(instance)", argNames = "instance")
|
@After(value = "execution(void ru.dragonestia.picker.repository.InstanceRepository.create(ru.dragonestia.picker.model.instance.Instance)) && args(instance)", argNames = "instance")
|
||||||
@ -95,7 +95,7 @@ public class UserMetricsAspect {
|
|||||||
|
|
||||||
@Scheduled(fixedDelay = 3_000)
|
@Scheduled(fixedDelay = 3_000)
|
||||||
void updateUserMetrics() {
|
void updateUserMetrics() {
|
||||||
userRepository.countUsersForNodes().forEach((nodeId, users) -> {
|
entityRepository.countEntitiesForNodes().forEach((nodeId, users) -> {
|
||||||
Optional.ofNullable(data.get(nodeId)).ifPresent(node -> node.users().set(users));
|
Optional.ofNullable(data.get(nodeId)).ifPresent(node -> node.users().set(users));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -14,14 +14,14 @@ import ru.dragonestia.picker.api.model.node.PickingMethod;
|
|||||||
import ru.dragonestia.picker.api.model.room.IRoom;
|
import ru.dragonestia.picker.api.model.room.IRoom;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
import ru.dragonestia.picker.interceptor.DebugInterceptor;
|
import ru.dragonestia.picker.interceptor.DebugInterceptor;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.model.factory.RoomFactory;
|
import ru.dragonestia.picker.model.factory.RoomFactory;
|
||||||
import ru.dragonestia.picker.repository.RoomRepository;
|
import ru.dragonestia.picker.repository.RoomRepository;
|
||||||
import ru.dragonestia.picker.repository.InstanceRepository;
|
import ru.dragonestia.picker.repository.InstanceRepository;
|
||||||
import ru.dragonestia.picker.repository.UserRepository;
|
import ru.dragonestia.picker.repository.EntityRepository;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
@ -34,7 +34,7 @@ public class TestConfig implements WebMvcConfigurer {
|
|||||||
|
|
||||||
private final InstanceRepository instanceRepository;
|
private final InstanceRepository instanceRepository;
|
||||||
private final RoomRepository roomRepository;
|
private final RoomRepository roomRepository;
|
||||||
private final UserRepository userRepository;
|
private final EntityRepository entityRepository;
|
||||||
private final RoomFactory roomFactory;
|
private final RoomFactory roomFactory;
|
||||||
|
|
||||||
private final Random rand = new Random(0);
|
private final Random rand = new Random(0);
|
||||||
@ -62,8 +62,8 @@ public class TestConfig implements WebMvcConfigurer {
|
|||||||
roomRepository.create(room);
|
roomRepository.create(room);
|
||||||
|
|
||||||
for (int j = 0, n = rand.nextInt(slots + 1); j < n; j++) {
|
for (int j = 0, n = rand.nextInt(slots + 1); j < n; j++) {
|
||||||
var user = new User(UserIdentifier.of("test-user-" + rand.nextInt(20)));
|
var user = new Entity(EntityIdentifier.of("test-user-" + rand.nextInt(20)));
|
||||||
userRepository.linkWithRoom(room, List.of(user), false);
|
entityRepository.linkWithRoom(room, List.of(user), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -9,16 +9,16 @@ import ru.dragonestia.picker.api.repository.response.LinkedRoomsWithUserResponse
|
|||||||
import ru.dragonestia.picker.api.repository.response.SearchUserResponse;
|
import ru.dragonestia.picker.api.repository.response.SearchUserResponse;
|
||||||
import ru.dragonestia.picker.api.repository.response.UserDetailsResponse;
|
import ru.dragonestia.picker.api.repository.response.UserDetailsResponse;
|
||||||
|
|
||||||
@Tag(name = "Users", description = "User management")
|
@Tag(name = "Users", description = "Entity management")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/users")
|
@RequestMapping("/users")
|
||||||
public class UserController {
|
public class EntityController {
|
||||||
|
|
||||||
@Operation(summary = "Search user by identifier")
|
@Operation(summary = "Search user by identifier")
|
||||||
@GetMapping("/search")
|
@GetMapping("/search")
|
||||||
SearchUserResponse search(
|
SearchUserResponse search(
|
||||||
@Parameter(description = "User identifier input") @RequestParam(name = "input") String input
|
@Parameter(description = "Entity identifier input") @RequestParam(name = "input") String input
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
}
|
}
|
||||||
@ -26,7 +26,7 @@ public class UserController {
|
|||||||
@Operation(summary = "Get user info")
|
@Operation(summary = "Get user info")
|
||||||
@GetMapping("/{userId}")
|
@GetMapping("/{userId}")
|
||||||
UserDetailsResponse find(
|
UserDetailsResponse find(
|
||||||
@Parameter(description = "User identifier") @PathVariable(value = "userId") String userId
|
@Parameter(description = "Entity identifier") @PathVariable(value = "userId") String userId
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
}
|
}
|
||||||
@ -34,7 +34,7 @@ public class UserController {
|
|||||||
@Operation(summary = "Get rooms linked with user")
|
@Operation(summary = "Get rooms linked with user")
|
||||||
@GetMapping("/{userId}/rooms")
|
@GetMapping("/{userId}/rooms")
|
||||||
LinkedRoomsWithUserResponse roomsOf(
|
LinkedRoomsWithUserResponse roomsOf(
|
||||||
@Parameter(description = "User identifier") @PathVariable(value = "userId") String userId
|
@Parameter(description = "Entity identifier") @PathVariable(value = "userId") String userId
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
}
|
}
|
||||||
@ -9,18 +9,17 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import ru.dragonestia.picker.api.repository.response.LinkUsersWithRoomResponse;
|
import ru.dragonestia.picker.api.repository.response.LinkUsersWithRoomResponse;
|
||||||
import ru.dragonestia.picker.api.repository.response.RoomUserListResponse;
|
import ru.dragonestia.picker.api.repository.response.RoomUserListResponse;
|
||||||
|
|
||||||
@Tag(name = "Users", description = "User management")
|
@Tag(name = "Users", description = "Entity management")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/nodes/{nodeId}/rooms/{roomId}/users")
|
@RequestMapping("/instances/{instanceId}/rooms/{roomId}/users")
|
||||||
public class UserRoomController {
|
public class EntityRoomController {
|
||||||
|
|
||||||
@Operation(summary = "Get users inside room")
|
@Operation(summary = "Get users inside room")
|
||||||
@GetMapping
|
@GetMapping
|
||||||
ResponseEntity<RoomUserListResponse> usersInsideRoom(
|
ResponseEntity<RoomUserListResponse> usersInsideRoom(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable(name = "nodeId") String nodeId,
|
@Parameter(description = "Instance identifier") @PathVariable(name = "instanceId") String instanceId,
|
||||||
@Parameter(description = "Room identifier") @PathVariable(name = "roomId") String roomId,
|
@Parameter(description = "Room identifier") @PathVariable(name = "roomId") String roomId
|
||||||
@Parameter(description = "Required addition user data", example = "COUNT_ROOMS") @RequestParam(name = "requiredDetails", required = false, defaultValue = "") String detailsSeq
|
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
}
|
}
|
||||||
@ -28,9 +27,9 @@ public class UserRoomController {
|
|||||||
@Operation(summary = "Link users with room")
|
@Operation(summary = "Link users with room")
|
||||||
@PostMapping
|
@PostMapping
|
||||||
ResponseEntity<LinkUsersWithRoomResponse> linkUserWithRoom(
|
ResponseEntity<LinkUsersWithRoomResponse> linkUserWithRoom(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable(name = "nodeId") String nodeId,
|
@Parameter(description = "Instance identifier") @PathVariable(name = "instanceId") String instanceId,
|
||||||
@Parameter(description = "Room identifier") @PathVariable(name = "roomId") String roomId,
|
@Parameter(description = "Room identifier") @PathVariable(name = "roomId") String roomId,
|
||||||
@Parameter(description = "User identifiers", example = "user1,user2,user3") @RequestParam(name = "userIds") String userIds,
|
@Parameter(description = "Entity identifiers", example = "user1,user2,user3") @RequestParam(name = "userIds") String userIds,
|
||||||
@Parameter(description = "Ignore slot limitation") @RequestParam(name = "force") boolean force
|
@Parameter(description = "Ignore slot limitation") @RequestParam(name = "force") boolean force
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
@ -39,9 +38,9 @@ public class UserRoomController {
|
|||||||
@Operation(summary = "Unlink users from room")
|
@Operation(summary = "Unlink users from room")
|
||||||
@DeleteMapping
|
@DeleteMapping
|
||||||
ResponseEntity<?> unlinkUsersForBucket(
|
ResponseEntity<?> unlinkUsersForBucket(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable(name = "nodeId") String nodeId,
|
@Parameter(description = "Instance identifier") @PathVariable(name = "instanceId") String instanceId,
|
||||||
@Parameter(description = "Room identifier") @PathVariable(name = "roomId") String roomId,
|
@Parameter(description = "Room identifier") @PathVariable(name = "roomId") String roomId,
|
||||||
@Parameter(description = "User identifiers", example = "user1,user2,user3") @RequestParam(name = "userIds") String userIds
|
@Parameter(description = "Entity identifiers", example = "user1,user2,user3") @RequestParam(name = "userIds") String userIds
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
}
|
}
|
||||||
@ -11,8 +11,8 @@ import java.util.HashMap;
|
|||||||
@RestControllerAdvice
|
@RestControllerAdvice
|
||||||
public class ExceptionHandlerController {
|
public class ExceptionHandlerController {
|
||||||
|
|
||||||
@ExceptionHandler(NodeNotFoundException.class)
|
@ExceptionHandler(InstanceNotFoundException.class)
|
||||||
ResponseEntity<?> nodeNotFound(NodeNotFoundException ex) {
|
ResponseEntity<?> nodeNotFound(InstanceNotFoundException ex) {
|
||||||
return create(404, ex);
|
return create(404, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,8 +36,8 @@ public class ExceptionHandlerController {
|
|||||||
return create(400, ex);
|
return create(400, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ExceptionHandler(NodeAlreadyExistException.class)
|
@ExceptionHandler(InstanceAlreadyExistException.class)
|
||||||
ResponseEntity<?> nodeAlreadyExists(NodeAlreadyExistException ex) {
|
ResponseEntity<?> nodeAlreadyExists(InstanceAlreadyExistException ex) {
|
||||||
return create(400, ex);
|
return create(400, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -13,20 +13,20 @@ import ru.dragonestia.picker.api.repository.response.PickedRoomResponse;
|
|||||||
|
|
||||||
@Tag(name = "Nodes", description = "Instance management")
|
@Tag(name = "Nodes", description = "Instance management")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/nodes")
|
@RequestMapping("/instances")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class NodeController {
|
public class InstanceController {
|
||||||
|
|
||||||
@Operation(summary = "Get all nodes")
|
@Operation(summary = "Get all nodes")
|
||||||
@GetMapping
|
@GetMapping
|
||||||
NodeListResponse allNodes() {
|
NodeListResponse allInstances() {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "Register new node")
|
@Operation(summary = "Register new node")
|
||||||
@PostMapping
|
@PostMapping
|
||||||
ResponseEntity<?> registerNode(
|
ResponseEntity<?> registerInstance(
|
||||||
@Parameter(description = "Instance identifier") @RequestParam(name = "nodeId") String nodeId,
|
@Parameter(description = "Instance identifier") @RequestParam(name = "instanceId") String instanceId,
|
||||||
@Parameter(description = "Picking method method") @RequestParam(name = "method") PickingMethod method,
|
@Parameter(description = "Picking method method") @RequestParam(name = "method") PickingMethod method,
|
||||||
@Parameter(description = "Save node") @RequestParam(name = "persist", required = false, defaultValue = "false") boolean persist
|
@Parameter(description = "Save node") @RequestParam(name = "persist", required = false, defaultValue = "false") boolean persist
|
||||||
) {
|
) {
|
||||||
@ -34,25 +34,25 @@ public class NodeController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "Get node details")
|
@Operation(summary = "Get node details")
|
||||||
@GetMapping("/{nodeId}")
|
@GetMapping("/{instanceId}")
|
||||||
ResponseEntity<NodeDetailsResponse> nodeDetails(
|
ResponseEntity<NodeDetailsResponse> instanceDetails(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable("nodeId") String nodeId
|
@Parameter(description = "Instance identifier") @PathVariable("instanceId") String instanceId
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "Unregister node")
|
@Operation(summary = "Unregister node")
|
||||||
@DeleteMapping("/{nodeId}")
|
@DeleteMapping("/{instanceId}")
|
||||||
ResponseEntity<?> removeNode(
|
ResponseEntity<?> removeInstance(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable("nodeId") String nodeId
|
@Parameter(description = "Instance identifier") @PathVariable("instanceId") String instanceId
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "Pick node for users")
|
@Operation(summary = "Pick node for users")
|
||||||
@PostMapping("/{nodeId}/pick")
|
@PostMapping("/{instanceId}/pick")
|
||||||
ResponseEntity<PickedRoomResponse> pickRoom(
|
ResponseEntity<PickedRoomResponse> pickRoom(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable("nodeId") String nodeId,
|
@Parameter(description = "Instance identifier") @PathVariable("instanceId") String instanceId,
|
||||||
@RequestBody String userIds
|
@RequestBody String userIds
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
@ -12,14 +12,14 @@ import ru.dragonestia.picker.api.repository.response.RoomListResponse;
|
|||||||
|
|
||||||
@Tag(name = "Rooms", description = "Room management")
|
@Tag(name = "Rooms", description = "Room management")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/nodes/{nodeId}/rooms")
|
@RequestMapping("/instances/{instanceId}/rooms")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class RoomController {
|
public class RoomController {
|
||||||
|
|
||||||
@Operation(summary = "Get all rooms from node")
|
@Operation(summary = "Get all rooms from node")
|
||||||
@GetMapping
|
@GetMapping
|
||||||
ResponseEntity<RoomListResponse> all(
|
ResponseEntity<RoomListResponse> all(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable(name = "nodeId") String nodeId
|
@Parameter(description = "Instance identifier") @PathVariable(name = "instanceId") String instanceId
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
}
|
}
|
||||||
@ -27,7 +27,7 @@ public class RoomController {
|
|||||||
@Operation(summary = "Register new room")
|
@Operation(summary = "Register new room")
|
||||||
@PostMapping
|
@PostMapping
|
||||||
ResponseEntity<?> register(
|
ResponseEntity<?> register(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable(name = "nodeId") String nodeId,
|
@Parameter(description = "Instance identifier") @PathVariable(name = "instanceId") String instanceId,
|
||||||
@Parameter(description = "Room identifier") @RequestParam(name = "roomId") String roomId,
|
@Parameter(description = "Room identifier") @RequestParam(name = "roomId") String roomId,
|
||||||
@Parameter(description = "Maximum users count in room") @RequestParam(name = "slots") int slots,
|
@Parameter(description = "Maximum users count in room") @RequestParam(name = "slots") int slots,
|
||||||
@Parameter(description = "Payload. Some data") @RequestParam(name = "payload") String payload,
|
@Parameter(description = "Payload. Some data") @RequestParam(name = "payload") String payload,
|
||||||
@ -40,7 +40,7 @@ public class RoomController {
|
|||||||
@Operation(summary = "Unregister room")
|
@Operation(summary = "Unregister room")
|
||||||
@DeleteMapping("/{roomId}")
|
@DeleteMapping("/{roomId}")
|
||||||
ResponseEntity<?> remove(
|
ResponseEntity<?> remove(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable("nodeId") String nodeId,
|
@Parameter(description = "Instance identifier") @PathVariable("instanceId") String instanceId,
|
||||||
@Parameter(description = "Room identifier") @PathVariable("roomId") String roomId
|
@Parameter(description = "Room identifier") @PathVariable("roomId") String roomId
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
@ -49,7 +49,7 @@ public class RoomController {
|
|||||||
@Operation(summary = "Get room details")
|
@Operation(summary = "Get room details")
|
||||||
@GetMapping("/{roomId}")
|
@GetMapping("/{roomId}")
|
||||||
ResponseEntity<RoomInfoResponse> info(
|
ResponseEntity<RoomInfoResponse> info(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable("nodeId") String nodeId,
|
@Parameter(description = "Instance identifier") @PathVariable("instanceId") String instanceId,
|
||||||
@Parameter(description = "Room identifier") @PathVariable("roomId") String roomId
|
@Parameter(description = "Room identifier") @PathVariable("roomId") String roomId
|
||||||
) {
|
) {
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
@ -59,7 +59,7 @@ public class RoomController {
|
|||||||
@ApiResponse(description = "New lock state")
|
@ApiResponse(description = "New lock state")
|
||||||
@PutMapping("/{roomId}/lock")
|
@PutMapping("/{roomId}/lock")
|
||||||
ResponseEntity<Boolean> lockRoom(
|
ResponseEntity<Boolean> lockRoom(
|
||||||
@Parameter(description = "Instance identifier") @PathVariable("nodeId") String nodeId,
|
@Parameter(description = "Instance identifier") @PathVariable("instanceId") String instanceId,
|
||||||
@Parameter(description = "Room identifier") @PathVariable("roomId") String roomId,
|
@Parameter(description = "Room identifier") @PathVariable("roomId") String roomId,
|
||||||
@Parameter(description = "New state for Lock property") @RequestParam(name = "newState") boolean value
|
@Parameter(description = "New state for Lock property") @RequestParam(name = "newState") boolean value
|
||||||
) {
|
) {
|
||||||
|
|||||||
@ -4,15 +4,15 @@ import jakarta.validation.constraints.NotNull;
|
|||||||
import org.springframework.graphql.data.method.annotation.Argument;
|
import org.springframework.graphql.data.method.annotation.Argument;
|
||||||
import org.springframework.graphql.data.method.annotation.QueryMapping;
|
import org.springframework.graphql.data.method.annotation.QueryMapping;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
import ru.dragonestia.picker.controller.graphql.entity.EntityInstance;
|
import ru.dragonestia.picker.controller.graphql.object.ObjectInstance;
|
||||||
import ru.dragonestia.picker.controller.graphql.entity.EntityRoom;
|
import ru.dragonestia.picker.controller.graphql.object.ObjectRoom;
|
||||||
import ru.dragonestia.picker.controller.graphql.entity.EntityUser;
|
import ru.dragonestia.picker.controller.graphql.object.ObjectEntity;
|
||||||
import ru.dragonestia.picker.controller.graphql.entity.type.DataProvider;
|
import ru.dragonestia.picker.controller.graphql.object.type.DataProvider;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.service.InstanceService;
|
import ru.dragonestia.picker.service.InstanceService;
|
||||||
import ru.dragonestia.picker.service.RoomService;
|
import ru.dragonestia.picker.service.RoomService;
|
||||||
import ru.dragonestia.picker.service.UserService;
|
import ru.dragonestia.picker.service.EntityService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -21,59 +21,59 @@ public class GraphqlController {
|
|||||||
|
|
||||||
private final InstanceService instanceService;
|
private final InstanceService instanceService;
|
||||||
private final RoomService roomService;
|
private final RoomService roomService;
|
||||||
private final UserService userService;
|
private final EntityService entityService;
|
||||||
private final DataProvider dataProvider;
|
private final DataProvider dataProvider;
|
||||||
|
|
||||||
public GraphqlController(InstanceService instanceService, RoomService roomService, UserService userService) {
|
public GraphqlController(InstanceService instanceService, RoomService roomService, EntityService entityService) {
|
||||||
this.instanceService = instanceService;
|
this.instanceService = instanceService;
|
||||||
this.roomService = roomService;
|
this.roomService = roomService;
|
||||||
this.userService = userService;
|
this.entityService = entityService;
|
||||||
dataProvider = new DataProvider(instanceService, roomService, userService);
|
dataProvider = new DataProvider(instanceService, roomService, entityService);
|
||||||
}
|
}
|
||||||
|
|
||||||
@QueryMapping
|
@QueryMapping
|
||||||
List<EntityInstance> allInstances() {
|
List<ObjectInstance> allInstances() {
|
||||||
return instanceService.all().stream()
|
return instanceService.all().stream()
|
||||||
.map(node -> new EntityInstance(node, dataProvider))
|
.map(node -> new ObjectInstance(node, dataProvider))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@QueryMapping
|
@QueryMapping
|
||||||
EntityInstance instanceById(@Argument String id) {
|
ObjectInstance instanceById(@Argument String id) {
|
||||||
return instanceService.find(id)
|
return instanceService.find(id)
|
||||||
.map(node -> new EntityInstance(node, dataProvider))
|
.map(node -> new ObjectInstance(node, dataProvider))
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@QueryMapping
|
@QueryMapping
|
||||||
List<EntityRoom> allRooms(@NotNull String nodeId) {
|
List<ObjectRoom> allRooms(@NotNull String nodeId) {
|
||||||
var node = instanceService.find(nodeId).orElse(null);
|
var node = instanceService.find(nodeId).orElse(null);
|
||||||
if (node == null) return null;
|
if (node == null) return null;
|
||||||
|
|
||||||
return roomService.all(node).stream()
|
return roomService.all(node).stream()
|
||||||
.map(room -> new EntityRoom(room, dataProvider))
|
.map(room -> new ObjectRoom(room, dataProvider))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@QueryMapping
|
@QueryMapping
|
||||||
EntityRoom roomById(@Argument String nodeId, @NotNull String roomId) {
|
ObjectRoom roomById(@Argument String nodeId, @NotNull String roomId) {
|
||||||
var node = instanceService.find(nodeId).orElse(null);
|
var node = instanceService.find(nodeId).orElse(null);
|
||||||
if (node == null) return null;
|
if (node == null) return null;
|
||||||
|
|
||||||
return roomService.find(node, roomId)
|
return roomService.find(node, roomId)
|
||||||
.map(room -> new EntityRoom(room, dataProvider))
|
.map(room -> new ObjectRoom(room, dataProvider))
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@QueryMapping
|
@QueryMapping
|
||||||
EntityUser userById(@Argument String id) {
|
ObjectEntity entityById(@Argument String id) {
|
||||||
return new EntityUser(new User(UserIdentifier.of(id)), dataProvider);
|
return new ObjectEntity(new Entity(EntityIdentifier.of(id)), dataProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@QueryMapping
|
@QueryMapping
|
||||||
List<EntityUser> searchUser(@Argument String input) {
|
List<ObjectEntity> searchEntity(@Argument String input) {
|
||||||
return userService.searchUsers(input).stream()
|
return entityService.searchEntities(input).stream()
|
||||||
.map(user -> new EntityUser(new User(user.getIdentifierObject()), dataProvider))
|
.map(user -> new ObjectEntity(new Entity(user.getIdentifierObject()), dataProvider))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,36 +0,0 @@
|
|||||||
package ru.dragonestia.picker.controller.graphql.entity;
|
|
||||||
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import ru.dragonestia.picker.controller.graphql.entity.type.DataProvider;
|
|
||||||
import ru.dragonestia.picker.model.user.User;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class EntityUser {
|
|
||||||
|
|
||||||
private final User user;
|
|
||||||
private final DataProvider dataProvider;
|
|
||||||
private List<EntityRoom> cachedRooms = null;
|
|
||||||
|
|
||||||
public @NotNull String getId() {
|
|
||||||
return user.getIdentifier();
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<EntityRoom> getRooms() {
|
|
||||||
if (cachedRooms != null) {
|
|
||||||
return cachedRooms;
|
|
||||||
}
|
|
||||||
|
|
||||||
cachedRooms = dataProvider.userService().getUserRooms(user).stream()
|
|
||||||
.map(room -> new EntityRoom(room, dataProvider))
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
return cachedRooms;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCountRooms() {
|
|
||||||
return getRooms().size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
package ru.dragonestia.picker.controller.graphql.object;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import ru.dragonestia.picker.controller.graphql.object.type.DataProvider;
|
||||||
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ObjectEntity {
|
||||||
|
|
||||||
|
private final Entity entity;
|
||||||
|
private final DataProvider dataProvider;
|
||||||
|
private List<ObjectRoom> cachedRooms = null;
|
||||||
|
|
||||||
|
public @NotNull String getId() {
|
||||||
|
return entity.getIdentifier();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ObjectRoom> getRooms() {
|
||||||
|
if (cachedRooms != null) {
|
||||||
|
return cachedRooms;
|
||||||
|
}
|
||||||
|
|
||||||
|
cachedRooms = dataProvider.entityService().getEntityRooms(entity).stream()
|
||||||
|
.map(room -> new ObjectRoom(room, dataProvider))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
return cachedRooms;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCountRooms() {
|
||||||
|
return getRooms().size();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,17 +1,17 @@
|
|||||||
package ru.dragonestia.picker.controller.graphql.entity;
|
package ru.dragonestia.picker.controller.graphql.object;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import ru.dragonestia.picker.controller.graphql.entity.type.DataProvider;
|
import ru.dragonestia.picker.controller.graphql.object.type.DataProvider;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class EntityInstance {
|
public class ObjectInstance {
|
||||||
|
|
||||||
private final Instance instance;
|
private final Instance instance;
|
||||||
private final DataProvider dataProvider;
|
private final DataProvider dataProvider;
|
||||||
private List<EntityRoom> cachedRooms = null;
|
private List<ObjectRoom> cachedRooms = null;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return instance.getIdentifier();
|
return instance.getIdentifier();
|
||||||
@ -21,13 +21,13 @@ public class EntityInstance {
|
|||||||
return instance.getPickingMethod().name();
|
return instance.getPickingMethod().name();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<EntityRoom> getRooms() {
|
public List<ObjectRoom> getRooms() {
|
||||||
if (cachedRooms != null) {
|
if (cachedRooms != null) {
|
||||||
return cachedRooms;
|
return cachedRooms;
|
||||||
}
|
}
|
||||||
|
|
||||||
cachedRooms = dataProvider.roomService().all(instance).stream()
|
cachedRooms = dataProvider.roomService().all(instance).stream()
|
||||||
.map(room -> new EntityRoom(room, dataProvider))
|
.map(room -> new ObjectRoom(room, dataProvider))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
return cachedRooms;
|
return cachedRooms;
|
||||||
@ -1,17 +1,17 @@
|
|||||||
package ru.dragonestia.picker.controller.graphql.entity;
|
package ru.dragonestia.picker.controller.graphql.object;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import ru.dragonestia.picker.controller.graphql.entity.type.DataProvider;
|
import ru.dragonestia.picker.controller.graphql.object.type.DataProvider;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class EntityRoom {
|
public class ObjectRoom {
|
||||||
|
|
||||||
private final Room room;
|
private final Room room;
|
||||||
private final DataProvider dataProvider;
|
private final DataProvider dataProvider;
|
||||||
private List<EntityUser> cachedUsers = null;
|
private List<ObjectEntity> cachedUsers = null;
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return room.getIdentifier();
|
return room.getIdentifier();
|
||||||
@ -21,9 +21,9 @@ public class EntityRoom {
|
|||||||
return room.getInstanceIdentifier();
|
return room.getInstanceIdentifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
public EntityInstance getInstance() {
|
public ObjectInstance getInstance() {
|
||||||
return dataProvider.instanceService().find(room.getInstanceIdentifier())
|
return dataProvider.instanceService().find(room.getInstanceIdentifier())
|
||||||
.map(node -> new EntityInstance(node, dataProvider))
|
.map(node -> new ObjectInstance(node, dataProvider))
|
||||||
.orElseThrow();
|
.orElseThrow();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,20 +39,20 @@ public class EntityRoom {
|
|||||||
return room.isLocked();
|
return room.isLocked();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<EntityUser> getUsers() {
|
public List<ObjectEntity> getEntities() {
|
||||||
if (cachedUsers != null) {
|
if (cachedUsers != null) {
|
||||||
return cachedUsers;
|
return cachedUsers;
|
||||||
}
|
}
|
||||||
|
|
||||||
cachedUsers = dataProvider.userService().getRoomUsers(room).stream()
|
cachedUsers = dataProvider.entityService().getRoomEntities(room).stream()
|
||||||
.map(user -> new EntityUser(user, dataProvider))
|
.map(user -> new ObjectEntity(user, dataProvider))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
return cachedUsers;
|
return cachedUsers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getCountUsers() {
|
public int getCountEntities() {
|
||||||
return getUsers().size();
|
return getEntities().size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPersist() {
|
public boolean isPersist() {
|
||||||
@ -1,10 +1,10 @@
|
|||||||
package ru.dragonestia.picker.controller.graphql.entity.type;
|
package ru.dragonestia.picker.controller.graphql.object.type;
|
||||||
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import ru.dragonestia.picker.service.InstanceService;
|
import ru.dragonestia.picker.service.InstanceService;
|
||||||
import ru.dragonestia.picker.service.RoomService;
|
import ru.dragonestia.picker.service.RoomService;
|
||||||
import ru.dragonestia.picker.service.UserService;
|
import ru.dragonestia.picker.service.EntityService;
|
||||||
|
|
||||||
public record DataProvider(@NotNull InstanceService instanceService,
|
public record DataProvider(@NotNull InstanceService instanceService,
|
||||||
@NotNull RoomService roomService,
|
@NotNull RoomService roomService,
|
||||||
@NotNull UserService userService) {}
|
@NotNull EntityService entityService) {}
|
||||||
@ -1,17 +1,17 @@
|
|||||||
package ru.dragonestia.picker.model.user;
|
package ru.dragonestia.picker.model.entity;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import ru.dragonestia.picker.api.model.user.IUser;
|
import ru.dragonestia.picker.api.model.user.IUser;
|
||||||
import ru.dragonestia.picker.api.model.user.ResponseUser;
|
import ru.dragonestia.picker.api.model.user.ResponseUser;
|
||||||
import ru.dragonestia.picker.api.model.user.UserDetails;
|
import ru.dragonestia.picker.api.model.user.UserDetails;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
|
|
||||||
public class User implements IUser {
|
public class Entity implements IUser {
|
||||||
|
|
||||||
private final String identifier;
|
private final String identifier;
|
||||||
|
|
||||||
public User(@NotNull UserIdentifier identifier) {
|
public Entity(@NotNull EntityIdentifier identifier) {
|
||||||
this.identifier = identifier.getValue();
|
this.identifier = identifier.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ public class User implements IUser {
|
|||||||
public boolean equals(Object object) {
|
public boolean equals(Object object) {
|
||||||
if (object == this) return true;
|
if (object == this) return true;
|
||||||
if (object == null) return false;
|
if (object == null) return false;
|
||||||
if (object instanceof User other) {
|
if (object instanceof Entity other) {
|
||||||
return identifier.equals(other.identifier);
|
return identifier.equals(other.identifier);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package ru.dragonestia.picker.repository;
|
||||||
|
|
||||||
|
import ru.dragonestia.picker.api.exception.RoomAreFullException;
|
||||||
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface EntityRepository {
|
||||||
|
|
||||||
|
void linkWithRoom(Room room, Collection<Entity> entities, boolean force) throws RoomAreFullException;
|
||||||
|
|
||||||
|
void unlinkWithRoom(Room room, Collection<Entity> entities);
|
||||||
|
|
||||||
|
Collection<Room> findAllLinkedEntityRooms(Entity entity);
|
||||||
|
|
||||||
|
Collection<Entity> entitiesOf(Room room);
|
||||||
|
|
||||||
|
Collection<Entity> search(String input);
|
||||||
|
|
||||||
|
int countAllEntities();
|
||||||
|
|
||||||
|
Map<String, Integer> countEntitiesForNodes();
|
||||||
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
package ru.dragonestia.picker.repository;
|
package ru.dragonestia.picker.repository;
|
||||||
|
|
||||||
import ru.dragonestia.picker.api.exception.NodeAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.InstanceAlreadyExistException;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -8,7 +8,7 @@ import java.util.Optional;
|
|||||||
|
|
||||||
public interface InstanceRepository {
|
public interface InstanceRepository {
|
||||||
|
|
||||||
void create(Instance instance) throws NodeAlreadyExistException;
|
void create(Instance instance) throws InstanceAlreadyExistException;
|
||||||
|
|
||||||
void delete(Instance instance);
|
void delete(Instance instance);
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
|||||||
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -20,5 +20,5 @@ public interface RoomRepository {
|
|||||||
|
|
||||||
Collection<Room> all(Instance instance);
|
Collection<Room> all(Instance instance);
|
||||||
|
|
||||||
Room pick(Instance instance, Set<User> users) throws NoRoomsAvailableException;
|
Room pick(Instance instance, Set<Entity> entities) throws NoRoomsAvailableException;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,25 +0,0 @@
|
|||||||
package ru.dragonestia.picker.repository;
|
|
||||||
|
|
||||||
import ru.dragonestia.picker.api.exception.RoomAreFullException;
|
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
|
||||||
import ru.dragonestia.picker.model.user.User;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public interface UserRepository {
|
|
||||||
|
|
||||||
void linkWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException;
|
|
||||||
|
|
||||||
void unlinkWithRoom(Room room, Collection<User> users);
|
|
||||||
|
|
||||||
Collection<Room> findAllLinkedUserRooms(User user);
|
|
||||||
|
|
||||||
Collection<User> usersOf(Room room);
|
|
||||||
|
|
||||||
Collection<User> search(String input);
|
|
||||||
|
|
||||||
int countAllUsers();
|
|
||||||
|
|
||||||
Map<String, Integer> countUsersForNodes();
|
|
||||||
}
|
|
||||||
@ -2,10 +2,10 @@ package ru.dragonestia.picker.repository.impl;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import ru.dragonestia.picker.api.exception.NodeAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.InstanceAlreadyExistException;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
||||||
import ru.dragonestia.picker.repository.impl.type.UserTransaction;
|
import ru.dragonestia.picker.repository.impl.type.EntityTransaction;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -17,30 +17,30 @@ public class ContainerRepository {
|
|||||||
|
|
||||||
private final Map<String, InstanceContainer> containers = new ConcurrentHashMap<>();
|
private final Map<String, InstanceContainer> containers = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private UserTransaction.Listener transactionListener = transaction -> {};
|
private EntityTransaction.Listener transactionListener = transaction -> {};
|
||||||
|
|
||||||
public void create(Instance instance) throws NodeAlreadyExistException {
|
public void create(Instance instance) throws InstanceAlreadyExistException {
|
||||||
if (containers.containsKey(instance.getIdentifier())) {
|
if (containers.containsKey(instance.getIdentifier())) {
|
||||||
throw new NodeAlreadyExistException(instance.getIdentifier());
|
throw new InstanceAlreadyExistException(instance.getIdentifier());
|
||||||
}
|
}
|
||||||
|
|
||||||
var container = new InstanceContainer(instance, transactionListener);
|
var container = new InstanceContainer(instance, transactionListener);
|
||||||
containers.put(instance.getIdentifier(), container);
|
containers.put(instance.getIdentifier(), container);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void remove(@NotNull String nodeId) {
|
public void remove(@NotNull String instanceId) {
|
||||||
containers.remove(nodeId);
|
containers.remove(instanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull Optional<InstanceContainer> findById(@NotNull String nodeId) {
|
public @NotNull Optional<InstanceContainer> findById(@NotNull String instanceId) {
|
||||||
return Optional.ofNullable(containers.get(nodeId));
|
return Optional.ofNullable(containers.get(instanceId));
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull Collection<InstanceContainer> all() {
|
public @NotNull Collection<InstanceContainer> all() {
|
||||||
return containers.values();
|
return containers.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTransactionListener(@NotNull UserTransaction.Listener transactionListener) {
|
public void setTransactionListener(@NotNull EntityTransaction.Listener transactionListener) {
|
||||||
this.transactionListener = transactionListener;
|
this.transactionListener = transactionListener;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,12 +3,12 @@ package ru.dragonestia.picker.repository.impl;
|
|||||||
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PostConstruct;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import ru.dragonestia.picker.api.exception.NodeNotFoundException;
|
import ru.dragonestia.picker.api.exception.InstanceNotFoundException;
|
||||||
import ru.dragonestia.picker.api.exception.RoomAreFullException;
|
import ru.dragonestia.picker.api.exception.RoomAreFullException;
|
||||||
import ru.dragonestia.picker.api.exception.RoomNotFoundException;
|
import ru.dragonestia.picker.api.exception.RoomNotFoundException;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.repository.UserRepository;
|
import ru.dragonestia.picker.repository.EntityRepository;
|
||||||
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -16,18 +16,18 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
@Component
|
@Component
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class UserRepositoryImpl implements UserRepository {
|
public class EntityRepositoryImpl implements EntityRepository {
|
||||||
|
|
||||||
private final ContainerRepository containerRepository;
|
private final ContainerRepository containerRepository;
|
||||||
|
|
||||||
private final Map<User, Set<Room>> userRooms = new ConcurrentHashMap<>();
|
private final Map<Entity, Set<Room>> entityRooms = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
void init() {
|
void init() {
|
||||||
containerRepository.setTransactionListener(transaction -> {
|
containerRepository.setTransactionListener(transaction -> {
|
||||||
synchronized (userRooms) {
|
synchronized (entityRooms) {
|
||||||
for (var user: transaction.target()) {
|
for (var entity: transaction.target()) {
|
||||||
var set = userRooms.computeIfAbsent(user, k -> new HashSet<>());
|
var set = entityRooms.computeIfAbsent(entity, k -> new HashSet<>());
|
||||||
set.add(transaction.room());
|
set.add(transaction.room());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -35,61 +35,61 @@ public class UserRepositoryImpl implements UserRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void linkWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException {
|
public void linkWithRoom(Room room, Collection<Entity> entities, boolean force) throws RoomAreFullException {
|
||||||
synchronized (userRooms) {
|
synchronized (entityRooms) {
|
||||||
getRoomContainer(room).addUsers(users, force);
|
getRoomContainer(room).addEntities(entities, force);
|
||||||
|
|
||||||
for (var user: users) {
|
for (var entity: entities) {
|
||||||
var set = userRooms.computeIfAbsent(user, k -> new HashSet<>());
|
var set = entityRooms.computeIfAbsent(entity, k -> new HashSet<>());
|
||||||
set.add(room);
|
set.add(room);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unlinkWithRoom(Room room, Collection<User> users) {
|
public void unlinkWithRoom(Room room, Collection<Entity> entities) {
|
||||||
synchronized (userRooms) {
|
synchronized (entityRooms) {
|
||||||
getRoomContainer(room).removeUsers(users);
|
getRoomContainer(room).removeEntities(entities);
|
||||||
|
|
||||||
for (var user: users) {
|
for (var entity: entities) {
|
||||||
var set = userRooms.get(user);
|
var set = entityRooms.get(entity);
|
||||||
if (set == null) continue;
|
if (set == null) continue;
|
||||||
set.remove(room);
|
set.remove(room);
|
||||||
if (set.isEmpty()) userRooms.remove(user);
|
if (set.isEmpty()) entityRooms.remove(entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Room> findAllLinkedUserRooms(User user) {
|
public Collection<Room> findAllLinkedEntityRooms(Entity entity) {
|
||||||
var result = userRooms.get(user);
|
var result = entityRooms.get(entity);
|
||||||
return Collections.unmodifiableSet(result == null? new HashSet<>() : result);
|
return Collections.unmodifiableSet(result == null? new HashSet<>() : result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<User> usersOf(Room room) {
|
public Collection<Entity> entitiesOf(Room room) {
|
||||||
return getRoomContainer(room).allUsers();
|
return getRoomContainer(room).allEntities();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<User> search(String input) {
|
public Collection<Entity> search(String input) {
|
||||||
return userRooms.keySet().stream().filter(user -> user.getIdentifier().startsWith(input)).toList();
|
return entityRooms.keySet().stream().filter(entity -> entity.getIdentifier().startsWith(input)).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int countAllUsers() {
|
public int countAllEntities() {
|
||||||
return userRooms.size();
|
return entityRooms.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Integer> countUsersForNodes() {
|
public Map<String, Integer> countEntitiesForNodes() {
|
||||||
var result = new HashMap<String, Integer>();
|
var result = new HashMap<String, Integer>();
|
||||||
|
|
||||||
containerRepository.all().forEach(nodeContainer -> {
|
containerRepository.all().forEach(nodeContainer -> {
|
||||||
var nodeId = nodeContainer.getInstance().getIdentifier();
|
var nodeId = nodeContainer.getInstance().getIdentifier();
|
||||||
|
|
||||||
nodeContainer.allRooms().forEach(roomContainer -> {
|
nodeContainer.allRooms().forEach(roomContainer -> {
|
||||||
result.put(nodeId, result.getOrDefault(nodeId, 0) + roomContainer.countUsers());
|
result.put(nodeId, result.getOrDefault(nodeId, 0) + roomContainer.countEntities());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ public class UserRepositoryImpl implements UserRepository {
|
|||||||
|
|
||||||
private RoomContainer getRoomContainer(Room room) {
|
private RoomContainer getRoomContainer(Room room) {
|
||||||
return containerRepository.findById(room.getInstanceIdentifier())
|
return containerRepository.findById(room.getInstanceIdentifier())
|
||||||
.orElseThrow(() -> new NodeNotFoundException(room.getInstanceIdentifier()))
|
.orElseThrow(() -> new InstanceNotFoundException(room.getInstanceIdentifier()))
|
||||||
.findRoomById(room.getIdentifier())
|
.findRoomById(room.getIdentifier())
|
||||||
.orElseThrow(() -> new RoomNotFoundException(room.getInstanceIdentifier(), room.getIdentifier()));
|
.orElseThrow(() -> new RoomNotFoundException(room.getInstanceIdentifier(), room.getIdentifier()));
|
||||||
}
|
}
|
||||||
@ -2,7 +2,7 @@ package ru.dragonestia.picker.repository.impl;
|
|||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import ru.dragonestia.picker.api.exception.NodeAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.InstanceAlreadyExistException;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.repository.InstanceRepository;
|
import ru.dragonestia.picker.repository.InstanceRepository;
|
||||||
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
||||||
@ -17,7 +17,7 @@ public class InstanceRepositoryImpl implements InstanceRepository {
|
|||||||
private final ContainerRepository containerRepository;
|
private final ContainerRepository containerRepository;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create(Instance instance) throws NodeAlreadyExistException {
|
public void create(Instance instance) throws InstanceAlreadyExistException {
|
||||||
containerRepository.create(instance);
|
containerRepository.create(instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,11 +3,11 @@ package ru.dragonestia.picker.repository.impl;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
||||||
import ru.dragonestia.picker.api.exception.NodeNotFoundException;
|
import ru.dragonestia.picker.api.exception.InstanceNotFoundException;
|
||||||
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.repository.RoomRepository;
|
import ru.dragonestia.picker.repository.RoomRepository;
|
||||||
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
||||||
|
|
||||||
@ -24,21 +24,21 @@ public class RoomRepositoryImpl implements RoomRepository {
|
|||||||
@Override
|
@Override
|
||||||
public void create(Room room) throws RoomAlreadyExistException {
|
public void create(Room room) throws RoomAlreadyExistException {
|
||||||
containerRepository.findById(room.getInstanceIdentifier())
|
containerRepository.findById(room.getInstanceIdentifier())
|
||||||
.orElseThrow(() -> new NodeNotFoundException(room.getInstanceIdentifier()))
|
.orElseThrow(() -> new InstanceNotFoundException(room.getInstanceIdentifier()))
|
||||||
.addRoom(room);
|
.addRoom(room);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void remove(Room room) {
|
public void remove(Room room) {
|
||||||
containerRepository.findById(room.getInstanceIdentifier())
|
containerRepository.findById(room.getInstanceIdentifier())
|
||||||
.orElseThrow(() -> new NodeNotFoundException(room.getInstanceIdentifier()))
|
.orElseThrow(() -> new InstanceNotFoundException(room.getInstanceIdentifier()))
|
||||||
.removeRoom(room);
|
.removeRoom(room);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<Room> find(Instance instance, String identifier) {
|
public Optional<Room> find(Instance instance, String identifier) {
|
||||||
return containerRepository.findById(instance.getIdentifier())
|
return containerRepository.findById(instance.getIdentifier())
|
||||||
.orElseThrow(() -> new NodeNotFoundException(instance.getIdentifier()))
|
.orElseThrow(() -> new InstanceNotFoundException(instance.getIdentifier()))
|
||||||
.findRoomById(identifier)
|
.findRoomById(identifier)
|
||||||
.map(RoomContainer::getRoom);
|
.map(RoomContainer::getRoom);
|
||||||
}
|
}
|
||||||
@ -46,15 +46,15 @@ public class RoomRepositoryImpl implements RoomRepository {
|
|||||||
@Override
|
@Override
|
||||||
public Collection<Room> all(Instance instance) {
|
public Collection<Room> all(Instance instance) {
|
||||||
return containerRepository.findById(instance.getIdentifier())
|
return containerRepository.findById(instance.getIdentifier())
|
||||||
.orElseThrow(() -> new NodeNotFoundException(instance.getIdentifier()))
|
.orElseThrow(() -> new InstanceNotFoundException(instance.getIdentifier()))
|
||||||
.allRooms()
|
.allRooms()
|
||||||
.stream().map(RoomContainer::getRoom).toList();
|
.stream().map(RoomContainer::getRoom).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Room pick(Instance instance, Set<User> users) throws NoRoomsAvailableException {
|
public Room pick(Instance instance, Set<Entity> entities) throws NoRoomsAvailableException {
|
||||||
return containerRepository.findById(instance.getIdentifier())
|
return containerRepository.findById(instance.getIdentifier())
|
||||||
.orElseThrow(() -> new NodeNotFoundException(instance.getIdentifier()))
|
.orElseThrow(() -> new InstanceNotFoundException(instance.getIdentifier()))
|
||||||
.pick(users);
|
.pick(entities);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,12 +5,12 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.repository.impl.picker.LeastPickedPicker;
|
import ru.dragonestia.picker.repository.impl.picker.LeastPickedPicker;
|
||||||
import ru.dragonestia.picker.repository.impl.picker.RoomPicker;
|
import ru.dragonestia.picker.repository.impl.picker.RoomPicker;
|
||||||
import ru.dragonestia.picker.repository.impl.picker.RoundRobinPicker;
|
import ru.dragonestia.picker.repository.impl.picker.RoundRobinPicker;
|
||||||
import ru.dragonestia.picker.repository.impl.picker.SequentialFillingPicker;
|
import ru.dragonestia.picker.repository.impl.picker.SequentialFillingPicker;
|
||||||
import ru.dragonestia.picker.repository.impl.type.UserTransaction;
|
import ru.dragonestia.picker.repository.impl.type.EntityTransaction;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@ -21,13 +21,13 @@ public class InstanceContainer {
|
|||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final Instance instance;
|
private final Instance instance;
|
||||||
private final UserTransaction.Listener transactionListener;
|
private final EntityTransaction.Listener transactionListener;
|
||||||
private final RoomPicker picker;
|
private final RoomPicker picker;
|
||||||
|
|
||||||
private final ReadWriteLock roomLock = new ReentrantReadWriteLock();
|
private final ReadWriteLock roomLock = new ReentrantReadWriteLock();
|
||||||
private final Map<String, RoomContainer> rooms = new ConcurrentHashMap<>();
|
private final Map<String, RoomContainer> rooms = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public InstanceContainer(@NotNull Instance instance, @NotNull UserTransaction.Listener transactionListener) {
|
public InstanceContainer(@NotNull Instance instance, @NotNull EntityTransaction.Listener transactionListener) {
|
||||||
this.instance = instance;
|
this.instance = instance;
|
||||||
this.transactionListener = transactionListener;
|
this.transactionListener = transactionListener;
|
||||||
this.picker = initPicker();
|
this.picker = initPicker();
|
||||||
@ -92,11 +92,11 @@ public class InstanceContainer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull Room pick(@NotNull Set<User> users) {
|
public @NotNull Room pick(@NotNull Set<Entity> entities) {
|
||||||
synchronized (picker) {
|
synchronized (picker) {
|
||||||
var room = picker.pick(users);
|
var room = picker.pick(entities);
|
||||||
room.addUsers(users, false);
|
room.addEntities(entities, false);
|
||||||
transactionListener.accept(new UserTransaction(room.getRoom(), users));
|
transactionListener.accept(new EntityTransaction(room.getRoom(), entities));
|
||||||
return room.getRoom();
|
return room.getRoom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import lombok.Getter;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import ru.dragonestia.picker.api.exception.RoomAreFullException;
|
import ru.dragonestia.picker.api.exception.RoomAreFullException;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.repository.impl.picker.LeastPickedPicker;
|
import ru.dragonestia.picker.repository.impl.picker.LeastPickedPicker;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -17,87 +17,87 @@ public class RoomContainer {
|
|||||||
private final Room room;
|
private final Room room;
|
||||||
private final InstanceContainer container;
|
private final InstanceContainer container;
|
||||||
|
|
||||||
private final ReadWriteLock usersLock = new ReentrantReadWriteLock(true);
|
private final ReadWriteLock entityLock = new ReentrantReadWriteLock(true);
|
||||||
private final Set<User> users = new HashSet<>();
|
private final Set<Entity> entities = new HashSet<>();
|
||||||
|
|
||||||
public RoomContainer(@NotNull Room room, @NotNull InstanceContainer container) {
|
public RoomContainer(@NotNull Room room, @NotNull InstanceContainer container) {
|
||||||
this.room = room;
|
this.room = room;
|
||||||
this.container = container;
|
this.container = container;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addUsers(@NotNull Collection<User> toAdd, boolean force) {
|
public void addEntities(@NotNull Collection<Entity> toAdd, boolean force) {
|
||||||
usersLock.writeLock().lock();
|
entityLock.writeLock().lock();
|
||||||
try {
|
try {
|
||||||
if (force || canAdd0(toAdd.size())) {
|
if (force || canAdd0(toAdd.size())) {
|
||||||
users.addAll(toAdd);
|
entities.addAll(toAdd);
|
||||||
noticePickersAboutUserNumberUpdate();
|
noticePickersAboutEntityNumberUpdate();
|
||||||
} else {
|
} else {
|
||||||
throw new RoomAreFullException(room.getInstanceIdentifier(), room.getIdentifier());
|
throw new RoomAreFullException(room.getInstanceIdentifier(), room.getIdentifier());
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
usersLock.writeLock().unlock();
|
entityLock.writeLock().unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeUsers(@NotNull Collection<User> toRemove) {
|
public void removeEntities(@NotNull Collection<Entity> toRemove) {
|
||||||
usersLock.writeLock().lock();
|
entityLock.writeLock().lock();
|
||||||
try {
|
try {
|
||||||
users.removeAll(toRemove);
|
entities.removeAll(toRemove);
|
||||||
noticePickersAboutUserNumberUpdate();
|
noticePickersAboutEntityNumberUpdate();
|
||||||
} finally {
|
} finally {
|
||||||
usersLock.writeLock().unlock();
|
entityLock.writeLock().unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull Collection<User> removeAllUsers() {
|
public @NotNull Collection<Entity> removeAllEntities() {
|
||||||
usersLock.writeLock().lock();
|
entityLock.writeLock().lock();
|
||||||
try {
|
try {
|
||||||
var set = new HashSet<>(users);
|
var set = new HashSet<>(entities);
|
||||||
users.clear();
|
entities.clear();
|
||||||
noticePickersAboutUserNumberUpdate();
|
noticePickersAboutEntityNumberUpdate();
|
||||||
return set;
|
return set;
|
||||||
} finally {
|
} finally {
|
||||||
usersLock.writeLock().unlock();
|
entityLock.writeLock().unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull Collection<User> allUsers() {
|
public @NotNull Collection<Entity> allEntities() {
|
||||||
usersLock.readLock().lock();
|
entityLock.readLock().lock();
|
||||||
try {
|
try {
|
||||||
return new ArrayList<>(users);
|
return new ArrayList<>(entities);
|
||||||
} finally {
|
} finally {
|
||||||
usersLock.readLock().unlock();
|
entityLock.readLock().unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int countUsers() {
|
public int countEntities() {
|
||||||
return users.size();
|
return entities.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean canAdd0(int users) {
|
private boolean canAdd0(int entities) {
|
||||||
return room.hasUnlimitedSlots() || users + countUsers() <= room.getMaxSlots();
|
return room.hasUnlimitedSlots() || entities + countEntities() <= room.getMaxSlots();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canAdd(int users) {
|
public boolean canAdd(int entities) {
|
||||||
try {
|
try {
|
||||||
return canAdd0(users);
|
return canAdd0(entities);
|
||||||
} finally {
|
} finally {
|
||||||
usersLock.readLock().unlock();
|
entityLock.readLock().unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canBePicked(int users) {
|
public boolean canBePicked(int entities) {
|
||||||
usersLock.readLock().lock();
|
entityLock.readLock().lock();
|
||||||
try {
|
try {
|
||||||
return !room.isLocked() && canAdd0(users);
|
return !room.isLocked() && canAdd0(entities);
|
||||||
} finally {
|
} finally {
|
||||||
usersLock.readLock().unlock();
|
entityLock.readLock().unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void noticePickersAboutUserNumberUpdate() {
|
private void noticePickersAboutEntityNumberUpdate() {
|
||||||
if (container.getPicker() instanceof LeastPickedPicker picker) {
|
if (container.getPicker() instanceof LeastPickedPicker picker) {
|
||||||
picker.updateUsersAmount(room, countUsers());
|
picker.updateEntitiesAmount(room, countEntities());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
||||||
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.repository.impl.collection.DynamicSortedMap;
|
import ru.dragonestia.picker.repository.impl.collection.DynamicSortedMap;
|
||||||
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
||||||
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
||||||
@ -32,14 +32,14 @@ public class LeastPickedPicker implements RoomPicker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RoomContainer pick(Collection<User> users) {
|
public RoomContainer pick(Collection<Entity> entities) {
|
||||||
RoomWrapper wrapper;
|
RoomWrapper wrapper;
|
||||||
|
|
||||||
synchronized (map) {
|
synchronized (map) {
|
||||||
try {
|
try {
|
||||||
wrapper = map.getMinimum();
|
wrapper = map.getMinimum();
|
||||||
|
|
||||||
if (!wrapper.canAddUnits(users.size())) throw new RuntimeException();
|
if (!wrapper.canAddUnits(entities.size())) throw new RuntimeException();
|
||||||
} catch (RuntimeException ex) {
|
} catch (RuntimeException ex) {
|
||||||
throw new NoRoomsAvailableException(container.getInstance().getIdentifier());
|
throw new NoRoomsAvailableException(container.getInstance().getIdentifier());
|
||||||
}
|
}
|
||||||
@ -48,7 +48,7 @@ public class LeastPickedPicker implements RoomPicker {
|
|||||||
return wrapper.getItem();
|
return wrapper.getItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateUsersAmount(Room room, int users) {
|
public void updateEntitiesAmount(Room room, int users) {
|
||||||
synchronized (map) {
|
synchronized (map) {
|
||||||
map.updateItem(room.getIdentifier(), prevValue -> users);
|
map.updateItem(room.getIdentifier(), prevValue -> users);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
package ru.dragonestia.picker.repository.impl.picker;
|
package ru.dragonestia.picker.repository.impl.picker;
|
||||||
|
|
||||||
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
||||||
|
|
||||||
public interface RoomPicker extends Picker<RoomContainer, User> {
|
public interface RoomPicker extends Picker<RoomContainer, Entity> {
|
||||||
|
|
||||||
PickingMethod getPickingMode();
|
PickingMethod getPickingMode();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,7 @@ public class RoomWrapper implements ItemWrapper<RoomContainer>, QueuedLinkedList
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int countUnits() {
|
public int countUnits() {
|
||||||
return container.countUsers();
|
return container.countEntities();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package ru.dragonestia.picker.repository.impl.picker;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
||||||
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.repository.impl.collection.QueuedLinkedList;
|
import ru.dragonestia.picker.repository.impl.collection.QueuedLinkedList;
|
||||||
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
||||||
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
||||||
@ -33,8 +33,8 @@ public class RoundRobinPicker implements RoomPicker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RoomContainer pick(Collection<User> users) {
|
public RoomContainer pick(Collection<Entity> entities) {
|
||||||
int amount = users.size();
|
int amount = entities.size();
|
||||||
RoomWrapper wrapper;
|
RoomWrapper wrapper;
|
||||||
|
|
||||||
synchronized (list) {
|
synchronized (list) {
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package ru.dragonestia.picker.repository.impl.picker;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
||||||
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
import ru.dragonestia.picker.repository.impl.container.InstanceContainer;
|
||||||
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
import ru.dragonestia.picker.repository.impl.container.RoomContainer;
|
||||||
|
|
||||||
@ -32,8 +32,8 @@ public class SequentialFillingPicker implements RoomPicker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RoomContainer pick(Collection<User> users) {
|
public RoomContainer pick(Collection<Entity> entities) {
|
||||||
int amount = users.size();
|
int amount = entities.size();
|
||||||
|
|
||||||
synchronized (wrappers) {
|
synchronized (wrappers) {
|
||||||
for (var wrapper: wrappers.values()) {
|
for (var wrapper: wrappers.values()) {
|
||||||
|
|||||||
@ -2,12 +2,12 @@ package ru.dragonestia.picker.repository.impl.type;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public record UserTransaction(@NotNull Room room, Collection<User> target) {
|
public record EntityTransaction(@NotNull Room room, Collection<Entity> target) {
|
||||||
|
|
||||||
public interface Listener extends Consumer<UserTransaction> {}
|
public interface Listener extends Consumer<EntityTransaction> {}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
package ru.dragonestia.picker.service;
|
||||||
|
|
||||||
|
import ru.dragonestia.picker.api.exception.RoomAreFullException;
|
||||||
|
import ru.dragonestia.picker.api.model.user.ResponseUser;
|
||||||
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface EntityService {
|
||||||
|
|
||||||
|
Collection<Room> getEntityRooms(Entity entity);
|
||||||
|
|
||||||
|
void linkEntitiesWithRoom(Room room, Collection<Entity> entities, boolean force) throws RoomAreFullException;
|
||||||
|
|
||||||
|
void unlinkEntitiesFromRoom(Room room, Collection<Entity> entities);
|
||||||
|
|
||||||
|
Collection<Entity> getRoomEntities(Room room);
|
||||||
|
|
||||||
|
List<ResponseUser> searchEntities(String input);
|
||||||
|
|
||||||
|
ResponseUser getEntityDetails(String userId);
|
||||||
|
}
|
||||||
@ -2,7 +2,7 @@ package ru.dragonestia.picker.service;
|
|||||||
|
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import ru.dragonestia.picker.api.exception.InvalidInstanceIdentifierException;
|
import ru.dragonestia.picker.api.exception.InvalidInstanceIdentifierException;
|
||||||
import ru.dragonestia.picker.api.exception.NodeAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.InstanceAlreadyExistException;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -11,7 +11,7 @@ import java.util.Optional;
|
|||||||
public interface InstanceService {
|
public interface InstanceService {
|
||||||
|
|
||||||
@PreAuthorize("hasRole('NODE_MANAGEMENT')")
|
@PreAuthorize("hasRole('NODE_MANAGEMENT')")
|
||||||
void create(Instance instance) throws InvalidInstanceIdentifierException, NodeAlreadyExistException;
|
void create(Instance instance) throws InvalidInstanceIdentifierException, InstanceAlreadyExistException;
|
||||||
|
|
||||||
@PreAuthorize("hasRole('NODE_MANAGEMENT')")
|
@PreAuthorize("hasRole('NODE_MANAGEMENT')")
|
||||||
void remove(Instance instance);
|
void remove(Instance instance);
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
|||||||
import ru.dragonestia.picker.api.repository.response.PickedRoomResponse;
|
import ru.dragonestia.picker.api.repository.response.PickedRoomResponse;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@ -21,7 +21,7 @@ public interface RoomService {
|
|||||||
|
|
||||||
Collection<Room> all(Instance instance);
|
Collection<Room> all(Instance instance);
|
||||||
|
|
||||||
PickedRoomResponse pickAvailable(Instance instance, Set<User> users);
|
PickedRoomResponse pickAvailable(Instance instance, Set<Entity> entities);
|
||||||
|
|
||||||
void updateState(Room room);
|
void updateState(Room room);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,24 +0,0 @@
|
|||||||
package ru.dragonestia.picker.service;
|
|
||||||
|
|
||||||
import ru.dragonestia.picker.api.exception.RoomAreFullException;
|
|
||||||
import ru.dragonestia.picker.api.model.user.ResponseUser;
|
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
|
||||||
import ru.dragonestia.picker.model.user.User;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public interface UserService {
|
|
||||||
|
|
||||||
Collection<Room> getUserRooms(User user);
|
|
||||||
|
|
||||||
void linkUsersWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException;
|
|
||||||
|
|
||||||
void unlinkUsersFromRoom(Room room, Collection<User> users);
|
|
||||||
|
|
||||||
Collection<User> getRoomUsers(Room room);
|
|
||||||
|
|
||||||
List<ResponseUser> searchUsers(String input);
|
|
||||||
|
|
||||||
ResponseUser getUserDetails(String userId);
|
|
||||||
}
|
|
||||||
@ -74,7 +74,7 @@ public class AccountServiceImpl implements AccountService {
|
|||||||
return accounts.get(lowerUsername);
|
return accounts.get(lowerUsername);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new UsernameNotFoundException("User '" + username + "' does not exists");
|
throw new UsernameNotFoundException("Entity '" + username + "' does not exists");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkAdmin(String accountId) {
|
private void checkAdmin(String accountId) {
|
||||||
|
|||||||
@ -0,0 +1,48 @@
|
|||||||
|
package ru.dragonestia.picker.service.impl;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.dragonestia.picker.api.model.user.ResponseUser;
|
||||||
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
|
import ru.dragonestia.picker.repository.EntityRepository;
|
||||||
|
import ru.dragonestia.picker.service.EntityService;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Service
|
||||||
|
public class EntityServiceImpl implements EntityService {
|
||||||
|
|
||||||
|
private final EntityRepository entityRepository;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<Room> getEntityRooms(Entity entity) {
|
||||||
|
return entityRepository.findAllLinkedEntityRooms(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void linkEntitiesWithRoom(Room room, Collection<Entity> entities, boolean force) {
|
||||||
|
entityRepository.linkWithRoom(room, entities, force);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unlinkEntitiesFromRoom(Room room, Collection<Entity> entities) {
|
||||||
|
entityRepository.unlinkWithRoom(room, entities);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<Entity> getRoomEntities(Room room) {
|
||||||
|
return entityRepository.entitiesOf(room);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ResponseUser> searchEntities(String input) {
|
||||||
|
return entityRepository.search(input).stream().map(Entity::toResponseObject).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseUser getEntityDetails(String userId) {
|
||||||
|
throw new UnsupportedOperationException("Not implemented");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,7 +3,7 @@ package ru.dragonestia.picker.service.impl;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.dragonestia.picker.api.exception.InvalidInstanceIdentifierException;
|
import ru.dragonestia.picker.api.exception.InvalidInstanceIdentifierException;
|
||||||
import ru.dragonestia.picker.api.exception.NodeAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.InstanceAlreadyExistException;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.repository.InstanceRepository;
|
import ru.dragonestia.picker.repository.InstanceRepository;
|
||||||
import ru.dragonestia.picker.repository.RoomRepository;
|
import ru.dragonestia.picker.repository.RoomRepository;
|
||||||
@ -22,7 +22,7 @@ public class InstanceServiceImpl implements InstanceService {
|
|||||||
private final InstanceAndRoomStorage storage;
|
private final InstanceAndRoomStorage storage;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create(Instance instance) throws InvalidInstanceIdentifierException, NodeAlreadyExistException {
|
public void create(Instance instance) throws InvalidInstanceIdentifierException, InstanceAlreadyExistException {
|
||||||
instanceRepository.create(instance);
|
instanceRepository.create(instance);
|
||||||
storage.saveInstance(instance);
|
storage.saveInstance(instance);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,19 +4,18 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.dragonestia.picker.api.exception.InvalidRoomIdentifierException;
|
import ru.dragonestia.picker.api.exception.InvalidRoomIdentifierException;
|
||||||
import ru.dragonestia.picker.api.exception.NodeNotFoundException;
|
import ru.dragonestia.picker.api.exception.InstanceNotFoundException;
|
||||||
import ru.dragonestia.picker.api.exception.NotPersistedNodeException;
|
import ru.dragonestia.picker.api.exception.NotPersistedNodeException;
|
||||||
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
||||||
import ru.dragonestia.picker.api.repository.response.PickedRoomResponse;
|
import ru.dragonestia.picker.api.repository.response.PickedRoomResponse;
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
import ru.dragonestia.picker.model.room.Room;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.repository.InstanceRepository;
|
import ru.dragonestia.picker.repository.InstanceRepository;
|
||||||
import ru.dragonestia.picker.repository.RoomRepository;
|
import ru.dragonestia.picker.repository.RoomRepository;
|
||||||
import ru.dragonestia.picker.repository.UserRepository;
|
import ru.dragonestia.picker.repository.EntityRepository;
|
||||||
import ru.dragonestia.picker.service.RoomService;
|
import ru.dragonestia.picker.service.RoomService;
|
||||||
import ru.dragonestia.picker.storage.InstanceAndRoomStorage;
|
import ru.dragonestia.picker.storage.InstanceAndRoomStorage;
|
||||||
import ru.dragonestia.picker.util.NamingValidator;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -28,15 +27,12 @@ public class RoomServiceImpl implements RoomService {
|
|||||||
|
|
||||||
private final RoomRepository roomRepository;
|
private final RoomRepository roomRepository;
|
||||||
private final InstanceRepository instanceRepository;
|
private final InstanceRepository instanceRepository;
|
||||||
private final UserRepository userRepository;
|
private final EntityRepository entityRepository;
|
||||||
private final NamingValidator namingValidator;
|
|
||||||
private final InstanceAndRoomStorage storage;
|
private final InstanceAndRoomStorage storage;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void create(Room room) throws InvalidRoomIdentifierException, RoomAlreadyExistException, NotPersistedNodeException {
|
public void create(Room room) throws InvalidRoomIdentifierException, RoomAlreadyExistException, NotPersistedNodeException {
|
||||||
namingValidator.validateRoomId(room.getInstanceIdentifier(), room.getIdentifier());
|
var node = instanceRepository.findById(room.getInstanceIdentifier()).orElseThrow(() -> new InstanceNotFoundException(room.getInstanceIdentifier()));
|
||||||
|
|
||||||
var node = instanceRepository.findById(room.getInstanceIdentifier()).orElseThrow(() -> new NodeNotFoundException(room.getInstanceIdentifier()));
|
|
||||||
if (!node.isPersist() && room.isPersist()) {
|
if (!node.isPersist() && room.isPersist()) {
|
||||||
throw new NotPersistedNodeException(node.getIdentifier(), room.getIdentifier());
|
throw new NotPersistedNodeException(node.getIdentifier(), room.getIdentifier());
|
||||||
}
|
}
|
||||||
@ -62,9 +58,9 @@ public class RoomServiceImpl implements RoomService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PickedRoomResponse pickAvailable(Instance instance, Set<User> users) {
|
public PickedRoomResponse pickAvailable(Instance instance, Set<Entity> entities) {
|
||||||
var room = roomRepository.pick(instance, users);
|
var room = roomRepository.pick(instance, entities);
|
||||||
var roomUsers = userRepository.usersOf(room);
|
var roomUsers = entityRepository.entitiesOf(room);
|
||||||
|
|
||||||
return new PickedRoomResponse(
|
return new PickedRoomResponse(
|
||||||
room.getInstanceIdentifier(),
|
room.getInstanceIdentifier(),
|
||||||
@ -73,7 +69,7 @@ public class RoomServiceImpl implements RoomService {
|
|||||||
room.getMaxSlots(),
|
room.getMaxSlots(),
|
||||||
roomUsers.size(),
|
roomUsers.size(),
|
||||||
room.isLocked(),
|
room.isLocked(),
|
||||||
roomUsers.stream().map(User::getIdentifier).collect(Collectors.toSet())
|
roomUsers.stream().map(Entity::getIdentifier).collect(Collectors.toSet())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,48 +0,0 @@
|
|||||||
package ru.dragonestia.picker.service.impl;
|
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import ru.dragonestia.picker.api.model.user.ResponseUser;
|
|
||||||
import ru.dragonestia.picker.model.room.Room;
|
|
||||||
import ru.dragonestia.picker.model.user.User;
|
|
||||||
import ru.dragonestia.picker.repository.UserRepository;
|
|
||||||
import ru.dragonestia.picker.service.UserService;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Service
|
|
||||||
public class UserServiceImpl implements UserService {
|
|
||||||
|
|
||||||
private final UserRepository userRepository;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<Room> getUserRooms(User user) {
|
|
||||||
return userRepository.findAllLinkedUserRooms(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void linkUsersWithRoom(Room room, Collection<User> users, boolean force) {
|
|
||||||
userRepository.linkWithRoom(room, users, force);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void unlinkUsersFromRoom(Room room, Collection<User> users) {
|
|
||||||
userRepository.unlinkWithRoom(room, users);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<User> getRoomUsers(Room room) {
|
|
||||||
return userRepository.usersOf(room);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<ResponseUser> searchUsers(String input) {
|
|
||||||
return userRepository.search(input).stream().map(User::toResponseObject).toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ResponseUser getUserDetails(String userId) {
|
|
||||||
throw new UnsupportedOperationException("Not implemented");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
package ru.dragonestia.picker.util;
|
|
||||||
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import ru.dragonestia.picker.api.exception.InvalidInstanceIdentifierException;
|
|
||||||
import ru.dragonestia.picker.api.exception.InvalidRoomIdentifierException;
|
|
||||||
import ru.dragonestia.picker.api.exception.InvalidUsernamesException;
|
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
|
||||||
import ru.dragonestia.picker.api.util.IdentifierValidator;
|
|
||||||
import ru.dragonestia.picker.model.user.User;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
public class NamingValidator {
|
|
||||||
|
|
||||||
public void validateInstanceId(String input) throws InvalidInstanceIdentifierException {
|
|
||||||
if (IdentifierValidator.forNode(input)) return;
|
|
||||||
|
|
||||||
throw new InvalidInstanceIdentifierException(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void validateRoomId(String nodeId, String input) throws InvalidRoomIdentifierException {
|
|
||||||
if (IdentifierValidator.forRoom(input)) return;
|
|
||||||
|
|
||||||
throw new InvalidRoomIdentifierException(nodeId, input);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean validateUserId(String input) {
|
|
||||||
return IdentifierValidator.forUser(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void validateUserIds(Collection<String> input) throws InvalidUsernamesException {
|
|
||||||
var users = new LinkedList<User>();
|
|
||||||
var invalid = new LinkedList<String>();
|
|
||||||
|
|
||||||
for (var username: input) {
|
|
||||||
if (validateUserId(username)) {
|
|
||||||
users.add(new User(UserIdentifier.of(username)));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
invalid.add(username);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!invalid.isEmpty()) {
|
|
||||||
throw new InvalidUsernamesException(input.stream().toList(), invalid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -3,8 +3,8 @@ type Query {
|
|||||||
instanceById(id: String!): Instance
|
instanceById(id: String!): Instance
|
||||||
allRooms(nodeId: String!): [Room]
|
allRooms(nodeId: String!): [Room]
|
||||||
roomById(nodeId: String!, roomId: String!): Room
|
roomById(nodeId: String!, roomId: String!): Room
|
||||||
userById(id: String!): User!
|
entityById(id: String!): Entity!
|
||||||
searchUser(input: String!): [User]
|
searchEntity(input: String!): [Entity]
|
||||||
}
|
}
|
||||||
|
|
||||||
type Instance {
|
type Instance {
|
||||||
@ -22,12 +22,12 @@ type Room {
|
|||||||
slots: Int!
|
slots: Int!
|
||||||
payload: String!
|
payload: String!
|
||||||
locked: Boolean!
|
locked: Boolean!
|
||||||
users: [User]
|
entities: [Entity]
|
||||||
countUsers: Int!
|
countEntities: Int!
|
||||||
persist: Boolean!
|
persist: Boolean!
|
||||||
}
|
}
|
||||||
|
|
||||||
type User {
|
type Entity {
|
||||||
id: String!
|
id: String!
|
||||||
rooms: [Room]
|
rooms: [Room]
|
||||||
countRooms: Int!
|
countRooms: Int!
|
||||||
|
|||||||
@ -6,13 +6,13 @@ import org.springframework.context.annotation.Bean;
|
|||||||
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.model.factory.RoomFactory;
|
import ru.dragonestia.picker.model.factory.RoomFactory;
|
||||||
import ru.dragonestia.picker.repository.InstanceRepository;
|
import ru.dragonestia.picker.repository.InstanceRepository;
|
||||||
import ru.dragonestia.picker.repository.RoomRepository;
|
import ru.dragonestia.picker.repository.RoomRepository;
|
||||||
import ru.dragonestia.picker.repository.UserRepository;
|
import ru.dragonestia.picker.repository.EntityRepository;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ public class FillingNodesConfig {
|
|||||||
private RoomRepository roomRepository;
|
private RoomRepository roomRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserRepository userRepository;
|
private EntityRepository entityRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RoomFactory roomFactory;
|
private RoomFactory roomFactory;
|
||||||
@ -93,8 +93,8 @@ public class FillingNodesConfig {
|
|||||||
|
|
||||||
var users = n - i;
|
var users = n - i;
|
||||||
for (int k = users - 1; k >= 0; k--) {
|
for (int k = users - 1; k >= 0; k--) {
|
||||||
var user = new User(UserIdentifier.of("user-" + k));
|
var user = new Entity(EntityIdentifier.of("user-" + k));
|
||||||
userRepository.linkWithRoom(room, List.of(user), false);
|
entityRepository.linkWithRoom(room, List.of(user), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
//System.out.printf("Room '%s' has %s/%s users%n", roomId, users, n);
|
//System.out.printf("Room '%s' has %s/%s users%n", roomId, users, n);
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
|||||||
import ru.dragonestia.picker.config.FillingNodesConfig;
|
import ru.dragonestia.picker.config.FillingNodesConfig;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.repository.RoomRepository;
|
import ru.dragonestia.picker.repository.RoomRepository;
|
||||||
import ru.dragonestia.picker.repository.UserRepository;
|
import ru.dragonestia.picker.repository.EntityRepository;
|
||||||
import ru.dragonestia.picker.util.UserFiller;
|
import ru.dragonestia.picker.util.UserFiller;
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@ -28,7 +28,7 @@ public class LeastPickedTests {
|
|||||||
private RoomRepository roomRepository;
|
private RoomRepository roomRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserRepository userRepository;
|
private EntityRepository entityRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserFiller userFiller;
|
private UserFiller userFiller;
|
||||||
@ -41,11 +41,11 @@ public class LeastPickedTests {
|
|||||||
@ParameterizedTest
|
@ParameterizedTest
|
||||||
@ArgumentsSource(PickingArgumentProvider.class)
|
@ArgumentsSource(PickingArgumentProvider.class)
|
||||||
void testPicking(String expectedRoomId, int usersAmount) {
|
void testPicking(String expectedRoomId, int usersAmount) {
|
||||||
var expectedRoomUsers = userRepository.usersOf(roomRepository.find(instance, expectedRoomId).orElseThrow()).size();
|
var expectedRoomUsers = entityRepository.entitiesOf(roomRepository.find(instance, expectedRoomId).orElseThrow()).size();
|
||||||
|
|
||||||
var room = roomRepository.pick(instance, userFiller.createRandomUsers(usersAmount));
|
var room = roomRepository.pick(instance, userFiller.createRandomUsers(usersAmount));
|
||||||
var slots = room.getMaxSlots();
|
var slots = room.getMaxSlots();
|
||||||
var users = userRepository.usersOf(room);
|
var users = entityRepository.entitiesOf(room);
|
||||||
Assertions.assertTrue(slots == -1 || slots >= users.size()); // check slots limitation
|
Assertions.assertTrue(slots == -1 || slots >= users.size()); // check slots limitation
|
||||||
|
|
||||||
System.out.printf("Room(%s) has %s/%s users. Expected: %s(%s), added: %s%n", room.getIdentifier(), users.size(), slots, expectedRoomId, expectedRoomUsers, usersAmount);
|
System.out.printf("Room(%s) has %s/%s users. Expected: %s(%s), added: %s%n", room.getIdentifier(), users.size(), slots, expectedRoomId, expectedRoomUsers, usersAmount);
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
|||||||
import ru.dragonestia.picker.config.FillingNodesConfig;
|
import ru.dragonestia.picker.config.FillingNodesConfig;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.repository.RoomRepository;
|
import ru.dragonestia.picker.repository.RoomRepository;
|
||||||
import ru.dragonestia.picker.repository.UserRepository;
|
import ru.dragonestia.picker.repository.EntityRepository;
|
||||||
import ru.dragonestia.picker.util.UserFiller;
|
import ru.dragonestia.picker.util.UserFiller;
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@ -26,7 +26,7 @@ public class RoundRobinTests {
|
|||||||
private RoomRepository roomRepository;
|
private RoomRepository roomRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserRepository userRepository;
|
private EntityRepository entityRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserFiller userFiller;
|
private UserFiller userFiller;
|
||||||
@ -41,7 +41,7 @@ public class RoundRobinTests {
|
|||||||
void testPicking(String expectedRoomId, int usersAmount) {
|
void testPicking(String expectedRoomId, int usersAmount) {
|
||||||
var room = roomRepository.pick(instance, userFiller.createRandomUsers(usersAmount));
|
var room = roomRepository.pick(instance, userFiller.createRandomUsers(usersAmount));
|
||||||
var slots = room.getMaxSlots();
|
var slots = room.getMaxSlots();
|
||||||
var users = userRepository.usersOf(room);
|
var users = entityRepository.entitiesOf(room);
|
||||||
Assertions.assertTrue(slots == -1 || slots >= users.size()); // check slots limitation
|
Assertions.assertTrue(slots == -1 || slots >= users.size()); // check slots limitation
|
||||||
|
|
||||||
Assertions.assertEquals(expectedRoomId, room.getIdentifier());
|
Assertions.assertEquals(expectedRoomId, room.getIdentifier());
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import ru.dragonestia.picker.api.exception.NoRoomsAvailableException;
|
|||||||
import ru.dragonestia.picker.config.FillingNodesConfig;
|
import ru.dragonestia.picker.config.FillingNodesConfig;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.repository.RoomRepository;
|
import ru.dragonestia.picker.repository.RoomRepository;
|
||||||
import ru.dragonestia.picker.repository.UserRepository;
|
import ru.dragonestia.picker.repository.EntityRepository;
|
||||||
import ru.dragonestia.picker.util.UserFiller;
|
import ru.dragonestia.picker.util.UserFiller;
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@ -28,7 +28,7 @@ public class SequentialFillingTests {
|
|||||||
private RoomRepository roomRepository;
|
private RoomRepository roomRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserRepository userRepository;
|
private EntityRepository entityRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserFiller userFiller;
|
private UserFiller userFiller;
|
||||||
@ -41,11 +41,11 @@ public class SequentialFillingTests {
|
|||||||
@ParameterizedTest
|
@ParameterizedTest
|
||||||
@ArgumentsSource(PickingArgumentProvider.class)
|
@ArgumentsSource(PickingArgumentProvider.class)
|
||||||
void testPicking(String expectedRoomId, int usersAmount) {
|
void testPicking(String expectedRoomId, int usersAmount) {
|
||||||
var expectedRoomUsers = userRepository.usersOf(roomRepository.find(instance, expectedRoomId).orElseThrow()).size();
|
var expectedRoomUsers = entityRepository.entitiesOf(roomRepository.find(instance, expectedRoomId).orElseThrow()).size();
|
||||||
|
|
||||||
var room = roomRepository.pick(instance, userFiller.createRandomUsers(usersAmount));
|
var room = roomRepository.pick(instance, userFiller.createRandomUsers(usersAmount));
|
||||||
var slots = room.getMaxSlots();
|
var slots = room.getMaxSlots();
|
||||||
var users = userRepository.usersOf(room);
|
var users = entityRepository.entitiesOf(room);
|
||||||
Assertions.assertTrue(slots == -1 || slots >= users.size()); // check slots limitation
|
Assertions.assertTrue(slots == -1 || slots >= users.size()); // check slots limitation
|
||||||
|
|
||||||
System.out.printf("Room(%s) has %s/%s users. Expected: %s(%s), added: %s%n", room.getIdentifier(), users.size(), slots, expectedRoomId, expectedRoomUsers, usersAmount);
|
System.out.printf("Room(%s) has %s/%s users. Expected: %s(%s), added: %s%n", room.getIdentifier(), users.size(), slots, expectedRoomId, expectedRoomUsers, usersAmount);
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
import org.springframework.security.test.context.support.WithMockUser;
|
import org.springframework.security.test.context.support.WithMockUser;
|
||||||
import ru.dragonestia.picker.api.exception.NodeAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.InstanceAlreadyExistException;
|
||||||
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
@ -25,7 +25,7 @@ public class InstanceServiceTests {
|
|||||||
|
|
||||||
Assertions.assertDoesNotThrow(() -> instanceService.create(node));
|
Assertions.assertDoesNotThrow(() -> instanceService.create(node));
|
||||||
Assertions.assertTrue(instanceService.find(node.getIdentifier()).isPresent());
|
Assertions.assertTrue(instanceService.find(node.getIdentifier()).isPresent());
|
||||||
Assertions.assertThrows(NodeAlreadyExistException.class, () -> instanceService.create(node));
|
Assertions.assertThrows(InstanceAlreadyExistException.class, () -> instanceService.create(node));
|
||||||
|
|
||||||
instanceService.remove(node);
|
instanceService.remove(node);
|
||||||
|
|
||||||
|
|||||||
@ -6,17 +6,17 @@ import org.junit.jupiter.api.Test;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
import org.springframework.security.test.context.support.WithMockUser;
|
import org.springframework.security.test.context.support.WithMockUser;
|
||||||
import ru.dragonestia.picker.api.exception.NodeAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.InstanceAlreadyExistException;
|
||||||
import ru.dragonestia.picker.api.exception.NodeNotFoundException;
|
import ru.dragonestia.picker.api.exception.InstanceNotFoundException;
|
||||||
import ru.dragonestia.picker.api.exception.NotPersistedNodeException;
|
import ru.dragonestia.picker.api.exception.NotPersistedNodeException;
|
||||||
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
|
||||||
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
import ru.dragonestia.picker.api.model.node.PickingMethod;
|
||||||
import ru.dragonestia.picker.api.model.room.IRoom;
|
import ru.dragonestia.picker.api.model.room.IRoom;
|
||||||
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
import ru.dragonestia.picker.api.repository.type.NodeIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
import ru.dragonestia.picker.api.repository.type.RoomIdentifier;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
import ru.dragonestia.picker.model.instance.Instance;
|
import ru.dragonestia.picker.model.instance.Instance;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
import ru.dragonestia.picker.model.factory.RoomFactory;
|
import ru.dragonestia.picker.model.factory.RoomFactory;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -42,7 +42,7 @@ public class RoomServiceTests {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
instanceService.create(instance);
|
instanceService.create(instance);
|
||||||
} catch (NodeAlreadyExistException ignore) {}
|
} catch (InstanceAlreadyExistException ignore) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@WithMockUser(roles = {"NODE_MANAGEMENT"})
|
@WithMockUser(roles = {"NODE_MANAGEMENT"})
|
||||||
@ -98,12 +98,12 @@ public class RoomServiceTests {
|
|||||||
rooms.forEach(room -> roomService.create(room));
|
rooms.forEach(room -> roomService.create(room));
|
||||||
|
|
||||||
var users = Set.of(
|
var users = Set.of(
|
||||||
new User(UserIdentifier.of("1")),
|
new Entity(EntityIdentifier.of("1")),
|
||||||
new User(UserIdentifier.of("2")),
|
new Entity(EntityIdentifier.of("2")),
|
||||||
new User(UserIdentifier.of("3")),
|
new Entity(EntityIdentifier.of("3")),
|
||||||
new User(UserIdentifier.of("4")),
|
new Entity(EntityIdentifier.of("4")),
|
||||||
new User(UserIdentifier.of("5")),
|
new Entity(EntityIdentifier.of("5")),
|
||||||
new User(UserIdentifier.of("6"))
|
new Entity(EntityIdentifier.of("6"))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -115,7 +115,7 @@ public class RoomServiceTests {
|
|||||||
void test_removeNode() {
|
void test_removeNode() {
|
||||||
instanceService.remove(instance);
|
instanceService.remove(instance);
|
||||||
|
|
||||||
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.all(instance));
|
Assertions.assertThrows(InstanceNotFoundException.class, () -> roomService.all(instance));
|
||||||
}
|
}
|
||||||
|
|
||||||
@WithMockUser(roles = {"NODE_MANAGEMENT"})
|
@WithMockUser(roles = {"NODE_MANAGEMENT"})
|
||||||
@ -124,9 +124,9 @@ public class RoomServiceTests {
|
|||||||
var node = new Instance(NodeIdentifier.of("bruh"), PickingMethod.ROUND_ROBIN, false);
|
var node = new Instance(NodeIdentifier.of("bruh"), PickingMethod.ROUND_ROBIN, false);
|
||||||
var room = roomFactory.create(RoomIdentifier.of("test"), node, IRoom.UNLIMITED_SLOTS, "", false);
|
var room = roomFactory.create(RoomIdentifier.of("test"), node, IRoom.UNLIMITED_SLOTS, "", false);
|
||||||
|
|
||||||
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.create(room));
|
Assertions.assertThrows(InstanceNotFoundException.class, () -> roomService.create(room));
|
||||||
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.remove(room));
|
Assertions.assertThrows(InstanceNotFoundException.class, () -> roomService.remove(room));
|
||||||
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.find(node, "Bruh"));
|
Assertions.assertThrows(InstanceNotFoundException.class, () -> roomService.find(node, "Bruh"));
|
||||||
Assertions.assertThrows(NodeNotFoundException.class, () -> roomService.pickAvailable(node, Set.of(new User(UserIdentifier.of("1")))));
|
Assertions.assertThrows(InstanceNotFoundException.class, () -> roomService.pickAvailable(node, Set.of(new Entity(EntityIdentifier.of("1")))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,18 +1,18 @@
|
|||||||
package ru.dragonestia.picker.util;
|
package ru.dragonestia.picker.util;
|
||||||
|
|
||||||
import org.springframework.boot.test.context.TestComponent;
|
import org.springframework.boot.test.context.TestComponent;
|
||||||
import ru.dragonestia.picker.api.repository.type.UserIdentifier;
|
import ru.dragonestia.picker.api.repository.type.EntityIdentifier;
|
||||||
import ru.dragonestia.picker.model.user.User;
|
import ru.dragonestia.picker.model.entity.Entity;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@TestComponent
|
@TestComponent
|
||||||
public class UserFiller {
|
public class UserFiller {
|
||||||
|
|
||||||
public Set<User> createRandomUsers(int amount) {
|
public Set<Entity> createRandomUsers(int amount) {
|
||||||
var set = new HashSet<User>();
|
var set = new HashSet<Entity>();
|
||||||
for (int i = 0; i < amount; i++) {
|
for (int i = 0; i < amount; i++) {
|
||||||
set.add(new User(UserIdentifier.of(UUID.randomUUID().toString())));
|
set.add(new Entity(EntityIdentifier.of(UUID.randomUUID().toString())));
|
||||||
}
|
}
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user