From 58141194286b90ce1ee494507ac9b96148391530 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Wed, 13 Mar 2024 11:57:26 +0700 Subject: [PATCH] Implemented RoomRepository --- .../picker/api/model/room/RoomDefinition.java | 2 +- .../picker/api/repository/RoomRepository.java | 3 ++ .../request/room/RemoveRoomsByIds.java | 47 +++++++++++++------ .../impl/repository/NodeRepositoryImpl.java | 2 + .../impl/repository/RoomRepositoryImpl.java | 46 ++++++++++++++++-- 5 files changed, 80 insertions(+), 20 deletions(-) diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/model/room/RoomDefinition.java b/client-api/src/main/java/ru/dragonestia/picker/api/model/room/RoomDefinition.java index 320026b..79b3962 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/model/room/RoomDefinition.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/model/room/RoomDefinition.java @@ -59,7 +59,7 @@ public class RoomDefinition implements IRoom { } @Override - public @Nullable Boolean isPersist() { + public @NotNull Boolean isPersist() { return persist; } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/RoomRepository.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/RoomRepository.java index 0b7490f..9c9d2d2 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/RoomRepository.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/RoomRepository.java @@ -1,6 +1,7 @@ package ru.dragonestia.picker.api.repository; import org.jetbrains.annotations.NotNull; +import ru.dragonestia.picker.api.model.room.IRoom; import ru.dragonestia.picker.api.model.room.ResponseRoom; import ru.dragonestia.picker.api.model.room.RoomDefinition; import ru.dragonestia.picker.api.model.room.ShortResponseRoom; @@ -18,6 +19,8 @@ public interface RoomRepository { void removeRooms(@NotNull RemoveRoomsByIds request); + void removeRoom(@NotNull IRoom room); + @NotNull List allRooms(@NotNull GetAllRooms request); @NotNull Optional find(@NotNull FindRoomById request); diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/request/room/RemoveRoomsByIds.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/request/room/RemoveRoomsByIds.java index 7b23a2e..1722b7a 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/request/room/RemoveRoomsByIds.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/request/room/RemoveRoomsByIds.java @@ -2,26 +2,34 @@ package ru.dragonestia.picker.api.repository.request.room; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import ru.dragonestia.picker.api.repository.type.NodeIdentifier; +import ru.dragonestia.picker.api.repository.type.RoomIdentifier; import ru.dragonestia.picker.api.repository.type.RoomPath; import java.util.Collections; -import java.util.HashSet; import java.util.Set; +import java.util.stream.Collectors; public class RemoveRoomsByIds { - private final Set paths; + private final String nodeId; + private final Set roomsIds; - private RemoveRoomsByIds(Set paths) { - this.paths = paths; + private RemoveRoomsByIds(String nodeId, Set roomIds) { + this.nodeId = nodeId; + this.roomsIds = roomIds; } - public @NotNull Set getPaths() { - return paths; + public @NotNull String getNodeId() { + return nodeId; } - public static @NotNull RemoveRoomsByIds just(@NotNull RoomPath path) { - return RemoveRoomsByIds.builder().appendPath(path).build(); + public @NotNull Set getRoomsIds() { + return roomsIds; + } + + public static @NotNull RemoveRoomsByIds just(@NotNull NodeIdentifier nodeId, @NotNull RoomIdentifier roomId) { + return RemoveRoomsByIds.builder().appendRoomId(path).build(); } public static @NotNull Builder builder() { @@ -30,24 +38,35 @@ public class RemoveRoomsByIds { public static class Builder { - private Set paths = new HashSet<>(); + private String nodeId = null; + private Set roomsIds; private Builder() {} @Contract("_ -> this") - public @NotNull Builder setPaths(@NotNull Set paths) { - this.paths = paths; + public @NotNull Builder setNodeId(@NotNull NodeIdentifier identifier) { + nodeId = identifier.getValue(); return this; } @Contract("_ -> this") - public @NotNull Builder appendPath(@NotNull RoomPath path) { - paths.add(path); + public @NotNull Builder setRoomsIds(@NotNull Set roomIds) { + this.roomsIds = roomIds; + return this; + } + + @Contract("_ -> this") + public @NotNull Builder appendRoomId(@NotNull RoomIdentifier roomId) { + roomsIds.add(roomId); return this; } public @NotNull RemoveRoomsByIds build() { - return new RemoveRoomsByIds(Collections.unmodifiableSet(paths)); + if (nodeId == null) { + throw new NullPointerException("Node id is null"); + } + + return new RemoveRoomsByIds(nodeId, roomsIds.stream().map(o -> o.getValue()).collect(Collectors.toSet())); } } } 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 195ea65..cc26fa2 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 @@ -53,6 +53,8 @@ public class NodeRepositoryImpl implements NodeRepository { @Override public void removeNodesById(@NotNull RemoveNodesByIds data) { + if (data.getNodeIds().isEmpty()) return; + rest.query("/nodes", HttpMethod.DELETE, params -> { params.put("toDelete", String.join(",", data.getNodeIds())); }); diff --git a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/RoomRepositoryImpl.java b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/RoomRepositoryImpl.java index d2c1aeb..a70b7e9 100644 --- a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/RoomRepositoryImpl.java +++ b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/repository/RoomRepositoryImpl.java @@ -2,8 +2,12 @@ package ru.dragonestia.picker.api.impl.repository; import org.jetbrains.annotations.ApiStatus.Internal; import org.jetbrains.annotations.NotNull; +import ru.dragonestia.picker.api.exception.RoomNotFoundException; import ru.dragonestia.picker.api.impl.RoomPickerClient; +import ru.dragonestia.picker.api.impl.util.EnumUtils; import ru.dragonestia.picker.api.impl.util.RestTemplate; +import ru.dragonestia.picker.api.impl.util.type.HttpMethod; +import ru.dragonestia.picker.api.model.room.IRoom; import ru.dragonestia.picker.api.model.room.ResponseRoom; import ru.dragonestia.picker.api.model.room.RoomDefinition; import ru.dragonestia.picker.api.model.room.ShortResponseRoom; @@ -11,6 +15,8 @@ import ru.dragonestia.picker.api.repository.RoomRepository; import ru.dragonestia.picker.api.repository.request.room.FindRoomById; import ru.dragonestia.picker.api.repository.request.room.GetAllRooms; import ru.dragonestia.picker.api.repository.request.room.RemoveRoomsByIds; +import ru.dragonestia.picker.api.repository.response.RoomInfoResponse; +import ru.dragonestia.picker.api.repository.response.RoomListResponse; import ru.dragonestia.picker.api.repository.type.RoomPath; import java.util.List; @@ -27,26 +33,56 @@ public class RoomRepositoryImpl implements RoomRepository { @Override public void saveRoom(@NotNull RoomDefinition definition) { - throw new UnsupportedOperationException("Not implemented"); + rest.query("/nodes/" + definition.getNodeIdentifier() + "/rooms", HttpMethod.POST, params -> { + params.put("roomId", definition.getIdentifier()); + params.put("slots", Integer.toString(definition.getMaxSlots())); + params.put("payload", definition.getPayload()); + params.put("locked", Boolean.toString(definition.isLocked())); + params.put("persist", Boolean.toString(definition.isPersist())); + }); } @Override public void removeRooms(@NotNull RemoveRoomsByIds request) { - throw new UnsupportedOperationException("Not implemented"); + if (request.getRoomsIds().isEmpty()) return; + + rest.query("/nodes/" + request.getNodeId() + "/rooms", HttpMethod.DELETE, params -> { + params.put("toDelete", String.join(",", request.getRoomsIds())); + }); + } + + @Override + public void removeRoom(@NotNull IRoom room) { + rest.query( + "/nodes/%s/rooms/%s".formatted(room.getNodeIdentifier(), room.getIdentifier()), + HttpMethod.DELETE, + params -> {} + ); } @Override public @NotNull List allRooms(@NotNull GetAllRooms request) { - throw new UnsupportedOperationException("Not implemented"); + return rest.query("/nodes/" + request.getNodeId() + "/rooms", HttpMethod.GET, RoomListResponse.class, params -> { + params.put("requiredDetails", EnumUtils.enumSetToString(request.getDetails())); + }).rooms(); } @Override public @NotNull Optional find(@NotNull FindRoomById request) { - throw new UnsupportedOperationException("Not implemented"); + try { + var response = rest.query("/nodes/%s/rooms/%s".formatted(request.getNodeId(), request.getId()), HttpMethod.GET, RoomInfoResponse.class, params -> { + params.put("requiredDetails", EnumUtils.enumSetToString(request.getDetails())); + }); + return Optional.of(response.room()); + } catch (RoomNotFoundException ex) { + return Optional.empty(); + } } @Override public void lockRoom(@NotNull RoomPath path, boolean value) { - throw new UnsupportedOperationException("Not implemented"); + rest.query("/nodes/%s/rooms/%s/lock".formatted(path.getNodeId(), path.getRoomId()), HttpMethod.PUT, params -> { + params.put("newState", Boolean.toString(value)); + }); } }