From 8f29d69eccf407779278965755d2d490104671bf Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Tue, 12 Mar 2024 02:55:00 +0700 Subject: [PATCH] Refactored RRoom to ResponseRoom --- .../ru/dragonestia/picker/model/Room.java | 13 +- .../picker/service/RoomService.java | 4 +- .../picker/service/UserService.java | 4 +- .../picker/service/impl/RoomServiceImpl.java | 6 +- .../picker/service/impl/UserServiceImpl.java | 6 +- .../picker/util/DetailsExtractor.java | 8 +- .../picker/api/model/node/ResponseNode.java | 2 +- .../picker/api/model/room/IRoom.java | 23 ++++ .../picker/api/model/room/ResponseRoom.java | 108 +++++++++++++++++ .../api/model/room/ShortResponseRoom.java | 103 ++++++++++++++++ .../picker/api/repository/RoomRepository.java | 17 +-- .../picker/api/repository/UserRepository.java | 13 +- .../response/LinkedRoomsWithUserResponse.java | 4 +- .../repository/response/RoomInfoResponse.java | 4 +- .../repository/response/RoomListResponse.java | 4 +- .../api/repository/response/type/RRoom.java | 112 ------------------ 16 files changed, 277 insertions(+), 154 deletions(-) create mode 100644 client-api/src/main/java/ru/dragonestia/picker/api/model/room/ResponseRoom.java create mode 100644 client-api/src/main/java/ru/dragonestia/picker/api/model/room/ShortResponseRoom.java delete mode 100644 client-api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RRoom.java 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 85b7e18..5f7773a 100644 --- a/app/src/main/java/ru/dragonestia/picker/model/Room.java +++ b/app/src/main/java/ru/dragonestia/picker/model/Room.java @@ -3,7 +3,8 @@ 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.api.model.room.ResponseRoom; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import ru.dragonestia.picker.model.type.SlotLimit; import java.util.HashMap; @@ -48,13 +49,11 @@ public class Room { return false; } - public RRoom toResponseObject() { - var result = new RRoom(id, nodeId, slots.getSlots(), payload); - result.setLocked(locked); - return result; + public ResponseRoom toResponseObject() { + return new ResponseRoom(id, nodeId, slots.getSlots(), locked, payload); } - public RRoom.Short toShortResponseObject() { - return new RRoom.Short(id, nodeId, slots.getSlots(), locked, new HashMap<>()); + public ShortResponseRoom toShortResponseObject() { + return new ShortResponseRoom(id, nodeId, slots.getSlots(), locked); } } 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 d8a1be8..921f9ba 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/RoomService.java +++ b/app/src/main/java/ru/dragonestia/picker/service/RoomService.java @@ -3,7 +3,7 @@ package ru.dragonestia.picker.service; 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.repository.response.type.RRoom; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.User; @@ -22,7 +22,7 @@ public interface RoomService { List all(Node node); - List getAllRoomsWithDetailsResponse(Node node, Set details); + List getAllRoomsWithDetailsResponse(Node node, Set details); Room pickAvailable(Node node, List users); 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 952c09c..8751bc6 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/UserService.java +++ b/app/src/main/java/ru/dragonestia/picker/service/UserService.java @@ -2,8 +2,8 @@ package ru.dragonestia.picker.service; import ru.dragonestia.picker.api.exception.RoomAreFullException; import ru.dragonestia.picker.api.model.room.RoomDetails; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import ru.dragonestia.picker.api.model.user.UserDetails; -import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; @@ -16,7 +16,7 @@ public interface UserService { List getUserRooms(User user); - List getUserRoomsWithDetails(User user, Set details); + List getUserRoomsWithDetails(User user, Set details); int linkUsersWithRoom(Room room, Collection users, boolean force) throws RoomAreFullException; 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 44568c8..f387c49 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 @@ -8,7 +8,7 @@ import ru.dragonestia.picker.api.exception.NodeNotFoundException; 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.repository.response.type.RRoom; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.User; @@ -65,8 +65,8 @@ public class RoomServiceImpl implements RoomService { } @Override - public List getAllRoomsWithDetailsResponse(Node node, Set details) { - var response = new LinkedList(); + public List getAllRoomsWithDetailsResponse(Node node, Set details) { + var response = new LinkedList(); for (var room: all(node)) { response.add(detailsExtractor.extract(room, details)); } 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 362fd8d..a6f42ab 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 @@ -3,8 +3,8 @@ package ru.dragonestia.picker.service.impl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import ru.dragonestia.picker.api.model.room.RoomDetails; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import ru.dragonestia.picker.api.model.user.UserDetails; -import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; @@ -27,8 +27,8 @@ public class UserServiceImpl implements UserService { } @Override - public List getUserRoomsWithDetails(User user, Set details) { - var result = new LinkedList(); + public List getUserRoomsWithDetails(User user, Set details) { + var result = new LinkedList(); for (var room: getUserRooms(user)) { result.add(detailsExtractor.extract(room, details)); } diff --git a/app/src/main/java/ru/dragonestia/picker/util/DetailsExtractor.java b/app/src/main/java/ru/dragonestia/picker/util/DetailsExtractor.java index 71e4aa7..860b0e6 100644 --- a/app/src/main/java/ru/dragonestia/picker/util/DetailsExtractor.java +++ b/app/src/main/java/ru/dragonestia/picker/util/DetailsExtractor.java @@ -5,8 +5,8 @@ import org.springframework.stereotype.Component; import ru.dragonestia.picker.api.model.node.NodeDetails; import ru.dragonestia.picker.api.model.node.ResponseNode; import ru.dragonestia.picker.api.model.room.RoomDetails; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import ru.dragonestia.picker.api.model.user.UserDetails; -import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.Room; @@ -38,18 +38,18 @@ public class DetailsExtractor { return response; } - public RRoom.Short extract(Room room, Set details) { + public ShortResponseRoom extract(Room room, Set details) { var response = room.toShortResponseObject(); for (var detail: details) { if (detail == RoomDetails.COUNT_USERS) { var users = Integer.toString(userRepository.usersOf(room).size()); - response.details().put(RoomDetails.COUNT_USERS, users); + response.putDetail(RoomDetails.COUNT_USERS, users); continue; } if (detail == RoomDetails.PERSIST) { - response.details().put(RoomDetails.PERSIST, Boolean.toString(room.isPersist())); + response.putDetail(RoomDetails.PERSIST, Boolean.toString(room.isPersist())); continue; } } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/model/node/ResponseNode.java b/client-api/src/main/java/ru/dragonestia/picker/api/model/node/ResponseNode.java index 8bcee10..c0e8fb9 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/model/node/ResponseNode.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/model/node/ResponseNode.java @@ -71,6 +71,6 @@ public class ResponseNode implements INode { @Override public String toString() { - return "[NodeDefinition id='%s' pickingMethod=%s]".formatted(id, method); + return "[ResponseNode id='%s' pickingMethod=%s]".formatted(id, method); } } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/model/room/IRoom.java b/client-api/src/main/java/ru/dragonestia/picker/api/model/room/IRoom.java index 6e92a7a..e8cea80 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/model/room/IRoom.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/model/room/IRoom.java @@ -1,4 +1,27 @@ package ru.dragonestia.picker.api.model.room; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + public interface IRoom { + + int UNLIMITED_SLOTS = -1; + + @NotNull String getIdentifier(); + + @NotNull String getNodeIdentifier(); + + int getMaxSlots(); + + default boolean hasUnlimitedSlots() { + return getMaxSlots() == UNLIMITED_SLOTS; + } + + boolean isLocked(); + + @Nullable Boolean isPersist(); + + @Nullable String getPayload(); + + @Nullable String getDetail(@NotNull RoomDetails detail); } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/model/room/ResponseRoom.java b/client-api/src/main/java/ru/dragonestia/picker/api/model/room/ResponseRoom.java new file mode 100644 index 0000000..0ad0295 --- /dev/null +++ b/client-api/src/main/java/ru/dragonestia/picker/api/model/room/ResponseRoom.java @@ -0,0 +1,108 @@ +package ru.dragonestia.picker.api.model.room; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.beans.Transient; +import java.util.HashMap; +import java.util.Map; + +@Schema(title = "Room") +public class ResponseRoom implements IRoom { + + @Schema(description = "Room identifier", example = "test-room") + private String id; + + @Schema(description = "Node identifier", example = "test-node") + private String nodeId; + + @Schema(description = "Slots for users. -1 - unlimited slots", example = "25") + private int slots; + + @Schema(description = "Does picking skip this room?") + private boolean locked; + + @Schema(description = "Payload. Some data") + private String payload; + + @Schema(description = "Additional data requested (Key-Value)") + private Map details; + + public ResponseRoom() {} + + public ResponseRoom(@NotNull String id, @NotNull String nodeId, int slots, boolean locked, @NotNull String payload) { + this.id = id; + this.nodeId = nodeId; + this.slots = slots; + this.locked = locked; + this.payload = payload; + details = new HashMap<>(); + } + + @Override + public @NotNull String getIdentifier() { + return id; + } + + @Override + public @NotNull String getNodeIdentifier() { + return nodeId; + } + + @Override + public int getMaxSlots() { + return slots; + } + + @Override + public boolean isLocked() { + return locked; + } + + @Override + public @Nullable Boolean isPersist() { + var val = getDetail(RoomDetails.PERSIST); + return val == null? null : "true".equals(val); + } + + @Override + public @Nullable String getPayload() { + return payload; + } + + @Transient + @Override + public boolean hasUnlimitedSlots() { + return IRoom.super.hasUnlimitedSlots(); + } + + @Override + public @Nullable String getDetail(@NotNull RoomDetails detail) { + return details.get(detail); + } + + public void putDetail(@NotNull RoomDetails detail, @NotNull String value) { + details.put(detail, value); + } + + @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 ResponseRoom other) { + return id.equals(other.id); + } + return false; + } + + @Override + public String toString() { + return "[ResponseRoom id='%s' nodeId='%s' slots=%s payload.len=%s]".formatted(id, nodeId, slots, payload.length()); + } +} diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/model/room/ShortResponseRoom.java b/client-api/src/main/java/ru/dragonestia/picker/api/model/room/ShortResponseRoom.java new file mode 100644 index 0000000..375f7c1 --- /dev/null +++ b/client-api/src/main/java/ru/dragonestia/picker/api/model/room/ShortResponseRoom.java @@ -0,0 +1,103 @@ +package ru.dragonestia.picker.api.model.room; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.beans.Transient; +import java.util.HashMap; +import java.util.Map; + +@Schema(title = "Room (Short)") +public class ShortResponseRoom implements IRoom { + + @Schema(description = "Room identifier", example = "test-room") + private String id; + + @Schema(description = "Node identifier", example = "test-node") + private String nodeId; + + @Schema(description = "Slots for users. -1 - unlimited slots", example = "25") + private int slots; + + @Schema(description = "Does picking skip this room?") + private boolean locked; + + @Schema(description = "Additional data requested (Key-Value)") + private Map details; + + public ShortResponseRoom() {} + + public ShortResponseRoom(String id, String nodeId, int slots, boolean locked) { + this.id = id; + this.nodeId = nodeId; + this.slots = slots; + this.locked = locked; + this.details = new HashMap<>(); + } + + @Override + public @NotNull String getIdentifier() { + return id; + } + + @Override + public @NotNull String getNodeIdentifier() { + return nodeId; + } + + @Override + public int getMaxSlots() { + return slots; + } + + @Override + public boolean isLocked() { + return locked; + } + + @Override + public @Nullable Boolean isPersist() { + return null; + } + + @Override + public @Nullable String getPayload() { + return null; + } + + @Transient + @Override + public boolean hasUnlimitedSlots() { + return IRoom.super.hasUnlimitedSlots(); + } + + @Override + public @Nullable String getDetail(@NotNull RoomDetails detail) { + return details.get(detail); + } + + public void putDetail(@NotNull RoomDetails detail, @NotNull String value) { + details.put(detail, value); + } + + @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 ShortResponseRoom other) { + return id.equals(other.id); + } + return false; + } + + @Override + public String toString() { + return "[ShortResponseRoom id='%s' nodeId='%s' slots=%s]".formatted(id, nodeId, slots); + } +} 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 b9dd97f..ad77cc0 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 @@ -2,8 +2,9 @@ package ru.dragonestia.picker.api.repository; import ru.dragonestia.picker.api.exception.*; import ru.dragonestia.picker.api.model.node.ResponseNode; +import ru.dragonestia.picker.api.model.room.ResponseRoom; import ru.dragonestia.picker.api.model.room.RoomDetails; -import ru.dragonestia.picker.api.repository.response.type.RRoom; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import java.util.List; import java.util.Optional; @@ -13,19 +14,19 @@ public interface RoomRepository { Set ALL_DETAILS = Set.of(RoomDetails.COUNT_USERS, RoomDetails.PERSIST); - void register(RRoom room, boolean persist) throws NodeNotFoundException, InvalidRoomIdentifierException, RoomAlreadyExistException; + void register(ResponseRoom room, boolean persist) throws NodeNotFoundException, InvalidRoomIdentifierException, RoomAlreadyExistException; - void remove(RRoom room) throws NodeNotFoundException; + void remove(ResponseRoom room) throws NodeNotFoundException; - void remove(ResponseNode node, RRoom.Short room) throws NodeNotFoundException; + void remove(ResponseNode node, ShortResponseRoom room) throws NodeNotFoundException; - default List all(ResponseNode node) throws NodeNotFoundException { + default List all(ResponseNode node) throws NodeNotFoundException { return all(node, Set.of()); } - List all(ResponseNode node, Set details) throws NodeNotFoundException; + List all(ResponseNode node, Set details) throws NodeNotFoundException; - Optional find(ResponseNode node, String roomId) throws NodeNotFoundException; + Optional find(ResponseNode node, String roomId) throws NodeNotFoundException; - void lock(RRoom room, boolean value) throws NodeNotFoundException, RoomNotFoundException; + void lock(ResponseRoom room, boolean value) throws NodeNotFoundException, RoomNotFoundException; } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java index a69047a..3db542e 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java @@ -3,9 +3,10 @@ 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.ResponseRoom; import ru.dragonestia.picker.api.model.room.RoomDetails; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import ru.dragonestia.picker.api.model.user.UserDetails; -import ru.dragonestia.picker.api.repository.response.type.RRoom; import ru.dragonestia.picker.api.repository.response.type.RUser; import java.util.Collection; @@ -16,19 +17,19 @@ public interface UserRepository { Set ALL_DETAILS = Set.of(UserDetails.COUNT_ROOMS); - void linkWithRoom(RRoom room, Collection users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException; + void linkWithRoom(ResponseRoom room, Collection users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException; - void unlinkFromRoom(RRoom room, Collection users) throws NodeNotFoundException, RoomNotFoundException; + void unlinkFromRoom(ResponseRoom room, Collection users) throws NodeNotFoundException, RoomNotFoundException; - default List all(RRoom room) throws NodeNotFoundException, RoomNotFoundException { + default List all(ResponseRoom room) throws NodeNotFoundException, RoomNotFoundException { return all(room, Set.of()); } - List all(RRoom room, Set details) throws NodeNotFoundException, RoomNotFoundException; + List all(ResponseRoom room, Set details) throws NodeNotFoundException, RoomNotFoundException; List search(String input, Set details); RUser find(String userId, Set details); - List getLinkedRoomsWithUsers(RUser user, Set roomDetails); + List getLinkedRoomsWithUsers(RUser user, Set roomDetails); } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/LinkedRoomsWithUserResponse.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/LinkedRoomsWithUserResponse.java index 6b5e7b7..d497e8e 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/LinkedRoomsWithUserResponse.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/LinkedRoomsWithUserResponse.java @@ -1,9 +1,9 @@ package ru.dragonestia.picker.api.repository.response; import io.swagger.v3.oas.annotations.media.Schema; -import ru.dragonestia.picker.api.repository.response.type.RRoom; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import java.util.List; @Schema(title = "Linked rooms with user", hidden = true) -public record LinkedRoomsWithUserResponse(List rooms) {} +public record LinkedRoomsWithUserResponse(List rooms) {} diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomInfoResponse.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomInfoResponse.java index c3ec645..bc27517 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomInfoResponse.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomInfoResponse.java @@ -1,7 +1,7 @@ package ru.dragonestia.picker.api.repository.response; import io.swagger.v3.oas.annotations.media.Schema; -import ru.dragonestia.picker.api.repository.response.type.RRoom; +import ru.dragonestia.picker.api.model.room.ResponseRoom; @Schema(title = "Room info", hidden = true) -public record RoomInfoResponse(RRoom room) {} +public record RoomInfoResponse(ResponseRoom room) {} diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomListResponse.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomListResponse.java index 097dcae..69d6b76 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomListResponse.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomListResponse.java @@ -1,12 +1,12 @@ package ru.dragonestia.picker.api.repository.response; import io.swagger.v3.oas.annotations.media.Schema; -import ru.dragonestia.picker.api.repository.response.type.RRoom; +import ru.dragonestia.picker.api.model.room.ShortResponseRoom; import java.util.List; @Schema(title = "Room list", hidden = true) public record RoomListResponse( @Schema(description = "Node identifier", example = "test-node") String node, - List rooms + List rooms ) {} diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RRoom.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RRoom.java deleted file mode 100644 index 02848a2..0000000 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RRoom.java +++ /dev/null @@ -1,112 +0,0 @@ -package ru.dragonestia.picker.api.repository.response.type; - -import io.swagger.v3.oas.annotations.media.Schema; -import ru.dragonestia.picker.api.model.node.ResponseNode; -import ru.dragonestia.picker.api.model.room.RoomDetails; - -import java.beans.Transient; -import java.util.HashMap; -import java.util.Map; - -@Schema(title = "Room") -public class RRoom { - - public final static int INFINITE_SLOTS = -1; - - @Schema(description = "Room identifier", example = "test-room") - private String id; - - @Schema(description = "Node identifier", example = "test-node") - private String nodeId; - - @Schema(description = "Slots for users. -1 - unlimited slots", example = "25") - private int slots; - - @Schema(description = "Payload. Some data") - private String payload; - - @Schema(description = "Does picking skip this room?") - private boolean locked = false; - - @Schema(description = "Additional data requested (Key-Value)") - private Map details; - - private RRoom() {} - - 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 RRoom(String id, ResponseNode node, int limit, String payload) { - this(id, node.getIdentifier(), limit, payload); - } - - public String getId() { - return id; - } - - public String getNodeId() { - return nodeId; - } - - public int getSlots() { - return slots; - } - - public String getPayload() { - return payload; - } - - public boolean isLocked() { - return locked; - } - - public void setLocked(boolean value) { - locked = value; - } - - @Transient - public boolean isUnlimited() { - 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(); - } - - @Override - public boolean equals(Object object) { - if (object == this) return true; - if (object == null) return false; - if (object instanceof RRoom other) { - return id.equals(other.id); - } - return false; - } - - @Schema(title = "Room (Short)") - public record Short( - @Schema(description = "Room identifier", example = "test-room") String id, - @Schema(description = "Node identifier", example = "test-node") String nodeId, - @Schema(description = "Slots for users. -1 - unlimited slots", example = "25") int slots, - @Schema(description = "Does picking skip this room?") boolean locked, - @Schema(description = "Additional data requested (Key-Value)") Map details - ) {} -}