diff --git a/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java b/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java index 57b3c1851..bf2cf7a43 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java @@ -2317,6 +2317,14 @@ public static FormBody.Builder toForm(FilesCompleteUploadExternalRequest req) { } setIfNotNull("initial_comment", req.getInitialComment(), form); setIfNotNull("thread_ts", req.getThreadTs(), form); + if (req.getBlocksAsString() != null) { + form.add("blocks", req.getBlocksAsString()); + } else if (req.getBlocks() != null) { + form.add("blocks", getJsonWithGsonAnonymInnerClassHandling(req.getBlocks())); + } + if (req.getBlocksAsString() != null && req.getBlocks() != null) { + log.warn("Although you set both blocksAsString and blocks, only blocksAsString was used."); + } return form; } diff --git a/slack-api-client/src/main/java/com/slack/api/methods/impl/FilesUploadV2Helper.java b/slack-api-client/src/main/java/com/slack/api/methods/impl/FilesUploadV2Helper.java index 7c805c9b5..b1ba227cd 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/impl/FilesUploadV2Helper.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/impl/FilesUploadV2Helper.java @@ -97,6 +97,8 @@ public FilesUploadV2Response completeUploads( .channels(v2Request.getChannels()) .initialComment(v2Request.getInitialComment()) .threadTs(v2Request.getThreadTs()) + .blocks(v2Request.getBlocks()) + .blocksAsString(v2Request.getBlocksAsString()) ); underlyingException.setCompleteResponse(response); if (!response.isOk()) { diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/files/FilesCompleteUploadExternalRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/files/FilesCompleteUploadExternalRequest.java index 837cd4c6b..fa00c142b 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/request/files/FilesCompleteUploadExternalRequest.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/files/FilesCompleteUploadExternalRequest.java @@ -1,6 +1,7 @@ package com.slack.api.methods.request.files; import com.slack.api.methods.SlackApiRequest; +import com.slack.api.model.block.LayoutBlock; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -46,6 +47,18 @@ public class FilesCompleteUploadExternalRequest implements SlackApiRequest { */ private String threadTs; + /** + * A JSON-based array of structured blocks, presented as a URL-encoded string. + * If initialComment is provided, this field is ignored. + */ + private List blocks; + + /** + * A JSON-based array of structured blocks as a String, presented as a URL-encoded string. + * If initialComment is provided, this field is ignored. + */ + private String blocksAsString; + @Data @Builder @NoArgsConstructor diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/files/FilesUploadV2Request.java b/slack-api-client/src/main/java/com/slack/api/methods/request/files/FilesUploadV2Request.java index 33be36995..c4e41de0f 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/request/files/FilesUploadV2Request.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/files/FilesUploadV2Request.java @@ -1,6 +1,7 @@ package com.slack.api.methods.request.files; import com.slack.api.methods.SlackApiRequest; +import com.slack.api.model.block.LayoutBlock; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -150,4 +151,16 @@ public static class UploadFile { */ private String threadTs; + /** + * A JSON-based array of structured blocks, presented as a URL-encoded string. + * If initialComment is provided, this field is ignored. + */ + private List blocks; + + /** + * A JSON-based array of structured blocks as a String, presented as a URL-encoded string. + * If initialComment is provided, this field is ignored. + */ + private String blocksAsString; + } diff --git a/slack-api-client/src/test/java/test_locally/api/methods/FilesUploadV2HelperTest.java b/slack-api-client/src/test/java/test_locally/api/methods/FilesUploadV2HelperTest.java new file mode 100644 index 000000000..84a4d35f0 --- /dev/null +++ b/slack-api-client/src/test/java/test_locally/api/methods/FilesUploadV2HelperTest.java @@ -0,0 +1,57 @@ +package test_locally.api.methods; + +import com.slack.api.RequestConfigurator; +import com.slack.api.methods.MethodsClient; +import com.slack.api.methods.impl.FilesUploadV2Helper; +import com.slack.api.methods.request.files.FilesCompleteUploadExternalRequest; +import com.slack.api.methods.request.files.FilesUploadV2Request; +import com.slack.api.methods.response.files.FilesCompleteUploadExternalResponse; +import com.slack.api.model.block.LayoutBlock; +import com.slack.api.model.block.SectionBlock; +import com.slack.api.util.http.SlackHttpClient; +import okhttp3.OkHttpClient; +import org.junit.Test; +import org.mockito.ArgumentCaptor; + +import java.util.Collections; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class FilesUploadV2HelperTest { + + @Test + @SuppressWarnings("unchecked") + public void completeUploadsPropagatesBlocks() throws Exception { + // GIVEN + MethodsClient client = mock(MethodsClient.class); + when(client.getSlackHttpClient()).thenReturn(new SlackHttpClient(new OkHttpClient())); + + FilesCompleteUploadExternalResponse response = new FilesCompleteUploadExternalResponse(); + response.setOk(true); + response.setFiles(Collections.emptyList()); + + ArgumentCaptor> captor = + ArgumentCaptor.forClass(RequestConfigurator.class); + when(client.filesCompleteUploadExternal(captor.capture())).thenReturn(response); + + List blocks = Collections.singletonList(SectionBlock.builder().build()); + FilesUploadV2Request request = FilesUploadV2Request.builder() + .blocks(blocks) + .blocksAsString("[]") + .build(); + + // WHEN + new FilesUploadV2Helper(client).completeUploads(request, Collections.emptyList()); + + // THEN + FilesCompleteUploadExternalRequest completeRequest = captor.getValue() + .configure(FilesCompleteUploadExternalRequest.builder()) + .build(); + assertThat(completeRequest.getBlocks(), is(blocks)); + assertThat(completeRequest.getBlocksAsString(), is("[]")); + } +} diff --git a/slack-api-client/src/test/java/test_locally/api/methods/RequestFormBuilderTest.java b/slack-api-client/src/test/java/test_locally/api/methods/RequestFormBuilderTest.java index b25732f63..3b54c8187 100644 --- a/slack-api-client/src/test/java/test_locally/api/methods/RequestFormBuilderTest.java +++ b/slack-api-client/src/test/java/test_locally/api/methods/RequestFormBuilderTest.java @@ -4,6 +4,7 @@ import com.slack.api.methods.request.calls.CallsAddRequest; import com.slack.api.methods.request.chat.ChatPostMessageRequest; import com.slack.api.methods.request.chat.ChatUnfurlRequest; +import com.slack.api.methods.request.files.FilesCompleteUploadExternalRequest; import com.slack.api.model.Attachment; import com.slack.api.model.CallParticipant; import com.slack.api.model.block.LayoutBlock; @@ -60,6 +61,43 @@ public void testEmptyListJsonSerialization() { assertThat(form.value(blocksIndexInForm), is("[]")); } + @Test + public void testFilesCompleteUploadExternalBlocksJsonSerialization() { + // GIVEN + List blocks = new ArrayList<>(); + blocks.add(MyTestBlock.builder().build()); + + FilesCompleteUploadExternalRequest request = FilesCompleteUploadExternalRequest.builder() + .blocks(blocks) + .build(); + + // WHEN + FormBody form = RequestFormBuilder.toForm(request).build(); + + // THEN + assertThat(form.name(0), is("blocks")); + assertThat(form.value(0), is("[{\"type\":\"myTestBlock\"}]")); + } + + @Test + public void testFilesCompleteUploadExternalBlocksAsStringTakesPrecedence() { + // GIVEN + List blocks = new ArrayList<>(); + blocks.add(MyTestBlock.builder().build()); + + FilesCompleteUploadExternalRequest request = FilesCompleteUploadExternalRequest.builder() + .blocks(blocks) + .blocksAsString("[]") + .build(); + + // WHEN + FormBody form = RequestFormBuilder.toForm(request).build(); + + // THEN + assertThat(form.name(0), is("blocks")); + assertThat(form.value(0), is("[]")); + } + @Test public void testBlocksJsonSerializationWithInnerClassInit() { // GIVEN