From ecde48460b65a4d073a0a984042a38317147b213 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Wed, 17 Jan 2024 18:38:53 +0700 Subject: [PATCH] Implemented getting details for method 'repository.all()' if it required --- .../ru/dragonestia/picker/api/model/Node.java | 39 ------------- .../ru/dragonestia/picker/api/model/User.java | 31 ---------- .../picker/api/repository/NodeRepository.java | 16 ++++-- .../picker/api/repository/RoomRepository.java | 24 +++++--- .../picker/api/repository/UserRepository.java | 18 ++++-- .../api/repository/details/NodeDetails.java | 4 ++ .../api/repository/details/RoomDetails.java | 5 ++ .../api/repository/details/UserDetails.java | 5 ++ .../response/NodeDetailsResponse.java | 4 +- .../repository/response/NodeListResponse.java | 4 +- .../repository/response/RoomInfoResponse.java | 4 +- .../repository/response/RoomListResponse.java | 4 +- .../response/RoomUserListResponse.java | 4 +- .../api/repository/response/type/RNode.java | 57 +++++++++++++++++++ .../response/type/RRoom.java} | 32 ++++++++--- .../api/repository/response/type/RUser.java | 50 ++++++++++++++++ .../response/type}/type/PickingMode.java | 2 +- .../dragonestia/picker/config/TestConfig.java | 2 +- .../picker/controller/NodeController.java | 16 +++++- .../picker/controller/RoomController.java | 22 +++++-- .../picker/controller/UserRoomController.java | 19 +++++-- .../ru/dragonestia/picker/model/Node.java | 7 ++- .../ru/dragonestia/picker/model/Room.java | 11 +++- .../ru/dragonestia/picker/model/User.java | 5 +- .../repository/impl/PickerRepository.java | 2 +- .../impl/picker/LeastPickedPicker.java | 2 +- .../repository/impl/picker/RoomPicker.java | 2 +- .../impl/picker/RoundRobinPicker.java | 2 +- .../impl/picker/SequentialFillingPicker.java | 2 +- .../picker/service/NodeService.java | 5 ++ .../picker/service/RoomService.java | 5 ++ .../picker/service/UserService.java | 5 ++ .../picker/service/impl/NodeServiceImpl.java | 19 +++++++ .../picker/service/impl/RoomServiceImpl.java | 27 +++++++++ .../picker/service/impl/UserServiceImpl.java | 24 +++++++- .../picker/config/FillingNodesConfig.java | 2 +- .../picker/cp/component/AddUsers.java | 14 ++--- .../picker/cp/component/NodeList.java | 25 ++++---- .../picker/cp/component/RegisterNode.java | 10 ++-- .../picker/cp/component/RegisterRoom.java | 12 ++-- .../picker/cp/component/RoomList.java | 53 ++++++++++++----- .../picker/cp/component/UserList.java | 31 +++++----- .../picker/cp/page/NodeDetailsPage.java | 21 ++++--- .../dragonestia/picker/cp/page/NodesPage.java | 6 +- .../picker/cp/page/RoomDetailsPage.java | 20 +++---- .../repository/impl/NodeRepositoryImpl.java | 14 +++-- .../repository/impl/RoomRepositoryImpl.java | 22 ++++--- .../repository/impl/UserRepositoryImpl.java | 22 ++++--- .../picker/cp/util/RouteParamsExtractor.java | 8 +-- 49 files changed, 496 insertions(+), 244 deletions(-) delete mode 100644 api/src/main/java/ru/dragonestia/picker/api/model/Node.java delete mode 100644 api/src/main/java/ru/dragonestia/picker/api/model/User.java create mode 100644 api/src/main/java/ru/dragonestia/picker/api/repository/details/NodeDetails.java create mode 100644 api/src/main/java/ru/dragonestia/picker/api/repository/details/RoomDetails.java create mode 100644 api/src/main/java/ru/dragonestia/picker/api/repository/details/UserDetails.java create mode 100644 api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RNode.java rename api/src/main/java/ru/dragonestia/picker/api/{model/Room.java => repository/response/type/RRoom.java} (57%) create mode 100644 api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RUser.java rename api/src/main/java/ru/dragonestia/picker/api/{model => repository/response/type}/type/PickingMode.java (81%) diff --git a/api/src/main/java/ru/dragonestia/picker/api/model/Node.java b/api/src/main/java/ru/dragonestia/picker/api/model/Node.java deleted file mode 100644 index 1573e5e..0000000 --- a/api/src/main/java/ru/dragonestia/picker/api/model/Node.java +++ /dev/null @@ -1,39 +0,0 @@ -package ru.dragonestia.picker.api.model; - -import ru.dragonestia.picker.api.model.type.PickingMode; - -public class Node { - - private String id; - private PickingMode mode; - - private Node() {} - - public Node(String id, PickingMode mode) { - this.id = id; - this.mode = mode; - } - - public String getId() { - return id; - } - - public PickingMode getMode() { - return mode; - } - - @Override - public int hashCode() { - return id.hashCode(); - } - - @Override - public boolean equals(Object object) { - if (object == this) return true; - if (object == null) return false; - if (object instanceof Node other) { - return id.equals(other.id); - } - return false; - } -} diff --git a/api/src/main/java/ru/dragonestia/picker/api/model/User.java b/api/src/main/java/ru/dragonestia/picker/api/model/User.java deleted file mode 100644 index 2ae7a45..0000000 --- a/api/src/main/java/ru/dragonestia/picker/api/model/User.java +++ /dev/null @@ -1,31 +0,0 @@ -package ru.dragonestia.picker.api.model; - -public class User { - - private String id; - - private User() {} - - public User(String id) { - this.id = id; - } - - public String getId() { - return id; - } - - @Override - public int hashCode() { - return id.hashCode(); - } - - @Override - public boolean equals(Object object) { - if (object == this) return true; - if (object == null) return false; - if (object instanceof User other) { - return id.equals(other.id); - } - return false; - } -} diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/NodeRepository.java b/api/src/main/java/ru/dragonestia/picker/api/repository/NodeRepository.java index 5609f5c..2640ef2 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/repository/NodeRepository.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/NodeRepository.java @@ -2,18 +2,26 @@ package ru.dragonestia.picker.api.repository; import ru.dragonestia.picker.api.exception.InvalidNodeIdentifierException; import ru.dragonestia.picker.api.exception.NodeAlreadyExistException; -import ru.dragonestia.picker.api.model.Node; +import ru.dragonestia.picker.api.repository.details.NodeDetails; +import ru.dragonestia.picker.api.repository.response.type.RNode; import java.util.List; import java.util.Optional; +import java.util.Set; public interface NodeRepository { - void register(Node node) throws InvalidNodeIdentifierException, NodeAlreadyExistException; + Set ALL_DETAILS = Set.of(); - List all(); + void register(RNode node) throws InvalidNodeIdentifierException, NodeAlreadyExistException; - Optional find(String nodeId); + default List all() { + return all(Set.of()); + } + + List all(Set details); + + Optional find(String nodeId); void remove(String nodeId); } diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/RoomRepository.java b/api/src/main/java/ru/dragonestia/picker/api/repository/RoomRepository.java index c6b3239..0f7255c 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/repository/RoomRepository.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/RoomRepository.java @@ -1,23 +1,31 @@ package ru.dragonestia.picker.api.repository; import ru.dragonestia.picker.api.exception.*; -import ru.dragonestia.picker.api.model.Node; -import ru.dragonestia.picker.api.model.Room; +import ru.dragonestia.picker.api.repository.details.RoomDetails; +import ru.dragonestia.picker.api.repository.response.type.RNode; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import java.util.List; import java.util.Optional; +import java.util.Set; public interface RoomRepository { - void register(Room room) throws NodeNotFoundException, InvalidRoomIdentifierException, RoomAlreadyExistException; + Set ALL_DETAILS = Set.of(RoomDetails.COUNT_USERS); - void remove(Room room) throws NodeNotFoundException; + void register(RRoom room) throws NodeNotFoundException, InvalidRoomIdentifierException, RoomAlreadyExistException; - void remove(Node node, Room.Short room) throws NodeNotFoundException; + void remove(RRoom room) throws NodeNotFoundException; - List all(Node node) throws NodeNotFoundException; + void remove(RNode node, RRoom.Short room) throws NodeNotFoundException; - Optional find(Node node, String roomId) throws NodeNotFoundException; + default List all(RNode node) throws NodeNotFoundException { + return all(node, Set.of()); + } - void lock(Room room, boolean value) throws NodeNotFoundException, RoomNotFoundException; + List all(RNode node, Set details) throws NodeNotFoundException; + + Optional find(RNode node, String roomId) throws NodeNotFoundException; + + void lock(RRoom room, boolean value) throws NodeNotFoundException, RoomNotFoundException; } diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java b/api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java index 1cffb9f..2781f21 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java @@ -3,17 +3,25 @@ package ru.dragonestia.picker.api.repository; import ru.dragonestia.picker.api.exception.NodeNotFoundException; import ru.dragonestia.picker.api.exception.RoomAreFullException; import ru.dragonestia.picker.api.exception.RoomNotFoundException; -import ru.dragonestia.picker.api.model.Room; -import ru.dragonestia.picker.api.model.User; +import ru.dragonestia.picker.api.repository.response.type.RRoom; +import ru.dragonestia.picker.api.repository.response.type.RUser; +import ru.dragonestia.picker.api.repository.details.UserDetails; import java.util.Collection; import java.util.List; +import java.util.Set; public interface UserRepository { - void linkWithRoom(Room room, Collection users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException; + Set ALL_DETAILS = Set.of(UserDetails.COUNT_ROOMS); - void unlinkFromRoom(Room room, Collection users) throws NodeNotFoundException, RoomNotFoundException; + void linkWithRoom(RRoom room, Collection users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException; - List all(Room room) throws NodeNotFoundException, RoomNotFoundException; + void unlinkFromRoom(RRoom room, Collection users) throws NodeNotFoundException, RoomNotFoundException; + + default List all(RRoom room) throws NodeNotFoundException, RoomNotFoundException { + return all(room, Set.of()); + } + + List all(RRoom room, Set details) throws NodeNotFoundException, RoomNotFoundException; } diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/details/NodeDetails.java b/api/src/main/java/ru/dragonestia/picker/api/repository/details/NodeDetails.java new file mode 100644 index 0000000..5e794ca --- /dev/null +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/details/NodeDetails.java @@ -0,0 +1,4 @@ +package ru.dragonestia.picker.api.repository.details; + +public enum NodeDetails { +} diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/details/RoomDetails.java b/api/src/main/java/ru/dragonestia/picker/api/repository/details/RoomDetails.java new file mode 100644 index 0000000..a12f663 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/details/RoomDetails.java @@ -0,0 +1,5 @@ +package ru.dragonestia.picker.api.repository.details; + +public enum RoomDetails { + COUNT_USERS +} diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/details/UserDetails.java b/api/src/main/java/ru/dragonestia/picker/api/repository/details/UserDetails.java new file mode 100644 index 0000000..9a4ad43 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/details/UserDetails.java @@ -0,0 +1,5 @@ +package ru.dragonestia.picker.api.repository.details; + +public enum UserDetails { + COUNT_ROOMS +} diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/response/NodeDetailsResponse.java b/api/src/main/java/ru/dragonestia/picker/api/repository/response/NodeDetailsResponse.java index bc74a49..06f3cdd 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/repository/response/NodeDetailsResponse.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/response/NodeDetailsResponse.java @@ -1,5 +1,5 @@ package ru.dragonestia.picker.api.repository.response; -import ru.dragonestia.picker.api.model.Node; +import ru.dragonestia.picker.api.repository.response.type.RNode; -public record NodeDetailsResponse(Node node) {} +public record NodeDetailsResponse(RNode node) {} diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/response/NodeListResponse.java b/api/src/main/java/ru/dragonestia/picker/api/repository/response/NodeListResponse.java index c36f5a6..de92e0d 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/repository/response/NodeListResponse.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/response/NodeListResponse.java @@ -1,7 +1,7 @@ package ru.dragonestia.picker.api.repository.response; -import ru.dragonestia.picker.api.model.Node; +import ru.dragonestia.picker.api.repository.response.type.RNode; import java.util.List; -public record NodeListResponse(List nodes) {} +public record NodeListResponse(List nodes) {} diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomInfoResponse.java b/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomInfoResponse.java index 4b676d5..52e5820 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomInfoResponse.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomInfoResponse.java @@ -1,5 +1,5 @@ package ru.dragonestia.picker.api.repository.response; -import ru.dragonestia.picker.api.model.Room; +import ru.dragonestia.picker.api.repository.response.type.RRoom; -public record RoomInfoResponse(Room room) {} +public record RoomInfoResponse(RRoom room) {} diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomListResponse.java b/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomListResponse.java index de83970..a617430 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomListResponse.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomListResponse.java @@ -1,7 +1,7 @@ package ru.dragonestia.picker.api.repository.response; -import ru.dragonestia.picker.api.model.Room; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import java.util.List; -public record RoomListResponse(String node, List rooms) {} +public record RoomListResponse(String node, List rooms) {} diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomUserListResponse.java b/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomUserListResponse.java index 6966788..3fe98e9 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomUserListResponse.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomUserListResponse.java @@ -1,7 +1,7 @@ package ru.dragonestia.picker.api.repository.response; -import ru.dragonestia.picker.api.model.User; +import ru.dragonestia.picker.api.repository.response.type.RUser; import java.util.List; -public record RoomUserListResponse(int slots, int usedSlots, List users) {} +public record RoomUserListResponse(int slots, int usedSlots, List users) {} diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RNode.java b/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RNode.java new file mode 100644 index 0000000..f34e88e --- /dev/null +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RNode.java @@ -0,0 +1,57 @@ +package ru.dragonestia.picker.api.repository.response.type; + +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; +import ru.dragonestia.picker.api.repository.details.NodeDetails; + +import java.util.HashMap; +import java.util.Map; + +public class RNode { + + private String id; + private PickingMode mode; + private Map details; + + private RNode() {} + + public RNode(String id, PickingMode mode) { + this.id = id; + this.mode = mode; + this.details = new HashMap<>(); + } + + public String getId() { + return id; + } + + public PickingMode getMode() { + return mode; + } + + public void putDetail(NodeDetails detail, String value) { + details.put(detail, value); + } + + public String getDetails(NodeDetails detail, String value) { + return details.get(detail); + } + + public Map getDetails() { + return details; + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + @Override + public boolean equals(Object object) { + if (object == this) return true; + if (object == null) return false; + if (object instanceof RNode other) { + return id.equals(other.id); + } + return false; + } +} diff --git a/api/src/main/java/ru/dragonestia/picker/api/model/Room.java b/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RRoom.java similarity index 57% rename from api/src/main/java/ru/dragonestia/picker/api/model/Room.java rename to api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RRoom.java index 6415fd3..1e861d8 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/model/Room.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RRoom.java @@ -1,8 +1,12 @@ -package ru.dragonestia.picker.api.model; +package ru.dragonestia.picker.api.repository.response.type; + +import ru.dragonestia.picker.api.repository.details.RoomDetails; import java.beans.Transient; +import java.util.HashMap; +import java.util.Map; -public class Room { +public class RRoom { public final static int INFINITE_SLOTS = -1; @@ -11,17 +15,19 @@ public class Room { private int slots; private String payload; private boolean locked = false; + private Map details; - private Room() {} + private RRoom() {} - public Room(String id, String nodeId, int slots, String payload) { + public RRoom(String id, String nodeId, int slots, String payload) { this.id = id; this.nodeId = nodeId; this.slots = slots; this.payload = payload; + this.details = new HashMap<>(); } - public Room(String id, Node node, int limit, String payload) { + public RRoom(String id, RNode node, int limit, String payload) { this(id, node.getId(), limit, payload); } @@ -54,6 +60,18 @@ public class Room { return slots == INFINITE_SLOTS; } + public void putDetail(RoomDetails detail, String value) { + details.put(detail, value); + } + + public String getDetail(RoomDetails detail) { + return details.get(detail); + } + + public Map getDetails() { + return details; + } + @Override public int hashCode() { return id.hashCode(); @@ -63,11 +81,11 @@ public class Room { public boolean equals(Object object) { if (object == this) return true; if (object == null) return false; - if (object instanceof Room other) { + if (object instanceof RRoom other) { return id.equals(other.id); } return false; } - public record Short(String id, int slots, boolean locked) {} + public record Short(String id, int slots, boolean locked, Map details) {} } diff --git a/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RUser.java b/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RUser.java new file mode 100644 index 0000000..6cbe365 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RUser.java @@ -0,0 +1,50 @@ +package ru.dragonestia.picker.api.repository.response.type; + +import ru.dragonestia.picker.api.repository.details.UserDetails; + +import java.util.HashMap; +import java.util.Map; + +public class RUser { + + private String id; + private Map details = new HashMap<>(); + + private RUser() {} + + public RUser(String id) { + this.id = id; + this.details = new HashMap<>(); + } + + public String getId() { + return id; + } + + public void putDetail(UserDetails detail, String value) { + details.put(detail, value); + } + + public String getDetail(UserDetails detail) { + return details.get(detail); + } + + public Map getDetails() { + return details; + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + @Override + public boolean equals(Object object) { + if (object == this) return true; + if (object == null) return false; + if (object instanceof RUser other) { + return id.equals(other.id); + } + return false; + } +} diff --git a/api/src/main/java/ru/dragonestia/picker/api/model/type/PickingMode.java b/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/type/PickingMode.java similarity index 81% rename from api/src/main/java/ru/dragonestia/picker/api/model/type/PickingMode.java rename to api/src/main/java/ru/dragonestia/picker/api/repository/response/type/type/PickingMode.java index 9e3c792..455ac7d 100644 --- a/api/src/main/java/ru/dragonestia/picker/api/model/type/PickingMode.java +++ b/api/src/main/java/ru/dragonestia/picker/api/repository/response/type/type/PickingMode.java @@ -1,4 +1,4 @@ -package ru.dragonestia.picker.api.model.type; +package ru.dragonestia.picker.api.repository.response.type.type; public enum PickingMode { SEQUENTIAL_FILLING("Sequential filling"), diff --git a/app/src/main/java/ru/dragonestia/picker/config/TestConfig.java b/app/src/main/java/ru/dragonestia/picker/config/TestConfig.java index b2362c8..808b6f0 100644 --- a/app/src/main/java/ru/dragonestia/picker/config/TestConfig.java +++ b/app/src/main/java/ru/dragonestia/picker/config/TestConfig.java @@ -7,7 +7,7 @@ import org.springframework.context.annotation.Profile; import org.springframework.lang.NonNull; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; import ru.dragonestia.picker.interceptor.DebugInterceptor; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.Node; diff --git a/app/src/main/java/ru/dragonestia/picker/controller/NodeController.java b/app/src/main/java/ru/dragonestia/picker/controller/NodeController.java index 8d7b4db..424e87a 100644 --- a/app/src/main/java/ru/dragonestia/picker/controller/NodeController.java +++ b/app/src/main/java/ru/dragonestia/picker/controller/NodeController.java @@ -4,7 +4,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import ru.dragonestia.picker.api.exception.NodeNotFoundException; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.details.NodeDetails; +import ru.dragonestia.picker.api.repository.details.RoomDetails; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; import ru.dragonestia.picker.api.repository.response.NodeDetailsResponse; import ru.dragonestia.picker.api.repository.response.NodeListResponse; import ru.dragonestia.picker.model.Node; @@ -13,6 +15,7 @@ import ru.dragonestia.picker.service.RoomService; import ru.dragonestia.picker.util.NamingValidator; import java.util.Arrays; +import java.util.HashSet; @RestController @RequestMapping("/nodes") @@ -24,8 +27,15 @@ public class NodeController { private final NamingValidator namingValidator; @GetMapping - NodeListResponse allNodes() { - return new NodeListResponse(nodeService.all().stream().map(Node::toResponseObject).toList()); + NodeListResponse allNodes(@RequestParam(name = "requiredDetails", required = false, defaultValue = "") String detailsSeq) { + var details = new HashSet(); + for (var detailStr: detailsSeq.split(",")) { + try { + details.add(NodeDetails.valueOf(detailStr.toUpperCase())); + } catch (IllegalArgumentException ignore) {} + } + + return new NodeListResponse(nodeService.getAllNodesWithDetailsResponse(details)); } @PostMapping diff --git a/app/src/main/java/ru/dragonestia/picker/controller/RoomController.java b/app/src/main/java/ru/dragonestia/picker/controller/RoomController.java index d2eea4f..bf35f73 100644 --- a/app/src/main/java/ru/dragonestia/picker/controller/RoomController.java +++ b/app/src/main/java/ru/dragonestia/picker/controller/RoomController.java @@ -6,6 +6,9 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import ru.dragonestia.picker.api.exception.NodeNotFoundException; import ru.dragonestia.picker.api.exception.RoomNotFoundException; +import ru.dragonestia.picker.api.repository.details.RoomDetails; +import ru.dragonestia.picker.api.repository.details.UserDetails; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.response.RoomInfoResponse; import ru.dragonestia.picker.api.repository.response.RoomListResponse; import ru.dragonestia.picker.model.Room; @@ -14,6 +17,8 @@ import ru.dragonestia.picker.service.RoomService; import ru.dragonestia.picker.service.NodeService; import ru.dragonestia.picker.util.NamingValidator; +import java.util.HashSet; + @Log4j2 @RestController @RequestMapping("/nodes/{nodeId}/rooms") @@ -25,14 +30,19 @@ public class RoomController { private final NamingValidator namingValidator; @GetMapping - ResponseEntity all(@PathVariable(name = "nodeId") String nodeId) { + ResponseEntity all(@PathVariable(name = "nodeId") String nodeId, + @RequestParam(name = "requiredDetails", required = false, defaultValue = "") String detailsSeq) { + + var details = new HashSet(); + for (var detailStr: detailsSeq.split(",")) { + try { + details.add(RoomDetails.valueOf(detailStr.toUpperCase())); + } catch (IllegalArgumentException ignore) {} + } return nodeService.find(nodeId) - .map(node -> ResponseEntity.ok(new RoomListResponse(nodeId, - roomService.all(node).stream() - .map(room -> new ru.dragonestia.picker.api.model.Room.Short(room.getId(), room.getSlots().getSlots(), room.isLocked())) - .toList() - ))).orElseThrow(() -> new NodeNotFoundException(nodeId)); + .map(node -> ResponseEntity.ok(new RoomListResponse(nodeId, roomService.getAllRoomsWithDetailsResponse(node, details)))) + .orElseThrow(() -> new NodeNotFoundException(nodeId)); } @PostMapping diff --git a/app/src/main/java/ru/dragonestia/picker/controller/UserRoomController.java b/app/src/main/java/ru/dragonestia/picker/controller/UserRoomController.java index fbd57d1..da6e1ac 100644 --- a/app/src/main/java/ru/dragonestia/picker/controller/UserRoomController.java +++ b/app/src/main/java/ru/dragonestia/picker/controller/UserRoomController.java @@ -5,17 +5,18 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import ru.dragonestia.picker.api.exception.NodeNotFoundException; import ru.dragonestia.picker.api.exception.RoomNotFoundException; +import ru.dragonestia.picker.api.repository.details.UserDetails; import ru.dragonestia.picker.api.repository.response.LinkUsersWithRoomResponse; import ru.dragonestia.picker.api.repository.response.RoomUserListResponse; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.Node; -import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.service.RoomService; import ru.dragonestia.picker.service.NodeService; import ru.dragonestia.picker.service.UserService; import ru.dragonestia.picker.util.NamingValidator; import java.util.Arrays; +import java.util.HashSet; @RequiredArgsConstructor @RestController @@ -29,11 +30,21 @@ public class UserRoomController { @GetMapping ResponseEntity usersInsideRoom(@PathVariable(name = "nodeId") String nodeId, - @PathVariable(name = "roomId") String roomId) { + @PathVariable(name = "roomId") String roomId, + @RequestParam(name = "requiredDetails", required = false, defaultValue = "") String detailsSeq) { var room = getNodeAndRoom(nodeId, roomId).room(); - var users = userService.getRoomUsers(room); - return ResponseEntity.ok(new RoomUserListResponse(room.getSlots().getSlots(), users.size(), users.stream().map(User::toResponseObject).toList())); + + var details = new HashSet(); + for (var detailStr: detailsSeq.split(",")) { + try { + details.add(UserDetails.valueOf(detailStr.toUpperCase())); + } catch (IllegalArgumentException ignore) {} + } + + var users = userService.getRoomUsersWithDetailsResponse(room, details); + + return ResponseEntity.ok(new RoomUserListResponse(room.getSlots().getSlots(), users.size(), users)); } @PostMapping diff --git a/app/src/main/java/ru/dragonestia/picker/model/Node.java b/app/src/main/java/ru/dragonestia/picker/model/Node.java index 300245e..d60b16a 100644 --- a/app/src/main/java/ru/dragonestia/picker/model/Node.java +++ b/app/src/main/java/ru/dragonestia/picker/model/Node.java @@ -1,7 +1,8 @@ package ru.dragonestia.picker.model; import lombok.NonNull; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.response.type.RNode; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; public record Node(@NonNull String id, @NonNull PickingMode mode) { @@ -20,7 +21,7 @@ public record Node(@NonNull String id, @NonNull PickingMode mode) { return false; } - public ru.dragonestia.picker.api.model.Node toResponseObject() { - return new ru.dragonestia.picker.api.model.Node(id, mode); + public RNode toResponseObject() { + return new RNode(id, mode); } } diff --git a/app/src/main/java/ru/dragonestia/picker/model/Room.java b/app/src/main/java/ru/dragonestia/picker/model/Room.java index 4dc7d31..5937cf9 100644 --- a/app/src/main/java/ru/dragonestia/picker/model/Room.java +++ b/app/src/main/java/ru/dragonestia/picker/model/Room.java @@ -3,8 +3,11 @@ package ru.dragonestia.picker.model; import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.model.type.SlotLimit; +import java.util.HashMap; + @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class Room { @@ -44,9 +47,13 @@ public class Room { return false; } - public ru.dragonestia.picker.api.model.Room toResponseObject() { - var result = new ru.dragonestia.picker.api.model.Room(id, nodeId, slots.getSlots(), payload); + public RRoom toResponseObject() { + var result = new RRoom(id, nodeId, slots.getSlots(), payload); result.setLocked(locked); return result; } + + public RRoom.Short toShortResponseObject() { + return new RRoom.Short(id, slots.getSlots(), locked, new HashMap<>()); + } } diff --git a/app/src/main/java/ru/dragonestia/picker/model/User.java b/app/src/main/java/ru/dragonestia/picker/model/User.java index fb9a226..9848007 100644 --- a/app/src/main/java/ru/dragonestia/picker/model/User.java +++ b/app/src/main/java/ru/dragonestia/picker/model/User.java @@ -1,6 +1,7 @@ package ru.dragonestia.picker.model; import lombok.NonNull; +import ru.dragonestia.picker.api.repository.response.type.RUser; public record User(@NonNull String id) { @@ -19,7 +20,7 @@ public record User(@NonNull String id) { return false; } - public ru.dragonestia.picker.api.model.User toResponseObject() { - return new ru.dragonestia.picker.api.model.User(id); + public RUser toResponseObject() { + return new RUser(id); } } diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/PickerRepository.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/PickerRepository.java index a2fe5a3..ef52297 100644 --- a/app/src/main/java/ru/dragonestia/picker/repository/impl/PickerRepository.java +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/PickerRepository.java @@ -2,7 +2,7 @@ package ru.dragonestia.picker.repository.impl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.repository.UserRepository; diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/LeastPickedPicker.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/LeastPickedPicker.java index d3dede4..a5c9ef5 100644 --- a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/LeastPickedPicker.java +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/LeastPickedPicker.java @@ -1,6 +1,6 @@ package ru.dragonestia.picker.repository.impl.picker; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.repository.UserRepository; diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoomPicker.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoomPicker.java index 14b9eb4..e89c0fb 100644 --- a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoomPicker.java +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoomPicker.java @@ -1,6 +1,6 @@ package ru.dragonestia.picker.repository.impl.picker; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java index 97067ba..d9bdcaa 100644 --- a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java @@ -1,6 +1,6 @@ package ru.dragonestia.picker.repository.impl.picker; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.repository.UserRepository; diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/SequentialFillingPicker.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/SequentialFillingPicker.java index dc416e5..bc5b51f 100644 --- a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/SequentialFillingPicker.java +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/SequentialFillingPicker.java @@ -1,6 +1,6 @@ package ru.dragonestia.picker.repository.impl.picker; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.repository.UserRepository; diff --git a/app/src/main/java/ru/dragonestia/picker/service/NodeService.java b/app/src/main/java/ru/dragonestia/picker/service/NodeService.java index 1df23f0..66bcca3 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/NodeService.java +++ b/app/src/main/java/ru/dragonestia/picker/service/NodeService.java @@ -2,10 +2,13 @@ package ru.dragonestia.picker.service; import ru.dragonestia.picker.api.exception.InvalidNodeIdentifierException; import ru.dragonestia.picker.api.exception.NodeAlreadyExistException; +import ru.dragonestia.picker.api.repository.details.NodeDetails; +import ru.dragonestia.picker.api.repository.response.type.RNode; import ru.dragonestia.picker.model.Node; import java.util.List; import java.util.Optional; +import java.util.Set; public interface NodeService { @@ -15,5 +18,7 @@ public interface NodeService { List all(); + List getAllNodesWithDetailsResponse(Set details); + Optional find(String nodeId); } diff --git a/app/src/main/java/ru/dragonestia/picker/service/RoomService.java b/app/src/main/java/ru/dragonestia/picker/service/RoomService.java index 9aa24af..6bc35d1 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/RoomService.java +++ b/app/src/main/java/ru/dragonestia/picker/service/RoomService.java @@ -2,12 +2,15 @@ package ru.dragonestia.picker.service; import ru.dragonestia.picker.api.exception.InvalidRoomIdentifierException; import ru.dragonestia.picker.api.exception.RoomAlreadyExistException; +import ru.dragonestia.picker.api.repository.details.RoomDetails; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.User; import java.util.List; import java.util.Optional; +import java.util.Set; public interface RoomService { @@ -19,6 +22,8 @@ public interface RoomService { List all(Node node); + List getAllRoomsWithDetailsResponse(Node node, Set details); + default int countAvailable(Node node) { return countAvailable(node, 1); } diff --git a/app/src/main/java/ru/dragonestia/picker/service/UserService.java b/app/src/main/java/ru/dragonestia/picker/service/UserService.java index 708e7a1..41f6908 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/UserService.java +++ b/app/src/main/java/ru/dragonestia/picker/service/UserService.java @@ -1,11 +1,14 @@ package ru.dragonestia.picker.service; import ru.dragonestia.picker.api.exception.RoomAreFullException; +import ru.dragonestia.picker.api.repository.response.type.RUser; +import ru.dragonestia.picker.api.repository.details.UserDetails; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; import java.util.Collection; import java.util.List; +import java.util.Set; public interface UserService { @@ -16,4 +19,6 @@ public interface UserService { void unlinkUsersFromRoom(Room room, Collection users); List getRoomUsers(Room room); + + List getRoomUsersWithDetailsResponse(Room room, Set details); } diff --git a/app/src/main/java/ru/dragonestia/picker/service/impl/NodeServiceImpl.java b/app/src/main/java/ru/dragonestia/picker/service/impl/NodeServiceImpl.java index 7ec2ac8..a4f181c 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/impl/NodeServiceImpl.java +++ b/app/src/main/java/ru/dragonestia/picker/service/impl/NodeServiceImpl.java @@ -4,13 +4,17 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import ru.dragonestia.picker.api.exception.InvalidNodeIdentifierException; import ru.dragonestia.picker.api.exception.NodeAlreadyExistException; +import ru.dragonestia.picker.api.repository.details.NodeDetails; +import ru.dragonestia.picker.api.repository.response.type.RNode; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.repository.NodeRepository; import ru.dragonestia.picker.service.NodeService; import ru.dragonestia.picker.util.NamingValidator; +import java.util.LinkedList; import java.util.List; import java.util.Optional; +import java.util.Set; @Service @RequiredArgsConstructor @@ -35,6 +39,21 @@ public class NodeServiceImpl implements NodeService { return nodeRepository.all(); } + @Override + public List getAllNodesWithDetailsResponse(Set details) { + var response = new LinkedList(); + for (var node: all()) { + var responseNode = node.toResponseObject(); + + for (var detail: details) { + // TODO... + } + + response.add(responseNode); + } + return response; + } + @Override public Optional find(String nodeId) { return nodeRepository.find(nodeId); diff --git a/app/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java b/app/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java index 1800cc3..8151353 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java +++ b/app/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java @@ -1,24 +1,33 @@ package ru.dragonestia.picker.service.impl; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; import ru.dragonestia.picker.api.exception.InvalidRoomIdentifierException; import ru.dragonestia.picker.api.exception.RoomAlreadyExistException; +import ru.dragonestia.picker.api.repository.details.RoomDetails; +import ru.dragonestia.picker.api.repository.details.UserDetails; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.repository.RoomRepository; +import ru.dragonestia.picker.repository.UserRepository; import ru.dragonestia.picker.service.RoomService; import ru.dragonestia.picker.util.NamingValidator; +import java.util.LinkedList; import java.util.List; import java.util.Optional; +import java.util.Set; +@Log4j2 @Service @RequiredArgsConstructor public class RoomServiceImpl implements RoomService { private final RoomRepository roomRepository; + private final UserRepository userRepository; private final NamingValidator namingValidator; @Override @@ -42,6 +51,24 @@ public class RoomServiceImpl implements RoomService { return roomRepository.all(node); } + @Override + public List getAllRoomsWithDetailsResponse(Node node, Set details) { + var response = new LinkedList(); + for (var room: all(node)) { + var responseRoom = room.toShortResponseObject(); + + for (var detail: details) { + if (detail == RoomDetails.COUNT_USERS) { + var users = Integer.toString(userRepository.usersOf(room).size()); + responseRoom.details().put(RoomDetails.COUNT_USERS, users); + } + } + + response.add(responseRoom); + } + return response; + } + @Override public int countAvailable(Node node, int requiredSlots) { throw new RuntimeException("Not implemented"); diff --git a/app/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java b/app/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java index 6774bc5..916c45d 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java +++ b/app/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java @@ -2,19 +2,22 @@ package ru.dragonestia.picker.service.impl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import ru.dragonestia.picker.api.repository.response.type.RUser; +import ru.dragonestia.picker.api.repository.details.UserDetails; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.repository.UserRepository; import ru.dragonestia.picker.service.UserService; -import java.util.Collection; -import java.util.List; +import java.util.*; +import java.util.function.Function; @RequiredArgsConstructor @Service public class UserServiceImpl implements UserService { private final UserRepository userRepository; + private final Map> detailsMap = new HashMap<>(); @Override public List getUserRooms(User user) { @@ -36,4 +39,21 @@ public class UserServiceImpl implements UserService { public List getRoomUsers(Room room) { return userRepository.usersOf(room); } + + @Override + public List getRoomUsersWithDetailsResponse(Room room, Set details) { + var users = new LinkedList(); + for (var user: getRoomUsers(room)) { + var responseUser = user.toResponseObject(); + + for (var detail: details) { + if (detail == UserDetails.COUNT_ROOMS) { + responseUser.putDetail(UserDetails.COUNT_ROOMS, Integer.toString(getUserRooms(user).size())); + } + } + + users.add(responseUser); + } + return users; + } } diff --git a/app/src/test/java/ru/dragonestia/picker/config/FillingNodesConfig.java b/app/src/test/java/ru/dragonestia/picker/config/FillingNodesConfig.java index d62d1da..c0263b9 100644 --- a/app/src/test/java/ru/dragonestia/picker/config/FillingNodesConfig.java +++ b/app/src/test/java/ru/dragonestia/picker/config/FillingNodesConfig.java @@ -3,7 +3,7 @@ package ru.dragonestia.picker.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/AddUsers.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/AddUsers.java index 39addbc..563273d 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/AddUsers.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/AddUsers.java @@ -12,8 +12,8 @@ import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.TextField; import lombok.Getter; -import ru.dragonestia.picker.api.model.Room; -import ru.dragonestia.picker.api.model.User; +import ru.dragonestia.picker.api.repository.response.type.RRoom; +import ru.dragonestia.picker.api.repository.response.type.RUser; import java.util.Collection; import java.util.List; @@ -21,12 +21,12 @@ import java.util.function.BiConsumer; public class AddUsers extends Details { - private final Room room; - private final BiConsumer, Boolean> onCommit; + private final RRoom room; + private final BiConsumer, Boolean> onCommit; private final Checkbox ignoreSlots; private final VerticalLayout usersLayout; - public AddUsers(Room room, BiConsumer, Boolean> onCommit) { + public AddUsers(RRoom room, BiConsumer, Boolean> onCommit) { super(new H2("Add users")); this.room = room; @@ -46,14 +46,14 @@ public class AddUsers extends Details { usersLayout.add(new UserEntry(false)); } - public List readAllUsers() { + public List readAllUsers() { return usersLayout.getChildren() .filter(component -> component instanceof UserEntry) .map(component -> (UserEntry) component) .map(user -> user.getUserIdentifierField().getValue()) .map(String::trim) .filter(user -> !user.isEmpty()) - .map(User::new) + .map(RUser::new) .toList(); } diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/NodeList.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/NodeList.java index 059cd48..6a035bd 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/NodeList.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/NodeList.java @@ -6,7 +6,6 @@ import com.vaadin.flow.component.button.ButtonVariant; import com.vaadin.flow.component.dialog.Dialog; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.html.H2; -import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; @@ -14,19 +13,19 @@ import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.data.value.ValueChangeMode; import lombok.Setter; -import ru.dragonestia.picker.api.model.Node; +import ru.dragonestia.picker.api.repository.response.type.RNode; import java.util.List; import java.util.function.Consumer; public class NodeList extends VerticalLayout { - private final Grid nodesGrid; + private final Grid nodesGrid; private final TextField searchField; - private List cachedNodes; + private List cachedNodes; @Setter private Consumer removeMethod; - public NodeList(List nodes) { + public NodeList(List nodes) { super(); cachedNodes = nodes; @@ -56,15 +55,15 @@ public class NodeList extends VerticalLayout { .toList()); } - private Grid createGrid() { - var grid = new Grid<>(Node.class, false); - grid.addColumn(Node::getId).setHeader("Identifier"); + private Grid createGrid() { + var grid = new Grid<>(RNode.class, false); + grid.addColumn(RNode::getId).setHeader("Identifier"); grid.addColumn(node -> node.getMode().getName()).setHeader("Mode"); grid.addComponentColumn(this::createManageButtons).setHeader("Manage"); return grid; } - private HorizontalLayout createManageButtons(Node node) { + private HorizontalLayout createManageButtons(RNode node) { var layout = new HorizontalLayout(); { @@ -84,11 +83,11 @@ public class NodeList extends VerticalLayout { return layout; } - private void clickDetailsButton(Node node) { + private void clickDetailsButton(RNode node) { getUI().ifPresent(ui -> ui.navigate("/nodes/" + node.getId())); } - private void clickRemoveButton(Node node) { + private void clickRemoveButton(RNode node) { var dialog = new Dialog("Confirm node deletion"); dialog.add(new Html("

Confirm that you want to delete node. Enter " + node.getId() + " to field below and confirm.

")); @@ -122,12 +121,12 @@ public class NodeList extends VerticalLayout { dialog.open(); } - public void update(List nodes) { + public void update(List nodes) { cachedNodes = nodes; applySearch(searchField.getValue()); } - private void removeNode(Node node) { + private void removeNode(RNode node) { if (removeMethod != null) { removeMethod.accept(node.getId()); } diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RegisterNode.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RegisterNode.java index ee5acf2..bbcdf78 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RegisterNode.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RegisterNode.java @@ -14,18 +14,18 @@ import com.vaadin.flow.component.textfield.Autocomplete; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.data.renderer.ComponentRenderer; import org.springframework.lang.Nullable; -import ru.dragonestia.picker.api.model.Node; -import ru.dragonestia.picker.api.model.type.PickingMode; +import ru.dragonestia.picker.api.repository.response.type.RNode; +import ru.dragonestia.picker.api.repository.response.type.type.PickingMode; import java.util.function.Function; public class RegisterNode extends Details { - private final Function onSubmit; + private final Function onSubmit; private final TextField identifierField; private final RadioButtonGroup modeRadio; - public RegisterNode(Function onSubmit) { + public RegisterNode(Function onSubmit) { super(new H2("Register node")); this.onSubmit = onSubmit; @@ -93,7 +93,7 @@ public class RegisterNode extends Details { return; } - var node = new Node(nodeIdentifier, modeRadio.getValue()); + var node = new RNode(nodeIdentifier, modeRadio.getValue()); var response = onSubmit.apply(node); clear(); if (response.error()) { diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RegisterRoom.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RegisterRoom.java index 7fcfd33..ef6149a 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RegisterRoom.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RegisterRoom.java @@ -11,20 +11,20 @@ import com.vaadin.flow.component.textfield.Autocomplete; import com.vaadin.flow.component.textfield.TextArea; import com.vaadin.flow.component.textfield.TextField; import org.springframework.lang.Nullable; -import ru.dragonestia.picker.api.model.Node; -import ru.dragonestia.picker.api.model.Room; +import ru.dragonestia.picker.api.repository.response.type.RNode; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import java.util.function.Function; public class RegisterRoom extends Details { - private final Node node; - private final Function onSubmit; + private final RNode node; + private final Function onSubmit; private final TextField identifierField; private final TextArea payloadField; private final Checkbox lockedField; - public RegisterRoom(Node node, Function onSubmit) { + public RegisterRoom(RNode node, Function onSubmit) { super(new H2("Register room")); this.node = node; this.onSubmit = onSubmit; @@ -107,7 +107,7 @@ public class RegisterRoom extends Details { return; } - var room = new Room(nodeIdentifier, node, Room.INFINITE_SLOTS, payloadField.getValue()); + var room = new RRoom(nodeIdentifier, node, RRoom.INFINITE_SLOTS, payloadField.getValue()); room.setLocked(lockedField.getValue()); var response = onSubmit.apply(room); clear(); diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RoomList.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RoomList.java index eec99ff..807fb83 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RoomList.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/RoomList.java @@ -7,7 +7,6 @@ import com.vaadin.flow.component.dialog.Dialog; import com.vaadin.flow.component.grid.ColumnTextAlign; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.html.H2; -import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.html.Span; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; @@ -16,20 +15,24 @@ import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.data.value.ValueChangeMode; import lombok.Setter; -import ru.dragonestia.picker.api.model.Room; +import lombok.extern.log4j.Log4j2; +import ru.dragonestia.picker.api.repository.details.RoomDetails; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import java.util.List; import java.util.function.Consumer; +@Log4j2 public class RoomList extends VerticalLayout { private final String nodeIdentifier; - private final Grid roomsGrid; + private final Grid roomsGrid; private final TextField searchField; - private List cachedRooms; - @Setter private Consumer removeMethod; + private List cachedRooms; + private final Span totalUsers = new Span(); + @Setter private Consumer removeMethod; - public RoomList(String nodeIdentifier, List buckets) { + public RoomList(String nodeIdentifier, List buckets) { this.nodeIdentifier = nodeIdentifier; cachedRooms = buckets; @@ -58,9 +61,10 @@ public class RoomList extends VerticalLayout { .toList()); } - private Grid createGrid() { - var grid = new Grid<>(Room.Short.class, false); - grid.addColumn(Room.Short::id).setHeader("Identifier"); + private Grid createGrid() { + var grid = new Grid<>(RRoom.Short.class, false); + grid.addColumn(RRoom.Short::id).setHeader("Identifier"); + grid.addComponentColumn(room -> { var result = new Span(); if (room.slots() == -1) { @@ -71,6 +75,12 @@ public class RoomList extends VerticalLayout { } return result; }).setHeader("Slots").setTextAlign(ColumnTextAlign.CENTER); + + grid.addColumn(this::getUsers).setHeader("Users").setTextAlign(ColumnTextAlign.CENTER).setFooter(totalUsers); + + grid.addColumn(room -> UserList.getUsingPercentage(room.slots(), getUsers(room))) + .setHeader("Occupancy").setTextAlign(ColumnTextAlign.CENTER); + grid.addComponentColumn(room -> { var result = new Span(); if (room.locked()) { @@ -81,11 +91,12 @@ public class RoomList extends VerticalLayout { } return result; }).setHeader("Locked").setTextAlign(ColumnTextAlign.CENTER); + grid.addComponentColumn(this::createManageButtons).setHeader("Manage"); return grid; } - private HorizontalLayout createManageButtons(Room.Short room) { + private HorizontalLayout createManageButtons(RRoom.Short room) { var layout = new HorizontalLayout(); { @@ -105,14 +116,14 @@ public class RoomList extends VerticalLayout { return layout; } - private void clickDetailsButton(Room.Short bucket) { + private void clickDetailsButton(RRoom.Short bucket) { getUI().ifPresent(ui -> { ui.navigate("/nodes/" + nodeIdentifier + "/rooms/" + bucket.id()); }); } - private void clickRemoveButton(Room.Short bucket) { + private void clickRemoveButton(RRoom.Short bucket) { var dialog = new Dialog("Confirm bucket deletion"); dialog.add(new Html("

Confirm that you want to delete bucket. Enter " + bucket.id() + " to field below and confirm.

")); @@ -146,14 +157,28 @@ public class RoomList extends VerticalLayout { dialog.open(); } - public void update(List buckets) { + public void update(List buckets) { cachedRooms = buckets; applySearch(searchField.getValue()); + + int users = 0; + for (var room: cachedRooms) { + users += getUsers(room); + } + totalUsers.setText("Total users: " + users); } - private void removeBucket(Room.Short bucket) { + private void removeBucket(RRoom.Short bucket) { if (removeMethod != null) { removeMethod.accept(bucket); } } + + private int getUsers(RRoom.Short room) { + try { + return Integer.parseInt(room.details().getOrDefault(RoomDetails.COUNT_USERS, "0")); + } catch (NumberFormatException ex) { + return 0; + } + } } diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/UserList.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/UserList.java index 8ee9eb8..27762ae 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/component/UserList.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/component/UserList.java @@ -4,21 +4,22 @@ import com.vaadin.flow.component.grid.ColumnTextAlign; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.html.Span; import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import ru.dragonestia.picker.api.model.Room; -import ru.dragonestia.picker.api.model.User; +import ru.dragonestia.picker.api.repository.response.type.RRoom; +import ru.dragonestia.picker.api.repository.response.type.RUser; +import ru.dragonestia.picker.api.repository.details.UserDetails; import java.util.ArrayList; import java.util.List; public class UserList extends VerticalLayout { - private final Room room; - private final Grid usersGrid; + private final RRoom room; + private final Grid usersGrid; private final Span totalUsers = new Span(); private final Span occupancy = new Span(); - private List cachedUsers = new ArrayList<>(); + private List cachedUsers = new ArrayList<>(); - public UserList(Room room, List users) { + public UserList(RRoom room, List users) { this.room = room; add(usersGrid = createUsersGrid()); @@ -26,25 +27,25 @@ public class UserList extends VerticalLayout { update(users); } - private Grid createUsersGrid() { - var grid = new Grid(); - grid.addColumn(User::getId).setHeader("User Identifier").setFooter(totalUsers); - grid.addColumn(user -> 0).setTextAlign(ColumnTextAlign.CENTER).setHeader("Linked with rooms") // TODO + private Grid createUsersGrid() { + var grid = new Grid(); + grid.addColumn(RUser::getId).setHeader("User Identifier").setFooter(totalUsers); + grid.addColumn(user -> user.getDetail(UserDetails.COUNT_ROOMS)).setTextAlign(ColumnTextAlign.CENTER).setHeader("Linked with rooms") .setFooter(occupancy); grid.addComponentColumn(user -> new Span("buttons")).setHeader("Manage"); // TODO return grid; } - public void update(List users) { + public void update(List users) { cachedUsers = users; usersGrid.setItems(users); totalUsers.setText("Total users: " + users.size()); - occupancy.setText("Occupancy: %s".formatted(getUsingPercentage(room, users.size()))); + occupancy.setText("Occupancy: %s".formatted(getUsingPercentage(room.getSlots(), users.size()))); } - private String getUsingPercentage(Room room, int usedSlots) { - if (room.isUnlimited()) return "0%"; - double percent = usedSlots / (double) room.getSlots() * 100; + public static String getUsingPercentage(int slots, int usedSlots) { + if (slots == RRoom.INFINITE_SLOTS) return "N/A"; + double percent = usedSlots / (double) slots * 100; return ((int) percent) + "%"; } } diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/NodeDetailsPage.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/NodeDetailsPage.java index ef0a278..a439eb3 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/NodeDetailsPage.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/NodeDetailsPage.java @@ -3,7 +3,6 @@ package ru.dragonestia.picker.cp.page; import com.vaadin.flow.component.Html; import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.html.Hr; -import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.router.BeforeEnterEvent; import com.vaadin.flow.router.BeforeEnterObserver; @@ -11,18 +10,18 @@ import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import ru.dragonestia.picker.api.model.Node; -import ru.dragonestia.picker.api.model.Room; +import ru.dragonestia.picker.api.repository.details.RoomDetails; +import ru.dragonestia.picker.api.repository.response.type.RNode; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.NodeRepository; import ru.dragonestia.picker.api.repository.RoomRepository; -import ru.dragonestia.picker.cp.component.Notifications; import ru.dragonestia.picker.cp.component.RoomList; import ru.dragonestia.picker.cp.component.NavPath; import ru.dragonestia.picker.cp.component.RegisterRoom; import ru.dragonestia.picker.cp.util.RouteParamsExtractor; import java.util.List; +import java.util.Set; @Getter @RequiredArgsConstructor @@ -34,7 +33,7 @@ public class NodeDetailsPage extends VerticalLayout implements BeforeEnterObserv private final RoomRepository roomRepository; private final RouteParamsExtractor paramsExtractor; - private Node node; + private RNode node; private RegisterRoom registerRoom; private RoomList roomList; @@ -42,10 +41,10 @@ public class NodeDetailsPage extends VerticalLayout implements BeforeEnterObserv public void beforeEnter(BeforeEnterEvent event) { node = paramsExtractor.extractNodeId(event); - initComponents(node, roomRepository.all(node)); + initComponents(node, roomRepository.all(node, RoomRepository.ALL_DETAILS)); } - private void initComponents(Node node, List rooms) { + private void initComponents(RNode node, List rooms) { add(NavPath.toNode(node.getId())); printNodeDetails(node); add(new Hr()); @@ -56,18 +55,18 @@ public class NodeDetailsPage extends VerticalLayout implements BeforeEnterObserv } catch (Error error) { return new RegisterRoom.Response(true, error.getMessage()); } finally { - roomList.update(roomRepository.all(node)); + roomList.update(roomRepository.all(node, RoomRepository.ALL_DETAILS)); } })); add(new Hr()); add(roomList = new RoomList(node.getId(), rooms)); roomList.setRemoveMethod(room -> { roomRepository.remove(node, room); - roomList.update(roomRepository.all(node)); + roomList.update(roomRepository.all(node, RoomRepository.ALL_DETAILS)); }); } - private void printNodeDetails(Node node) { + private void printNodeDetails(RNode node) { add(new H2("Node details")); var layout = new VerticalLayout(); diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/NodesPage.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/NodesPage.java index 76c4fbe..6b6bc27 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/NodesPage.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/NodesPage.java @@ -33,7 +33,7 @@ public class NodesPage extends VerticalLayout { add(nodeList = createNodeListElement()); nodeList.setRemoveMethod(nodeIdentifier -> { nodeRepository.remove(nodeIdentifier); - nodeList.update(nodeRepository.all()); + nodeList.update(nodeRepository.all(NodeRepository.ALL_DETAILS)); }); } @@ -45,12 +45,12 @@ public class NodesPage extends VerticalLayout { } catch (ApiException ex) { return new RegisterNode.Response(true, ex.getMessage()); } finally { - nodeList.update(nodeRepository.all()); + nodeList.update(nodeRepository.all(NodeRepository.ALL_DETAILS)); } }); } protected NodeList createNodeListElement() { - return new NodeList(nodeRepository.all()); + return new NodeList(nodeRepository.all(NodeRepository.ALL_DETAILS)); } } diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/RoomDetailsPage.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/RoomDetailsPage.java index 7a39bae..bee12fd 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/RoomDetailsPage.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/RoomDetailsPage.java @@ -5,7 +5,6 @@ import com.vaadin.flow.component.Unit; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.html.Hr; -import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.orderedlayout.VerticalLayout; @@ -15,13 +14,13 @@ import com.vaadin.flow.router.BeforeEnterObserver; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import ru.dragonestia.picker.api.model.Node; -import ru.dragonestia.picker.api.model.Room; -import ru.dragonestia.picker.api.model.User; +import ru.dragonestia.picker.api.repository.response.type.RNode; +import ru.dragonestia.picker.api.repository.response.type.RRoom; +import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.api.repository.NodeRepository; import ru.dragonestia.picker.api.repository.RoomRepository; import ru.dragonestia.picker.api.repository.UserRepository; +import ru.dragonestia.picker.api.repository.details.UserDetails; import ru.dragonestia.picker.cp.component.AddUsers; import ru.dragonestia.picker.cp.component.NavPath; import ru.dragonestia.picker.cp.component.Notifications; @@ -29,6 +28,7 @@ import ru.dragonestia.picker.cp.component.UserList; import ru.dragonestia.picker.cp.util.RouteParamsExtractor; import java.util.Collection; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; @RequiredArgsConstructor @@ -41,8 +41,8 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv private final UserRepository userRepository; private final RouteParamsExtractor paramsExtractor; - private Node node; - private Room room; + private RNode node; + private RRoom room; private AddUsers addUsers; private UserList userList; private Button lockRoomButton; @@ -64,7 +64,7 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv add(addUsers = new AddUsers(room, (users, ignoreLimitation) -> appendUsers(room, users, ignoreLimitation))); add(new Hr()); add(new H2("Users")); - add(userList = new UserList(room, userRepository.all(room))); + add(userList = new UserList(room, userRepository.all(room, UserRepository.ALL_DETAILS))); } private void updateRoomInfo() { @@ -111,7 +111,7 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv Notifications.success("Success"); } - private void appendUsers(Room room, Collection users, boolean ignoreLimitation) { + private void appendUsers(RRoom room, Collection users, boolean ignoreLimitation) { AtomicBoolean validationFail = new AtomicBoolean(false); var newUsers = users.stream() @@ -125,7 +125,7 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv }).toList(); userRepository.linkWithRoom(room, newUsers, ignoreLimitation); - userList.update(userRepository.all(room)); + userList.update(userRepository.all(room, UserRepository.ALL_DETAILS)); if (validationFail.get()) { if (newUsers.isEmpty()) { diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/NodeRepositoryImpl.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/NodeRepositoryImpl.java index 95447f6..29390e6 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/NodeRepositoryImpl.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/NodeRepositoryImpl.java @@ -7,13 +7,15 @@ import org.springframework.http.HttpMethod; import ru.dragonestia.picker.api.exception.InvalidNodeIdentifierException; import ru.dragonestia.picker.api.exception.NodeAlreadyExistException; import ru.dragonestia.picker.api.exception.NodeNotFoundException; +import ru.dragonestia.picker.api.repository.details.NodeDetails; import ru.dragonestia.picker.api.repository.response.NodeDetailsResponse; import ru.dragonestia.picker.api.repository.response.NodeListResponse; -import ru.dragonestia.picker.api.model.Node; +import ru.dragonestia.picker.api.repository.response.type.RNode; import ru.dragonestia.picker.api.repository.NodeRepository; import java.util.List; import java.util.Optional; +import java.util.Set; @Log4j2 @RequiredArgsConstructor @@ -23,7 +25,7 @@ public class NodeRepositoryImpl implements NodeRepository { private final RestUtil rest; @Override - public void register(Node node) throws InvalidNodeIdentifierException, NodeAlreadyExistException { + public void register(RNode node) throws InvalidNodeIdentifierException, NodeAlreadyExistException { rest.query("nodes", HttpMethod.POST, params -> { params.put("nodeId", node.getId()); params.put("method", node.getMode().name()); @@ -31,12 +33,14 @@ public class NodeRepositoryImpl implements NodeRepository { } @Override - public List all() { - return rest.query("nodes", HttpMethod.GET, NodeListResponse.class, params -> {}).nodes(); + public List all(Set details) { + return rest.query("nodes", HttpMethod.GET, NodeListResponse.class, params -> { + params.put("requiredDetails", String.join(",", details.stream().map(Enum::toString).toList())); + }).nodes(); } @Override - public Optional find(String nodeId) { + public Optional find(String nodeId) { try { var response = rest.query("nodes/" + nodeId, HttpMethod.GET, NodeDetailsResponse.class, params -> {}); return Optional.of(response.node()); diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/RoomRepositoryImpl.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/RoomRepositoryImpl.java index d29ca69..51287d8 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/RoomRepositoryImpl.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/RoomRepositoryImpl.java @@ -8,14 +8,16 @@ import ru.dragonestia.picker.api.exception.InvalidRoomIdentifierException; import ru.dragonestia.picker.api.exception.NodeNotFoundException; import ru.dragonestia.picker.api.exception.RoomAlreadyExistException; import ru.dragonestia.picker.api.exception.RoomNotFoundException; -import ru.dragonestia.picker.api.model.Node; -import ru.dragonestia.picker.api.model.Room; +import ru.dragonestia.picker.api.repository.details.RoomDetails; +import ru.dragonestia.picker.api.repository.response.type.RNode; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.RoomRepository; import ru.dragonestia.picker.api.repository.response.RoomInfoResponse; import ru.dragonestia.picker.api.repository.response.RoomListResponse; import java.util.List; import java.util.Optional; +import java.util.Set; @Log4j2 @RequiredArgsConstructor @@ -25,7 +27,7 @@ public class RoomRepositoryImpl implements RoomRepository { private final RestUtil rest; @Override - public void register(Room room) throws NodeNotFoundException, InvalidRoomIdentifierException, RoomAlreadyExistException { + public void register(RRoom room) throws NodeNotFoundException, InvalidRoomIdentifierException, RoomAlreadyExistException { rest.query("/nodes/" + room.getNodeId() + "/rooms", HttpMethod.POST, params -> { params.put("roomId", room.getId()); params.put("slots", Integer.toString(room.getSlots())); @@ -35,22 +37,24 @@ public class RoomRepositoryImpl implements RoomRepository { } @Override - public void remove(Room room) throws NodeNotFoundException { + public void remove(RRoom room) throws NodeNotFoundException { rest.query("/nodes/" + room.getNodeId() + "/rooms/" + room.getId(), HttpMethod.DELETE, params -> {}); } @Override - public void remove(Node node, Room.Short room) throws NodeNotFoundException { + public void remove(RNode node, RRoom.Short room) throws NodeNotFoundException { rest.query("/nodes/" + node.getId() + "/rooms/" + room.id(), HttpMethod.DELETE, params -> {}); } @Override - public List all(Node node) throws NodeNotFoundException { - return rest.query("/nodes/" + node.getId() + "/rooms", HttpMethod.GET, RoomListResponse.class, params -> {}).rooms(); + public List all(RNode node, Set details) throws NodeNotFoundException { + return rest.query("/nodes/" + node.getId() + "/rooms", HttpMethod.GET, RoomListResponse.class, params -> { + params.put("requiredDetails", String.join(",", details.stream().map(Enum::toString).toList())); + }).rooms(); } @Override - public Optional find(Node node, String roomId) throws NodeNotFoundException { + public Optional find(RNode node, String roomId) throws NodeNotFoundException { try { var response = rest.query("/nodes/" + node.getId() + "/rooms/" + roomId, HttpMethod.GET, RoomInfoResponse.class, map -> {}); return Optional.of(response.room()); @@ -60,7 +64,7 @@ public class RoomRepositoryImpl implements RoomRepository { } @Override - public void lock(Room room, boolean value) throws NodeNotFoundException, RoomNotFoundException { + public void lock(RRoom room, boolean value) throws NodeNotFoundException, RoomNotFoundException { rest.query("/nodes/%s/rooms/%s/lock".formatted(room.getNodeId(), room.getId()), HttpMethod.PUT, params -> { params.put("newState", Boolean.toString(value)); }); diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/UserRepositoryImpl.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/UserRepositoryImpl.java index b4098ac..33c5931 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/UserRepositoryImpl.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/repository/impl/UserRepositoryImpl.java @@ -7,13 +7,15 @@ import org.springframework.http.HttpMethod; import ru.dragonestia.picker.api.exception.NodeNotFoundException; import ru.dragonestia.picker.api.exception.RoomAreFullException; import ru.dragonestia.picker.api.exception.RoomNotFoundException; -import ru.dragonestia.picker.api.model.Room; -import ru.dragonestia.picker.api.model.User; +import ru.dragonestia.picker.api.repository.response.type.RRoom; +import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.api.repository.UserRepository; +import ru.dragonestia.picker.api.repository.details.UserDetails; import ru.dragonestia.picker.api.repository.response.RoomUserListResponse; import java.util.Collection; import java.util.List; +import java.util.Set; @Log4j2 @RequiredArgsConstructor @@ -23,29 +25,33 @@ public class UserRepositoryImpl implements UserRepository { private final RestUtil rest; @Override - public void linkWithRoom(Room room, Collection users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException { + public void linkWithRoom(RRoom room, Collection users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException { rest.query("/nodes/%s/rooms/%s/users".formatted(room.getNodeId(), room.getId()), HttpMethod.POST, params -> { - params.put("userIds", String.join(",", users.stream().map(User::getId).toList())); + params.put("userIds", String.join(",", users.stream().map(RUser::getId).toList())); params.put("force", Boolean.toString(force)); }); } @Override - public void unlinkFromRoom(Room room, Collection users) throws NodeNotFoundException, RoomNotFoundException { + public void unlinkFromRoom(RRoom room, Collection users) throws NodeNotFoundException, RoomNotFoundException { rest.query("/nodes/%s/rooms/%s/users".formatted(room.getNodeId(), room.getId()), HttpMethod.DELETE, params -> { - params.put("userIds", String.join(",", users.stream().map(User::getId).toList())); + params.put("userIds", String.join(",", users.stream().map(RUser::getId).toList())); }); } @Override - public List all(Room room) throws NodeNotFoundException, RoomNotFoundException { + public List all(RRoom room, Set details) throws NodeNotFoundException, RoomNotFoundException { return rest.query("/nodes/%s/rooms/%s/users".formatted(room.getNodeId(), room.getId()), HttpMethod.GET, RoomUserListResponse.class, - params -> {}).users(); + params -> { + var detailsStr = String.join(",", details.stream().map(Enum::toString).toList()); + + params.put("requiredDetails", detailsStr); + }).users(); } } diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/util/RouteParamsExtractor.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/util/RouteParamsExtractor.java index 2ccefb7..0d3cc55 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/util/RouteParamsExtractor.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/util/RouteParamsExtractor.java @@ -5,8 +5,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import ru.dragonestia.picker.api.exception.NodeNotFoundException; import ru.dragonestia.picker.api.exception.RoomNotFoundException; -import ru.dragonestia.picker.api.model.Node; -import ru.dragonestia.picker.api.model.Room; +import ru.dragonestia.picker.api.repository.response.type.RNode; +import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.NodeRepository; import ru.dragonestia.picker.api.repository.RoomRepository; @@ -17,12 +17,12 @@ public class RouteParamsExtractor { private final NodeRepository nodeRepository; private final RoomRepository roomRepository; - public Node extractNodeId(BeforeEnterEvent e) throws NodeNotFoundException { + public RNode extractNodeId(BeforeEnterEvent e) throws NodeNotFoundException { var nodeId = e.getRouteParameters().get("nodeId").orElseThrow(() -> new NodeNotFoundException("null")); return nodeRepository.find(nodeId).orElseThrow(() -> new NodeNotFoundException(nodeId)); } - public Room extractRoomId(BeforeEnterEvent e, Node node) throws RoomNotFoundException { + public RRoom extractRoomId(BeforeEnterEvent e, RNode node) throws RoomNotFoundException { var roomId = e.getRouteParameters().get("roomId").orElseThrow(() -> new NodeNotFoundException("null")); return roomRepository.find(node, roomId).orElseThrow(() -> new NodeNotFoundException(roomId)); }