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 08034a3..2c195b3 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 @@ -76,6 +76,10 @@ public class NodeRepositoryImpl implements NodeRepository { @Override public @NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set users) { - throw new UnsupportedOperationException("Not implemented"); + return rest.queryPostWithBody( + "/nodes/" + identifier.getValue() + "/pick", + PickedRoomResponse.class, + params -> {}, String.join(",", users.stream().map(user -> user.getValue()).toList()) + ); } } diff --git a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/util/RestTemplate.java b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/util/RestTemplate.java index 4d1dbbe..9e440be 100644 --- a/client-impl/src/main/java/ru/dragonestia/picker/api/impl/util/RestTemplate.java +++ b/client-impl/src/main/java/ru/dragonestia/picker/api/impl/util/RestTemplate.java @@ -3,9 +3,7 @@ package ru.dragonestia.picker.api.impl.util; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import okhttp3.FormBody; -import okhttp3.OkHttpClient; -import okhttp3.Response; +import okhttp3.*; import org.jetbrains.annotations.ApiStatus.Internal; import ru.dragonestia.picker.api.exception.ExceptionFactory; import ru.dragonestia.picker.api.impl.RoomPickerClient; @@ -78,6 +76,22 @@ public class RestTemplate { } } + public T queryPostWithBody(String uri, Class clazz, ParamsConsumer paramsConsumer, String body) { + var request = client.prepareRequestBuilder(uri + queryEncode(paramsConsumer)) + .post(RequestBody.create(body, MediaType.get("text/plain"))) + .build(); + + try (var response = httpClient.newCall(request).execute()) { + checkResponseForErrors(response); + + return json.readValue(new String(Objects.requireNonNull(response.body()).bytes(), StandardCharsets.UTF_8), clazz); + } catch (JsonProcessingException ex) { + throw new RuntimeException("Json processing error", ex); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + private String queryEncode(ParamsConsumer paramsConsumer) { var params = new HashMap(); paramsConsumer.accept(params); 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 c72a527..8bdd6b7 100644 --- a/server/src/main/java/ru/dragonestia/picker/controller/NodeController.java +++ b/server/src/main/java/ru/dragonestia/picker/controller/NodeController.java @@ -77,7 +77,7 @@ public class NodeController { @PostMapping("/{nodeId}/pick") ResponseEntity pickRoom( @Parameter(description = "Node identifier") @PathVariable("nodeId") String nodeId, - @Parameter(description = "Users to add", example = "user1,user3,user3") @RequestParam(name = "userIds") String userIds + @RequestBody String userIds ) { namingValidator.validateNodeId(nodeId); 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 af05a0f..eccfe3d 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 @@ -80,7 +80,7 @@ public class RoomServiceImpl implements RoomService { @Override public PickedRoomResponse pickAvailable(Node node, List users) { var room = roomRepository.pickFree(node, users) - .orElseThrow(() -> new RuntimeException("There are no rooms available")); + .orElseThrow(() -> new RuntimeException("There are no rooms available. Given users count: " + users.size())); var roomUsers = userRepository.usersOf(room); return new PickedRoomResponse(