Implemented picking method in Client and refactored picking in server

This commit is contained in:
Andrey Terentev 2024-03-16 12:10:18 +07:00 committed by Andrey Terentev
parent 087c4fc517
commit 1bb4902134
4 changed files with 24 additions and 6 deletions

View File

@ -76,6 +76,10 @@ public class NodeRepositoryImpl implements NodeRepository {
@Override
public @NotNull PickedRoomResponse pickRoom(@NotNull NodeIdentifier identifier, @NotNull Set<UserIdentifier> 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())
);
}
}

View File

@ -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> T queryPostWithBody(String uri, Class<T> 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<String, String>();
paramsConsumer.accept(params);

View File

@ -77,7 +77,7 @@ public class NodeController {
@PostMapping("/{nodeId}/pick")
ResponseEntity<PickedRoomResponse> 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);

View File

@ -80,7 +80,7 @@ public class RoomServiceImpl implements RoomService {
@Override
public PickedRoomResponse pickAvailable(Node node, List<User> 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(