From fb06655d89d691f58d2348c7b813a06e707b7d78 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Tue, 12 Mar 2024 22:00:28 +0700 Subject: [PATCH] Refactored picked room response and updated client NodeRepository --- .../picker/api/repository/NodeRepository.java | 6 ++++++ .../response/PickedRoomResponse.java | 16 ++++++++++++++++ .../impl/repository/NodeRepositoryImpl.java | 9 +++++++++ .../picker/controller/NodeController.java | 7 ++++--- .../picker/service/RoomService.java | 3 ++- .../picker/service/impl/RoomServiceImpl.java | 19 +++++++++++++++++-- 6 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 client-api/src/main/java/ru/dragonestia/picker/api/repository/response/PickedRoomResponse.java diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/NodeRepository.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/NodeRepository.java index ec71aa9..4009f74 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/NodeRepository.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/NodeRepository.java @@ -6,9 +6,13 @@ import ru.dragonestia.picker.api.model.node.NodeDefinition; import ru.dragonestia.picker.api.repository.request.node.FindNodeById; import ru.dragonestia.picker.api.repository.request.node.GetAllNodes; import ru.dragonestia.picker.api.repository.request.node.RemoveNodesByIds; +import ru.dragonestia.picker.api.repository.response.PickedRoomResponse; +import ru.dragonestia.picker.api.repository.type.NodeIdentifier; +import ru.dragonestia.picker.api.repository.type.UserIdentifier; import java.util.List; import java.util.Optional; +import java.util.Set; public interface NodeRepository { @@ -21,4 +25,6 @@ public interface NodeRepository { void removeNode(@NotNull INode node); void saveNode(@NotNull NodeDefinition definition); + + @NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set users); } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/PickedRoomResponse.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/PickedRoomResponse.java new file mode 100644 index 0000000..15af2cd --- /dev/null +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/PickedRoomResponse.java @@ -0,0 +1,16 @@ +package ru.dragonestia.picker.api.repository.response; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.Set; + +@Schema(title = "Result of picking room", hidden = true) +public record PickedRoomResponse( + @Schema(description = "Node identifier", example = "test-node") String nodeId, + @Schema(description = "Room identifier", example = "test-room") String roomId, + @Schema(description = "Payload", example = "Hello world!") String payload, + @Schema(description = "Max slots in room", example = "25") int slots, + @Schema(description = "Used slots in room", example = "5") int usedSlots, + @Schema(description = "Locked for picking?", example = "false") boolean locked, + @Schema(description = "User identifiers") Set users +) {} diff --git a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/NodeRepositoryImpl.java b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/NodeRepositoryImpl.java index b0b0d55..2d79946 100644 --- a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/NodeRepositoryImpl.java +++ b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/NodeRepositoryImpl.java @@ -10,9 +10,13 @@ import ru.dragonestia.picker.api.repository.NodeRepository; import ru.dragonestia.picker.api.repository.request.node.FindNodeById; import ru.dragonestia.picker.api.repository.request.node.GetAllNodes; import ru.dragonestia.picker.api.repository.request.node.RemoveNodesByIds; +import ru.dragonestia.picker.api.repository.response.PickedRoomResponse; +import ru.dragonestia.picker.api.repository.type.NodeIdentifier; +import ru.dragonestia.picker.api.repository.type.UserIdentifier; import java.util.List; import java.util.Optional; +import java.util.Set; public class NodeRepositoryImpl implements NodeRepository { @@ -47,4 +51,9 @@ public class NodeRepositoryImpl implements NodeRepository { public void saveNode(@NotNull NodeDefinition definition) { throw new UnsupportedOperationException("Not implemented"); } + + @Override + public @NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set users) { + throw new UnsupportedOperationException("Not implemented"); + } } diff --git a/server/src/main/java/ru/dragonestia/picker/controller/NodeController.java b/server/src/main/java/ru/dragonestia/picker/controller/NodeController.java index 0270522..fb0c3fb 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/NodeController.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/NodeController.java @@ -10,6 +10,7 @@ import ru.dragonestia.picker.api.exception.NodeNotFoundException; import ru.dragonestia.picker.api.model.node.PickingMethod; import ru.dragonestia.picker.api.repository.response.NodeDetailsResponse; import ru.dragonestia.picker.api.repository.response.NodeListResponse; +import ru.dragonestia.picker.api.repository.response.PickedRoomResponse; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.service.NodeService; import ru.dragonestia.picker.service.RoomService; @@ -73,7 +74,7 @@ public class NodeController { @Operation(summary = "Pick node for users") @PostMapping("/{nodeId}/pick") - ResponseEntity pickRoom( + ResponseEntity pickRoom( @Parameter(description = "Node identifier") @PathVariable("nodeId") String nodeId, @Parameter(description = "Users to add", example = "user1,user3,user3") @RequestParam(name = "userIds") String userIds ) { @@ -81,8 +82,8 @@ public class NodeController { var node = nodeService.find(nodeId).orElseThrow(() -> new NodeNotFoundException(nodeId)); var users = namingValidator.validateUserIds(Arrays.stream(userIds.split(",")).toList()); - var room = roomService.pickAvailable(node, users); + var response = roomService.pickAvailable(node, users); - return ResponseEntity.ok(room); // TODO: make other json schema + return ResponseEntity.ok(response); } } diff --git a/server/src/main/java/ru/dragonestia/picker/service/RoomService.java b/server/src/main/java/ru/dragonestia/picker/service/RoomService.java index 921f9ba..23d39b7 100644 --- a/server/src/main/java/ru/dragonestia/picker/service/RoomService.java +++ b/server/src/main/java/ru/dragonestia/picker/service/RoomService.java @@ -4,6 +4,7 @@ import ru.dragonestia.picker.api.exception.InvalidRoomIdentifierException; import ru.dragonestia.picker.api.exception.RoomAlreadyExistException; import ru.dragonestia.picker.api.model.room.RoomDetails; import ru.dragonestia.picker.api.model.room.ShortResponseRoom; +import ru.dragonestia.picker.api.repository.response.PickedRoomResponse; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.User; @@ -24,7 +25,7 @@ public interface RoomService { List getAllRoomsWithDetailsResponse(Node node, Set details); - Room pickAvailable(Node node, List users); + PickedRoomResponse pickAvailable(Node node, List users); void updateState(Room room); } diff --git a/server/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java b/server/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java index f387c49..e825c2d 100644 --- a/server/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java +++ b/server/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java @@ -9,11 +9,13 @@ import ru.dragonestia.picker.api.exception.NotPersistedNodeException; import ru.dragonestia.picker.api.exception.RoomAlreadyExistException; import ru.dragonestia.picker.api.model.room.RoomDetails; import ru.dragonestia.picker.api.model.room.ShortResponseRoom; +import ru.dragonestia.picker.api.repository.response.PickedRoomResponse; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.repository.NodeRepository; import ru.dragonestia.picker.repository.RoomRepository; +import ru.dragonestia.picker.repository.UserRepository; import ru.dragonestia.picker.service.RoomService; import ru.dragonestia.picker.storage.NodeAndRoomStorage; import ru.dragonestia.picker.util.DetailsExtractor; @@ -23,6 +25,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; @Log4j2 @Service @@ -31,6 +34,7 @@ public class RoomServiceImpl implements RoomService { private final RoomRepository roomRepository; private final NodeRepository nodeRepository; + private final UserRepository userRepository; private final DetailsExtractor detailsExtractor; private final NamingValidator namingValidator; private final NodeAndRoomStorage storage; @@ -74,9 +78,20 @@ public class RoomServiceImpl implements RoomService { } @Override - public Room pickAvailable(Node node, List users) { - return roomRepository.pickFree(node, users) + public PickedRoomResponse pickAvailable(Node node, List users) { + var room = roomRepository.pickFree(node, users) .orElseThrow(() -> new RuntimeException("There are no rooms available")); + var roomUsers = userRepository.usersOf(room); + + return new PickedRoomResponse( + room.getNodeId(), + room.getId(), + room.getPayload(), + room.getSlots().getSlots(), + roomUsers.size(), + room.isLocked(), + roomUsers.stream().map(User::id).collect(Collectors.toSet()) + ); } @Override