From bff4db3e0f90a98f50928a3af90b323038e3f455 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Mon, 6 May 2024 17:17:01 +0700 Subject: [PATCH] added more data for entities --- .../controller/graphql/GraphqlController.java | 13 ++++-- .../controller/graphql/entity/EntityNode.java | 36 ++++++++++++--- .../controller/graphql/entity/EntityRoom.java | 44 +++++++++++++++---- .../controller/graphql/entity/EntityUser.java | 27 ++++++++++-- .../graphql/entity/type/DataProvider.java | 10 +++++ .../main/resources/graphql/schema.graphqls | 9 ++++ 6 files changed, 117 insertions(+), 22 deletions(-) create mode 100644 server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/type/DataProvider.java diff --git a/server/src/main/java/ru/dragonestia/picker/controller/graphql/GraphqlController.java b/server/src/main/java/ru/dragonestia/picker/controller/graphql/GraphqlController.java index bf764b8..4c1bdff 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/graphql/GraphqlController.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/graphql/GraphqlController.java @@ -1,9 +1,9 @@ package ru.dragonestia.picker.controller.graphql; -import lombok.RequiredArgsConstructor; import org.springframework.graphql.data.method.annotation.QueryMapping; import org.springframework.stereotype.Controller; import ru.dragonestia.picker.controller.graphql.entity.EntityNode; +import ru.dragonestia.picker.controller.graphql.entity.type.DataProvider; import ru.dragonestia.picker.service.NodeService; import ru.dragonestia.picker.service.RoomService; import ru.dragonestia.picker.service.UserService; @@ -11,17 +11,24 @@ import ru.dragonestia.picker.service.UserService; import java.util.List; @Controller -@RequiredArgsConstructor public class GraphqlController { private final NodeService nodeService; private final RoomService roomService; private final UserService userService; + private final DataProvider dataProvider; + + public GraphqlController(NodeService nodeService, RoomService roomService, UserService userService) { + this.nodeService = nodeService; + this.roomService = roomService; + this.userService = userService; + dataProvider = new DataProvider(nodeService, roomService, userService); + } @QueryMapping List allNodes() { return nodeService.all().stream() - .map(EntityNode::new) + .map(node -> new EntityNode(node, dataProvider)) .toList(); } } diff --git a/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityNode.java b/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityNode.java index a996a9c..48a5c09 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityNode.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityNode.java @@ -1,21 +1,43 @@ 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.Node; +import java.util.List; + +@RequiredArgsConstructor public class EntityNode { private final Node node; + private final DataProvider dataProvider; + private List cachedRooms = null; - public EntityNode(Node node) { - this.node = node; - } - - public @NotNull String getId() { + public String getId() { return node.getIdentifier(); } - public @NotNull String getMethod() { + public String getMethod() { return node.getPickingMethod().name(); } + + public List getRooms() { + if (cachedRooms != null) { + return cachedRooms; + } + + cachedRooms = dataProvider.roomService().all(node).stream() + .map(room -> new EntityRoom(room, dataProvider)) + .toList(); + + return cachedRooms; + } + + public int getCountRooms() { + return getRooms().size(); + } + + public boolean isPersist() { + return node.isPersist(); + } } diff --git a/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityRoom.java b/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityRoom.java index 36510c5..61bfd53 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityRoom.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityRoom.java @@ -1,33 +1,61 @@ 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.Room; +import java.util.List; + +@RequiredArgsConstructor public class EntityRoom { private final Room room; + private final DataProvider dataProvider; + private List cachedUsers = null; - public EntityRoom(@NotNull Room room) { - this.room = room; - } - - public @NotNull String getId() { + public String getId() { return room.getIdentifier(); } - public @NotNull String getNodeId() { + public String getNodeId() { return room.getNodeIdentifier(); } + public EntityNode getNode() { + return dataProvider.nodeService().find(room.getNodeIdentifier()) + .map(node -> new EntityNode(node, dataProvider)) + .orElseThrow(); + } + public int getSlots() { return room.getMaxSlots(); } - public @NotNull String getPayload() { + public String getPayload() { return room.getPayload(); } public boolean isLocked() { return room.isLocked(); } + + public List getUsers() { + if (cachedUsers != null) { + return cachedUsers; + } + + cachedUsers = dataProvider.userService().getRoomUsers(room).stream() + .map(user -> new EntityUser(user, dataProvider)) + .toList(); + + return cachedUsers; + } + + public int getCountUsers() { + return getUsers().size(); + } + + public boolean isPersist() { + return room.isPersist(); + } } diff --git a/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityUser.java b/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityUser.java index 8c9d8bc..76287f9 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityUser.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/EntityUser.java @@ -1,17 +1,36 @@ 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; +import java.util.List; + +@RequiredArgsConstructor public class EntityUser { private final User user; - - public EntityUser(@NotNull User user) { - this.user = user; - } + private final DataProvider dataProvider; + private List cachedRooms = null; public @NotNull String getId() { return user.getIdentifier(); } + + public List 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(); + } } diff --git a/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/type/DataProvider.java b/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/type/DataProvider.java new file mode 100644 index 0000000..d8467dd --- /dev/null +++ b/server/src/main/java/ru/dragonestia/picker/controller/graphql/entity/type/DataProvider.java @@ -0,0 +1,10 @@ +package ru.dragonestia.picker.controller.graphql.entity.type; + +import jakarta.validation.constraints.NotNull; +import ru.dragonestia.picker.service.NodeService; +import ru.dragonestia.picker.service.RoomService; +import ru.dragonestia.picker.service.UserService; + +public record DataProvider(@NotNull NodeService nodeService, + @NotNull RoomService roomService, + @NotNull UserService userService) {} diff --git a/server/src/main/resources/graphql/schema.graphqls b/server/src/main/resources/graphql/schema.graphqls index 58c2fb6..c4b06b5 100644 --- a/server/src/main/resources/graphql/schema.graphqls +++ b/server/src/main/resources/graphql/schema.graphqls @@ -9,16 +9,25 @@ type Query { type Node { id: String! method: String! + rooms: [Room] + countRooms: Int! + persist: Boolean! } type Room { id: String! nodeId: String! + node: Node! slots: Int! payload: String! locked: Boolean! + users: [User] + countUsers: Int! + persist: Boolean! } type User { id: String! + rooms: [Room] + countRooms: Int! }