diff --git a/src/main/java/dev/openfga/sdk/api/client/OpenFgaClient.java b/src/main/java/dev/openfga/sdk/api/client/OpenFgaClient.java index ddaa88f..e2995bd 100644 --- a/src/main/java/dev/openfga/sdk/api/client/OpenFgaClient.java +++ b/src/main/java/dev/openfga/sdk/api/client/OpenFgaClient.java @@ -409,6 +409,12 @@ private CompletableFuture writeTransactions( var deleteTransactions = chunksOf(chunkSize, request.getDeletes()).map(ClientWriteRequest::ofDeletes); var transactions = Stream.concat(writeTransactions, deleteTransactions).collect(Collectors.toList()); + + if (transactions.isEmpty()) { + var emptyTransaction = new ClientWriteRequest().writes(null).deletes(null); + return this.writeNonTransaction(storeId, emptyTransaction, writeOptions); + } + var futureResponse = this.writeNonTransaction(storeId, transactions.get(0), options); for (int i = 1; i < transactions.size(); i++) { diff --git a/src/test/java/dev/openfga/sdk/api/client/OpenFgaClientTest.java b/src/test/java/dev/openfga/sdk/api/client/OpenFgaClientTest.java index de99b39..4e8636f 100644 --- a/src/test/java/dev/openfga/sdk/api/client/OpenFgaClientTest.java +++ b/src/test/java/dev/openfga/sdk/api/client/OpenFgaClientTest.java @@ -25,6 +25,7 @@ import dev.openfga.sdk.errors.*; import java.net.http.HttpClient; import java.time.Duration; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.UUID; @@ -1370,6 +1371,25 @@ public void deleteTuplesTest() throws Exception { assertEquals(200, response.getStatusCode()); } + @Test + public void write_nothingSentWhenWritesAndDeletesAreEmpty() + throws FgaInvalidParameterException, ExecutionException, InterruptedException { + // Given + String postPath = String.format("https://localhost/stores/%s/write", DEFAULT_STORE_ID); + String expectedBody = String.format( + "{\"writes\":null,\"deletes\":null,\"authorization_model_id\":\"%s\"}", DEFAULT_AUTH_MODEL_ID); + mockHttpClient.onPost(postPath).withBody(is(expectedBody)).doReturn(200, EMPTY_RESPONSE_BODY); + + // When + var clientWriteRequest = + new ClientWriteRequest().writes(Collections.emptyList()).deletes(Collections.emptyList()); + var response = fga.write(clientWriteRequest).get(); + + // Then + mockHttpClient.verify().post(postPath).called(1); + assertEquals(200, response.getStatusCode()); + } + @Test public void write_storeIdRequired() { // Given