Refactored RRoom to ResponseRoom

This commit is contained in:
Andrey Terentev 2024-03-12 02:55:00 +07:00 committed by Andrey Terentev
parent ef37fa0223
commit 8f29d69ecc
16 changed files with 277 additions and 154 deletions

View File

@ -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);
}
}

View File

@ -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<Room> all(Node node);
List<RRoom.Short> getAllRoomsWithDetailsResponse(Node node, Set<RoomDetails> details);
List<ShortResponseRoom> getAllRoomsWithDetailsResponse(Node node, Set<RoomDetails> details);
Room pickAvailable(Node node, List<User> users);

View File

@ -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<Room> getUserRooms(User user);
List<RRoom.Short> getUserRoomsWithDetails(User user, Set<RoomDetails> details);
List<ShortResponseRoom> getUserRoomsWithDetails(User user, Set<RoomDetails> details);
int linkUsersWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException;

View File

@ -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<RRoom.Short> getAllRoomsWithDetailsResponse(Node node, Set<RoomDetails> details) {
var response = new LinkedList<RRoom.Short>();
public List<ShortResponseRoom> getAllRoomsWithDetailsResponse(Node node, Set<RoomDetails> details) {
var response = new LinkedList<ShortResponseRoom>();
for (var room: all(node)) {
response.add(detailsExtractor.extract(room, details));
}

View File

@ -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<RRoom.Short> getUserRoomsWithDetails(User user, Set<RoomDetails> details) {
var result = new LinkedList<RRoom.Short>();
public List<ShortResponseRoom> getUserRoomsWithDetails(User user, Set<RoomDetails> details) {
var result = new LinkedList<ShortResponseRoom>();
for (var room: getUserRooms(user)) {
result.add(detailsExtractor.extract(room, details));
}

View File

@ -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<RoomDetails> details) {
public ShortResponseRoom extract(Room room, Set<RoomDetails> 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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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<RoomDetails, String> 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());
}
}

View File

@ -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<RoomDetails, String> 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);
}
}

View File

@ -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<RoomDetails> 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<RRoom.Short> all(ResponseNode node) throws NodeNotFoundException {
default List<ShortResponseRoom> all(ResponseNode node) throws NodeNotFoundException {
return all(node, Set.of());
}
List<RRoom.Short> all(ResponseNode node, Set<RoomDetails> details) throws NodeNotFoundException;
List<ShortResponseRoom> all(ResponseNode node, Set<RoomDetails> details) throws NodeNotFoundException;
Optional<RRoom> find(ResponseNode node, String roomId) throws NodeNotFoundException;
Optional<ResponseRoom> 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;
}

View File

@ -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<UserDetails> ALL_DETAILS = Set.of(UserDetails.COUNT_ROOMS);
void linkWithRoom(RRoom room, Collection<RUser> users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException;
void linkWithRoom(ResponseRoom room, Collection<RUser> users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException;
void unlinkFromRoom(RRoom room, Collection<RUser> users) throws NodeNotFoundException, RoomNotFoundException;
void unlinkFromRoom(ResponseRoom room, Collection<RUser> users) throws NodeNotFoundException, RoomNotFoundException;
default List<RUser> all(RRoom room) throws NodeNotFoundException, RoomNotFoundException {
default List<RUser> all(ResponseRoom room) throws NodeNotFoundException, RoomNotFoundException {
return all(room, Set.of());
}
List<RUser> all(RRoom room, Set<UserDetails> details) throws NodeNotFoundException, RoomNotFoundException;
List<RUser> all(ResponseRoom room, Set<UserDetails> details) throws NodeNotFoundException, RoomNotFoundException;
List<RUser> search(String input, Set<UserDetails> details);
RUser find(String userId, Set<UserDetails> details);
List<RRoom.Short> getLinkedRoomsWithUsers(RUser user, Set<RoomDetails> roomDetails);
List<ShortResponseRoom> getLinkedRoomsWithUsers(RUser user, Set<RoomDetails> roomDetails);
}

View File

@ -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<RRoom.Short> rooms) {}
public record LinkedRoomsWithUserResponse(List<ShortResponseRoom> rooms) {}

View File

@ -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) {}

View File

@ -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<RRoom.Short> rooms
List<ShortResponseRoom> rooms
) {}

View File

@ -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<RoomDetails, String> 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<RoomDetails, String> 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<RoomDetails, String> details
) {}
}