Skip to content

Commit 2a632db

Browse files
fix: correct update response type + URL-encode tenantId in getConfig
Backend returns {tenant_id, message} not full CircuitBreakerConfig. Added CircuitBreakerConfigUpdateResponse type. URL-encode tenantId in getCircuitBreakerConfig query parameter.
1 parent 499710b commit 2a632db

3 files changed

Lines changed: 56 additions & 24 deletions

File tree

src/main/java/com/getaxonflow/sdk/AxonFlow.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,7 @@ public CircuitBreakerConfig getCircuitBreakerConfig(String tenantId) {
755755
}
756756

757757
return retryExecutor.execute(() -> {
758-
String path = "/api/v1/circuit-breaker/config?tenant_id=" + tenantId;
758+
String path = "/api/v1/circuit-breaker/config?tenant_id=" + java.net.URLEncoder.encode(tenantId, java.nio.charset.StandardCharsets.UTF_8);
759759
Request httpRequest = buildOrchestratorRequest("GET", path, null);
760760
try (Response response = httpClient.newCall(httpRequest).execute()) {
761761
JsonNode node = parseResponseNode(response);
@@ -792,21 +792,21 @@ public CompletableFuture<CircuitBreakerConfig> getCircuitBreakerConfigAsync(Stri
792792
* }</pre>
793793
*
794794
* @param config the configuration update
795-
* @return the updated circuit breaker configuration
795+
* @return confirmation with tenant_id and message
796796
* @throws NullPointerException if config is null
797797
* @throws AxonFlowException if the request fails
798798
*/
799-
public CircuitBreakerConfig updateCircuitBreakerConfig(CircuitBreakerConfigUpdate config) {
799+
public CircuitBreakerConfigUpdateResponse updateCircuitBreakerConfig(CircuitBreakerConfigUpdate config) {
800800
Objects.requireNonNull(config, "config cannot be null");
801801

802802
return retryExecutor.execute(() -> {
803803
Request httpRequest = buildOrchestratorRequest("PUT", "/api/v1/circuit-breaker/config", config);
804804
try (Response response = httpClient.newCall(httpRequest).execute()) {
805805
JsonNode node = parseResponseNode(response);
806806
if (node.has("data") && node.get("data").isObject()) {
807-
return objectMapper.treeToValue(node.get("data"), CircuitBreakerConfig.class);
807+
return objectMapper.treeToValue(node.get("data"), CircuitBreakerConfigUpdateResponse.class);
808808
}
809-
return objectMapper.treeToValue(node, CircuitBreakerConfig.class);
809+
return objectMapper.treeToValue(node, CircuitBreakerConfigUpdateResponse.class);
810810
}
811811
}, "updateCircuitBreakerConfig");
812812
}
@@ -815,9 +815,9 @@ public CircuitBreakerConfig updateCircuitBreakerConfig(CircuitBreakerConfigUpdat
815815
* Asynchronously updates the circuit breaker configuration for a tenant.
816816
*
817817
* @param config the configuration update
818-
* @return a future containing the updated circuit breaker configuration
818+
* @return a future containing the update confirmation
819819
*/
820-
public CompletableFuture<CircuitBreakerConfig> updateCircuitBreakerConfigAsync(CircuitBreakerConfigUpdate config) {
820+
public CompletableFuture<CircuitBreakerConfigUpdateResponse> updateCircuitBreakerConfigAsync(CircuitBreakerConfigUpdate config) {
821821
return CompletableFuture.supplyAsync(() -> updateCircuitBreakerConfig(config), asyncExecutor);
822822
}
823823

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.getaxonflow.sdk.types;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
6+
/**
7+
* Response from updating circuit breaker configuration.
8+
*
9+
* <p>The backend returns a confirmation with tenant_id and message,
10+
* not the full config object.
11+
*/
12+
@JsonIgnoreProperties(ignoreUnknown = true)
13+
public final class CircuitBreakerConfigUpdateResponse {
14+
15+
@JsonProperty("tenant_id")
16+
private final String tenantId;
17+
18+
@JsonProperty("message")
19+
private final String message;
20+
21+
public CircuitBreakerConfigUpdateResponse(
22+
@JsonProperty("tenant_id") String tenantId,
23+
@JsonProperty("message") String message) {
24+
this.tenantId = tenantId;
25+
this.message = message;
26+
}
27+
28+
public String getTenantId() { return tenantId; }
29+
public String getMessage() { return message; }
30+
31+
@Override
32+
public String toString() {
33+
return "CircuitBreakerConfigUpdateResponse{tenantId='" + tenantId + "', message='" + message + "'}";
34+
}
35+
}

src/test/java/com/getaxonflow/sdk/CircuitBreakerTest.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ void shouldUpdateCircuitBreakerConfig() {
325325
.willReturn(aResponse()
326326
.withStatus(200)
327327
.withHeader("Content-Type", "application/json")
328-
.withBody("{\"success\":true,\"data\":{\"source\":\"tenant_override\",\"error_threshold\":10,\"violation_threshold\":5,\"window_seconds\":300,\"default_timeout_seconds\":60,\"max_timeout_seconds\":600,\"enable_auto_recovery\":true,\"tenant_id\":\"tenant_123\"}}")));
328+
.withBody("{\"success\":true,\"data\":{\"tenant_id\":\"tenant_123\",\"message\":\"Circuit breaker config updated for tenant\"}}")));
329329

330330
CircuitBreakerConfigUpdate update = CircuitBreakerConfigUpdate.builder()
331331
.tenantId("tenant_123")
@@ -337,13 +337,11 @@ void shouldUpdateCircuitBreakerConfig() {
337337
.enableAutoRecovery(true)
338338
.build();
339339

340-
CircuitBreakerConfig config = axonflow.updateCircuitBreakerConfig(update);
340+
CircuitBreakerConfigUpdateResponse result = axonflow.updateCircuitBreakerConfig(update);
341341

342-
assertThat(config).isNotNull();
343-
assertThat(config.getErrorThreshold()).isEqualTo(10);
344-
assertThat(config.getViolationThreshold()).isEqualTo(5);
345-
assertThat(config.isEnableAutoRecovery()).isTrue();
346-
assertThat(config.getTenantId()).isEqualTo("tenant_123");
342+
assertThat(result).isNotNull();
343+
assertThat(result.getTenantId()).isEqualTo("tenant_123");
344+
assertThat(result.getMessage()).isNotEmpty();
347345

348346
verify(putRequestedFor(urlEqualTo("/api/v1/circuit-breaker/config"))
349347
.withRequestBody(matchingJsonPath("$.tenant_id", equalTo("tenant_123")))
@@ -358,18 +356,17 @@ void shouldUpdateCircuitBreakerConfigPartial() {
358356
.willReturn(aResponse()
359357
.withStatus(200)
360358
.withHeader("Content-Type", "application/json")
361-
.withBody("{\"success\":true,\"data\":{\"source\":\"tenant_override\",\"error_threshold\":20,\"violation_threshold\":3,\"window_seconds\":60,\"default_timeout_seconds\":30,\"max_timeout_seconds\":300,\"enable_auto_recovery\":false,\"tenant_id\":\"tenant_456\"}}")));
359+
.withBody("{\"success\":true,\"data\":{\"tenant_id\":\"tenant_456\",\"message\":\"Circuit breaker config updated for tenant\"}}")));
362360

363361
CircuitBreakerConfigUpdate update = CircuitBreakerConfigUpdate.builder()
364362
.tenantId("tenant_456")
365363
.errorThreshold(20)
366364
.build();
367365

368-
CircuitBreakerConfig config = axonflow.updateCircuitBreakerConfig(update);
366+
CircuitBreakerConfigUpdateResponse result = axonflow.updateCircuitBreakerConfig(update);
369367

370-
assertThat(config).isNotNull();
371-
assertThat(config.getErrorThreshold()).isEqualTo(20);
372-
assertThat(config.getTenantId()).isEqualTo("tenant_456");
368+
assertThat(result).isNotNull();
369+
assertThat(result.getTenantId()).isEqualTo("tenant_456");
373370

374371
verify(putRequestedFor(urlEqualTo("/api/v1/circuit-breaker/config"))
375372
.withRequestBody(matchingJsonPath("$.tenant_id", equalTo("tenant_456")))
@@ -407,18 +404,18 @@ void updateCircuitBreakerConfigAsyncShouldReturnFuture() throws Exception {
407404
.willReturn(aResponse()
408405
.withStatus(200)
409406
.withHeader("Content-Type", "application/json")
410-
.withBody("{\"success\":true,\"data\":{\"source\":\"tenant_override\",\"error_threshold\":10,\"violation_threshold\":5,\"window_seconds\":300,\"default_timeout_seconds\":60,\"max_timeout_seconds\":600,\"enable_auto_recovery\":true,\"tenant_id\":\"tenant_async\"}}")));
407+
.withBody("{\"success\":true,\"data\":{\"tenant_id\":\"tenant_async\",\"message\":\"Circuit breaker config updated for tenant\"}}")));
411408

412409
CircuitBreakerConfigUpdate update = CircuitBreakerConfigUpdate.builder()
413410
.tenantId("tenant_async")
414411
.errorThreshold(10)
415412
.build();
416413

417-
CompletableFuture<CircuitBreakerConfig> future = axonflow.updateCircuitBreakerConfigAsync(update);
418-
CircuitBreakerConfig config = future.get();
414+
CompletableFuture<CircuitBreakerConfigUpdateResponse> future = axonflow.updateCircuitBreakerConfigAsync(update);
415+
CircuitBreakerConfigUpdateResponse result = future.get();
419416

420-
assertThat(config).isNotNull();
421-
assertThat(config.getTenantId()).isEqualTo("tenant_async");
417+
assertThat(result).isNotNull();
418+
assertThat(result.getTenantId()).isEqualTo("tenant_async");
422419
}
423420

424421
@Test

0 commit comments

Comments
 (0)