Refactored picked room response and updated client NodeRepository

This commit is contained in:
Andrey Terentev 2024-03-12 22:00:28 +07:00 committed by Andrey Terentev
parent 475191de79
commit fb06655d89
6 changed files with 54 additions and 6 deletions

View File

@ -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.FindNodeById;
import ru.dragonestia.picker.api.repository.request.node.GetAllNodes; import ru.dragonestia.picker.api.repository.request.node.GetAllNodes;
import ru.dragonestia.picker.api.repository.request.node.RemoveNodesByIds; 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.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
public interface NodeRepository { public interface NodeRepository {
@ -21,4 +25,6 @@ public interface NodeRepository {
void removeNode(@NotNull INode node); void removeNode(@NotNull INode node);
void saveNode(@NotNull NodeDefinition definition); void saveNode(@NotNull NodeDefinition definition);
@NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set<UserIdentifier> users);
} }

View File

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

View File

@ -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.FindNodeById;
import ru.dragonestia.picker.api.repository.request.node.GetAllNodes; import ru.dragonestia.picker.api.repository.request.node.GetAllNodes;
import ru.dragonestia.picker.api.repository.request.node.RemoveNodesByIds; 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.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
public class NodeRepositoryImpl implements NodeRepository { public class NodeRepositoryImpl implements NodeRepository {
@ -47,4 +51,9 @@ public class NodeRepositoryImpl implements NodeRepository {
public void saveNode(@NotNull NodeDefinition definition) { public void saveNode(@NotNull NodeDefinition definition) {
throw new UnsupportedOperationException("Not implemented"); throw new UnsupportedOperationException("Not implemented");
} }
@Override
public @NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set<UserIdentifier> users) {
throw new UnsupportedOperationException("Not implemented");
}
} }

View File

@ -10,6 +10,7 @@ import ru.dragonestia.picker.api.exception.NodeNotFoundException;
import ru.dragonestia.picker.api.model.node.PickingMethod; import ru.dragonestia.picker.api.model.node.PickingMethod;
import ru.dragonestia.picker.api.repository.response.NodeDetailsResponse; import ru.dragonestia.picker.api.repository.response.NodeDetailsResponse;
import ru.dragonestia.picker.api.repository.response.NodeListResponse; 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.model.Node;
import ru.dragonestia.picker.service.NodeService; import ru.dragonestia.picker.service.NodeService;
import ru.dragonestia.picker.service.RoomService; import ru.dragonestia.picker.service.RoomService;
@ -73,7 +74,7 @@ public class NodeController {
@Operation(summary = "Pick node for users") @Operation(summary = "Pick node for users")
@PostMapping("/{nodeId}/pick") @PostMapping("/{nodeId}/pick")
ResponseEntity<?> pickRoom( ResponseEntity<PickedRoomResponse> pickRoom(
@Parameter(description = "Node identifier") @PathVariable("nodeId") String nodeId, @Parameter(description = "Node identifier") @PathVariable("nodeId") String nodeId,
@Parameter(description = "Users to add", example = "user1,user3,user3") @RequestParam(name = "userIds") String userIds @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 node = nodeService.find(nodeId).orElseThrow(() -> new NodeNotFoundException(nodeId));
var users = namingValidator.validateUserIds(Arrays.stream(userIds.split(",")).toList()); 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);
} }
} }

View File

@ -4,6 +4,7 @@ import ru.dragonestia.picker.api.exception.InvalidRoomIdentifierException;
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException; import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
import ru.dragonestia.picker.api.model.room.RoomDetails; import ru.dragonestia.picker.api.model.room.RoomDetails;
import ru.dragonestia.picker.api.model.room.ShortResponseRoom; 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.Room;
import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.Node;
import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.model.User;
@ -24,7 +25,7 @@ public interface RoomService {
List<ShortResponseRoom> getAllRoomsWithDetailsResponse(Node node, Set<RoomDetails> details); List<ShortResponseRoom> getAllRoomsWithDetailsResponse(Node node, Set<RoomDetails> details);
Room pickAvailable(Node node, List<User> users); PickedRoomResponse pickAvailable(Node node, List<User> users);
void updateState(Room room); void updateState(Room room);
} }

View File

@ -9,11 +9,13 @@ import ru.dragonestia.picker.api.exception.NotPersistedNodeException;
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException; import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
import ru.dragonestia.picker.api.model.room.RoomDetails; import ru.dragonestia.picker.api.model.room.RoomDetails;
import ru.dragonestia.picker.api.model.room.ShortResponseRoom; 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.Room;
import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.Node;
import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.model.User;
import ru.dragonestia.picker.repository.NodeRepository; import ru.dragonestia.picker.repository.NodeRepository;
import ru.dragonestia.picker.repository.RoomRepository; import ru.dragonestia.picker.repository.RoomRepository;
import ru.dragonestia.picker.repository.UserRepository;
import ru.dragonestia.picker.service.RoomService; import ru.dragonestia.picker.service.RoomService;
import ru.dragonestia.picker.storage.NodeAndRoomStorage; import ru.dragonestia.picker.storage.NodeAndRoomStorage;
import ru.dragonestia.picker.util.DetailsExtractor; import ru.dragonestia.picker.util.DetailsExtractor;
@ -23,6 +25,7 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
@Log4j2 @Log4j2
@Service @Service
@ -31,6 +34,7 @@ public class RoomServiceImpl implements RoomService {
private final RoomRepository roomRepository; private final RoomRepository roomRepository;
private final NodeRepository nodeRepository; private final NodeRepository nodeRepository;
private final UserRepository userRepository;
private final DetailsExtractor detailsExtractor; private final DetailsExtractor detailsExtractor;
private final NamingValidator namingValidator; private final NamingValidator namingValidator;
private final NodeAndRoomStorage storage; private final NodeAndRoomStorage storage;
@ -74,9 +78,20 @@ public class RoomServiceImpl implements RoomService {
} }
@Override @Override
public Room pickAvailable(Node node, List<User> users) { public PickedRoomResponse pickAvailable(Node node, List<User> users) {
return roomRepository.pickFree(node, users) var room = roomRepository.pickFree(node, users)
.orElseThrow(() -> new RuntimeException("There are no rooms available")); .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 @Override