diff --git a/json-logs/samples/api/admin.conversations.bulkArchive.json b/json-logs/samples/api/admin.conversations.bulkArchive.json new file mode 100644 index 000000000..ab3baebc7 --- /dev/null +++ b/json-logs/samples/api/admin.conversations.bulkArchive.json @@ -0,0 +1,20 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "bulk_action_id": "", + "not_added": [ + { + "channel_id": "C00000000", + "errors": [ + "" + ] + } + ], + "response_metadata": { + "messages": [ + "" + ] + } +} \ No newline at end of file diff --git a/json-logs/samples/api/admin.conversations.bulkDelete.json b/json-logs/samples/api/admin.conversations.bulkDelete.json new file mode 100644 index 000000000..4652221c5 --- /dev/null +++ b/json-logs/samples/api/admin.conversations.bulkDelete.json @@ -0,0 +1,20 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "bulk_action_id": "", + "not_added": [ + { + "channel_id": "", + "errors": [ + "" + ] + } + ], + "response_metadata": { + "messages": [ + "" + ] + } +} \ No newline at end of file diff --git a/json-logs/samples/api/admin.conversations.bulkMove.json b/json-logs/samples/api/admin.conversations.bulkMove.json new file mode 100644 index 000000000..248c78741 --- /dev/null +++ b/json-logs/samples/api/admin.conversations.bulkMove.json @@ -0,0 +1,20 @@ +{ + "ok": false, + "bulk_action_id": "", + "not_added": [ + { + "channel_id": "", + "errors": [ + "" + ] + } + ], + "error": "", + "needed": "", + "provided": "", + "response_metadata": { + "messages": [ + "" + ] + } +} \ No newline at end of file diff --git a/json-logs/samples/api/admin.conversations.create.json b/json-logs/samples/api/admin.conversations.create.json index 440ab0bdf..c74ebde18 100644 --- a/json-logs/samples/api/admin.conversations.create.json +++ b/json-logs/samples/api/admin.conversations.create.json @@ -3,5 +3,10 @@ "channel_id": "C00000000", "error": "", "needed": "", - "provided": "" + "provided": "", + "response_metadata": { + "messages": [ + "" + ] + } } \ No newline at end of file diff --git a/json-logs/samples/api/users.list.json b/json-logs/samples/api/users.list.json index 932578c9e..bc5b04a47 100644 --- a/json-logs/samples/api/users.list.json +++ b/json-logs/samples/api/users.list.json @@ -75,7 +75,8 @@ "is_admin": false, "is_owner": false, "teams": [ - "" + "", + "T00000000" ], "is_primary_owner": false }, diff --git a/metadata/web-api/rate_limit_tiers.json b/metadata/web-api/rate_limit_tiers.json index ba1bd01d4..958ca9637 100644 --- a/metadata/web-api/rate_limit_tiers.json +++ b/metadata/web-api/rate_limit_tiers.json @@ -16,6 +16,9 @@ "admin.barriers.list": "Tier2", "admin.barriers.update": "Tier2", "admin.conversations.archive": "Tier2", + "admin.conversations.bulkArchive": "Tier2", + "admin.conversations.bulkDelete": "Tier2", + "admin.conversations.bulkMove": "Tier2", "admin.conversations.convertToPrivate": "Tier2", "admin.conversations.create": "Tier2", "admin.conversations.delete": "Tier2", diff --git a/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java b/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java index 0e125595c..2b54f78ef 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java @@ -376,6 +376,18 @@ CompletableFuture adminConve CompletableFuture adminConversationsSetCustomRetention(RequestConfigurator req); + CompletableFuture adminConversationsBulkArchive(AdminConversationsBulkArchiveRequest req); + + CompletableFuture adminConversationsBulkArchive(RequestConfigurator req); + + CompletableFuture adminConversationsBulkDelete(AdminConversationsBulkDeleteRequest req); + + CompletableFuture adminConversationsBulkDelete(RequestConfigurator req); + + CompletableFuture adminConversationsBulkMove(AdminConversationsBulkMoveRequest req); + + CompletableFuture adminConversationsBulkMove(RequestConfigurator req); + // ------------------------------ // admin.conversations.ekm // ------------------------------ diff --git a/slack-api-client/src/main/java/com/slack/api/methods/Methods.java b/slack-api-client/src/main/java/com/slack/api/methods/Methods.java index 6a122ab56..3f11941ff 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/Methods.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/Methods.java @@ -68,6 +68,10 @@ private Methods() { public static final String ADMIN_CONVERSATIONS_REMOVE_CUSTOM_RETENTION = "admin.conversations.removeCustomRetention"; public static final String ADMIN_CONVERSATIONS_SET_CUSTOM_RETENTION = "admin.conversations.setCustomRetention"; + public static final String ADMIN_CONVERSATIONS_BULK_ARCHIVE = "admin.conversations.bulkArchive"; + public static final String ADMIN_CONVERSATIONS_BULK_DELETE = "admin.conversations.bulkDelete"; + public static final String ADMIN_CONVERSATIONS_BULK_MOVE = "admin.conversations.bulkMove"; + // ------------------------------ // admin.conversations.ekm // ------------------------------ diff --git a/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java b/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java index 78ea8b44c..06c1f2402 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java @@ -430,6 +430,18 @@ T postFormWithAuthorizationHeaderAndParseRespon AdminConversationsSetCustomRetentionResponse adminConversationsSetCustomRetention(RequestConfigurator req) throws IOException, SlackApiException; + AdminConversationsBulkArchiveResponse adminConversationsBulkArchive(AdminConversationsBulkArchiveRequest req) throws IOException, SlackApiException; + + AdminConversationsBulkArchiveResponse adminConversationsBulkArchive(RequestConfigurator req) throws IOException, SlackApiException; + + AdminConversationsBulkDeleteResponse adminConversationsBulkDelete(AdminConversationsBulkDeleteRequest req) throws IOException, SlackApiException; + + AdminConversationsBulkDeleteResponse adminConversationsBulkDelete(RequestConfigurator req) throws IOException, SlackApiException; + + AdminConversationsBulkMoveResponse adminConversationsBulkMove(AdminConversationsBulkMoveRequest req) throws IOException, SlackApiException; + + AdminConversationsBulkMoveResponse adminConversationsBulkMove(RequestConfigurator req) throws IOException, SlackApiException; + // ------------------------------ // admin.conversations.ekm // ------------------------------ diff --git a/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java b/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java index 05e49fdea..2c03c6e5d 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java @@ -104,6 +104,9 @@ public static void setRateLimitTier(String methodName, MethodsRateLimitTier tier ADMIN_CONVERSATIONS_GET_CUSTOM_RETENTION, ADMIN_CONVERSATIONS_REMOVE_CUSTOM_RETENTION, ADMIN_CONVERSATIONS_SET_CUSTOM_RETENTION, + ADMIN_CONVERSATIONS_BULK_ARCHIVE, + ADMIN_CONVERSATIONS_BULK_DELETE, + ADMIN_CONVERSATIONS_BULK_MOVE, ADMIN_EMOJI_ADD, ADMIN_EMOJI_ADD_ALIAS, 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 8abf73a9c..a56e57c15 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 @@ -447,6 +447,31 @@ public static FormBody.Builder toForm(AdminConversationsUnarchiveRequest req) { return form; } + public static FormBody.Builder toForm(AdminConversationsBulkArchiveRequest req) { + FormBody.Builder form = new FormBody.Builder(); + if (req.getChannelIds() != null) { + setIfNotNull("channel_ids", req.getChannelIds().stream().collect(joining(",")), form); + } + return form; + } + + public static FormBody.Builder toForm(AdminConversationsBulkDeleteRequest req) { + FormBody.Builder form = new FormBody.Builder(); + if (req.getChannelIds() != null) { + setIfNotNull("channel_ids", req.getChannelIds().stream().collect(joining(",")), form); + } + return form; + } + + public static FormBody.Builder toForm(AdminConversationsBulkMoveRequest req) { + FormBody.Builder form = new FormBody.Builder(); + if (req.getChannelIds() != null) { + setIfNotNull("channel_ids", req.getChannelIds().stream().collect(joining(",")), form); + } + setIfNotNull("target_team_id", req.getTargetTeamId(), form); + return form; + } + public static FormBody.Builder toForm(AdminConversationsEkmListOriginalConnectedChannelInfoRequest req) { FormBody.Builder form = new FormBody.Builder(); if (req.getChannelIds() != null) { diff --git a/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java b/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java index e66d8cad9..750d0dc4f 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java @@ -587,6 +587,36 @@ public CompletableFuture adminConv return adminConversationsSetCustomRetention(req.configure(AdminConversationsSetCustomRetentionRequest.builder()).build()); } + @Override + public CompletableFuture adminConversationsBulkArchive(AdminConversationsBulkArchiveRequest req) { + return executor.execute(ADMIN_CONVERSATIONS_BULK_ARCHIVE, toMap(req), () -> methods.adminConversationsBulkArchive(req)); + } + + @Override + public CompletableFuture adminConversationsBulkArchive(RequestConfigurator req) { + return adminConversationsBulkArchive(req.configure(AdminConversationsBulkArchiveRequest.builder()).build()); + } + + @Override + public CompletableFuture adminConversationsBulkDelete(AdminConversationsBulkDeleteRequest req) { + return executor.execute(ADMIN_CONVERSATIONS_BULK_DELETE, toMap(req), () -> methods.adminConversationsBulkDelete(req)); + } + + @Override + public CompletableFuture adminConversationsBulkDelete(RequestConfigurator req) { + return adminConversationsBulkDelete(req.configure(AdminConversationsBulkDeleteRequest.builder()).build()); + } + + @Override + public CompletableFuture adminConversationsBulkMove(AdminConversationsBulkMoveRequest req) { + return executor.execute(ADMIN_CONVERSATIONS_BULK_MOVE, toMap(req), () -> methods.adminConversationsBulkMove(req)); + } + + @Override + public CompletableFuture adminConversationsBulkMove(RequestConfigurator req) { + return adminConversationsBulkMove(req.configure(AdminConversationsBulkMoveRequest.builder()).build()); + } + @Override public CompletableFuture adminConversationsEkmListOriginalConnectedChannelInfo(AdminConversationsEkmListOriginalConnectedChannelInfoRequest req) { return executor.execute(ADMIN_CONVERSATIONS_EKM_LIST_ORIGINAL_CONNECTED_CHANNEL_INFO, toMap(req), () -> methods.adminConversationsEkmListOriginalConnectedChannelInfo(req)); diff --git a/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java b/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java index 8de740da5..7868c9841 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java @@ -592,6 +592,36 @@ public AdminConversationsSetCustomRetentionResponse adminConversationsSetCustomR return adminConversationsSetCustomRetention(req.configure(AdminConversationsSetCustomRetentionRequest.builder()).build()); } + @Override + public AdminConversationsBulkArchiveResponse adminConversationsBulkArchive(AdminConversationsBulkArchiveRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.ADMIN_CONVERSATIONS_BULK_ARCHIVE, getToken(req), AdminConversationsBulkArchiveResponse.class); + } + + @Override + public AdminConversationsBulkArchiveResponse adminConversationsBulkArchive(RequestConfigurator req) throws IOException, SlackApiException { + return adminConversationsBulkArchive(req.configure(AdminConversationsBulkArchiveRequest.builder()).build()); + } + + @Override + public AdminConversationsBulkDeleteResponse adminConversationsBulkDelete(AdminConversationsBulkDeleteRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.ADMIN_CONVERSATIONS_BULK_DELETE, getToken(req), AdminConversationsBulkDeleteResponse.class); + } + + @Override + public AdminConversationsBulkDeleteResponse adminConversationsBulkDelete(RequestConfigurator req) throws IOException, SlackApiException { + return adminConversationsBulkDelete(req.configure(AdminConversationsBulkDeleteRequest.builder()).build()); + } + + @Override + public AdminConversationsBulkMoveResponse adminConversationsBulkMove(AdminConversationsBulkMoveRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.ADMIN_CONVERSATIONS_BULK_MOVE, getToken(req), AdminConversationsBulkMoveResponse.class); + } + + @Override + public AdminConversationsBulkMoveResponse adminConversationsBulkMove(RequestConfigurator req) throws IOException, SlackApiException { + return adminConversationsBulkMove(req.configure(AdminConversationsBulkMoveRequest.builder()).build()); + } + @Override public AdminConversationsEkmListOriginalConnectedChannelInfoResponse adminConversationsEkmListOriginalConnectedChannelInfo(AdminConversationsEkmListOriginalConnectedChannelInfoRequest req) throws IOException, SlackApiException { return postFormWithTokenAndParseResponse(toForm(req), Methods.ADMIN_CONVERSATIONS_EKM_LIST_ORIGINAL_CONNECTED_CHANNEL_INFO, getToken(req), AdminConversationsEkmListOriginalConnectedChannelInfoResponse.class); diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/admin/conversations/AdminConversationsBulkArchiveRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/conversations/AdminConversationsBulkArchiveRequest.java new file mode 100644 index 000000000..1f64ce72f --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/conversations/AdminConversationsBulkArchiveRequest.java @@ -0,0 +1,26 @@ +package com.slack.api.methods.request.admin.conversations; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * https://api.slack.com/methods/admin.conversations.bulkArchive + */ +@Data +@Builder +public class AdminConversationsBulkArchiveRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. + */ + private String token; + + /** + * An array of channel IDs. + */ + private List channelIds; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/admin/conversations/AdminConversationsBulkDeleteRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/conversations/AdminConversationsBulkDeleteRequest.java new file mode 100644 index 000000000..16f828a07 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/conversations/AdminConversationsBulkDeleteRequest.java @@ -0,0 +1,26 @@ +package com.slack.api.methods.request.admin.conversations; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * https://api.slack.com/methods/admin.conversations.bulkDelete + */ +@Data +@Builder +public class AdminConversationsBulkDeleteRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. + */ + private String token; + + /** + * An array of channel IDs. + */ + private List channelIds; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/admin/conversations/AdminConversationsBulkMoveRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/conversations/AdminConversationsBulkMoveRequest.java new file mode 100644 index 000000000..19ef883a4 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/conversations/AdminConversationsBulkMoveRequest.java @@ -0,0 +1,31 @@ +package com.slack.api.methods.request.admin.conversations; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * https://api.slack.com/methods/admin.conversations.bulkMove + */ +@Data +@Builder +public class AdminConversationsBulkMoveRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. + */ + private String token; + + /** + * An array of channel IDs. + */ + private List channelIds; + + /** + * Target team ID + */ + private String targetTeamId; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/admin/conversations/AdminConversationsBulkArchiveResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/conversations/AdminConversationsBulkArchiveResponse.java new file mode 100644 index 000000000..28602afb8 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/conversations/AdminConversationsBulkArchiveResponse.java @@ -0,0 +1,29 @@ +package com.slack.api.methods.response.admin.conversations; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ErrorResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class AdminConversationsBulkArchiveResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private String bulkActionId; + private List notAdded; + private ErrorResponseMetadata responseMetadata; + + @Data + public static class NotAdded { + private String channelId; + private List errors; + } +} \ No newline at end of file diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/admin/conversations/AdminConversationsBulkDeleteResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/conversations/AdminConversationsBulkDeleteResponse.java new file mode 100644 index 000000000..2c0e9d588 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/conversations/AdminConversationsBulkDeleteResponse.java @@ -0,0 +1,29 @@ +package com.slack.api.methods.response.admin.conversations; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ErrorResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class AdminConversationsBulkDeleteResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private String bulkActionId; + private List notAdded; + private ErrorResponseMetadata responseMetadata; + + @Data + public static class NotAdded { + private String channelId; + private List errors; + } +} \ No newline at end of file diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/admin/conversations/AdminConversationsBulkMoveResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/conversations/AdminConversationsBulkMoveResponse.java new file mode 100644 index 000000000..adc7a0d91 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/conversations/AdminConversationsBulkMoveResponse.java @@ -0,0 +1,29 @@ +package com.slack.api.methods.response.admin.conversations; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ErrorResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class AdminConversationsBulkMoveResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private String bulkActionId; + private List notAdded; + private ErrorResponseMetadata responseMetadata; + + @Data + public static class NotAdded { + private String channelId; + private List errors; + } +} \ No newline at end of file diff --git a/slack-api-client/src/test/java/config/Constants.java b/slack-api-client/src/test/java/config/Constants.java index 2f3c86503..c82c79e24 100644 --- a/slack-api-client/src/test/java/config/Constants.java +++ b/slack-api-client/src/test/java/config/Constants.java @@ -21,6 +21,7 @@ private Constants() { public static final String SLACK_SDK_TEST_GRID_ORG_ADMIN_USER_TOKEN = "SLACK_SDK_TEST_GRID_ORG_ADMIN_USER_TOKEN"; // Main team Id for testing public static final String SLACK_SDK_TEST_GRID_TEAM_ID = "SLACK_SDK_TEST_GRID_TEAM_ID"; + public static final String SLACK_SDK_TEST_GRID_TEAM_ID_2 = "SLACK_SDK_TEST_GRID_TEAM_ID_2"; // IDP User Group connected to SLACK_SDK_TEST_GRID_TEAM_ID public static final String SLACK_SDK_TEST_GRID_IDP_USERGROUP_ID = "SLACK_SDK_TEST_GRID_IDP_USERGROUP_ID"; public static final String SLACK_SDK_TEST_GRID_IDP_USERGROUP_ID_2 = "SLACK_SDK_TEST_GRID_IDP_USERGROUP_ID_2"; diff --git a/slack-api-client/src/test/java/test_locally/api/MethodsTest.java b/slack-api-client/src/test/java/test_locally/api/MethodsTest.java index a63585fa5..6ad75b88e 100644 --- a/slack-api-client/src/test/java/test_locally/api/MethodsTest.java +++ b/slack-api-client/src/test/java/test_locally/api/MethodsTest.java @@ -50,11 +50,7 @@ public void verifyTheCoverage() { // TODO: admin.roles.* - https://github.com/slackapi/java-slack-sdk/issues/1082 "admin.roles.addAssignments", "admin.roles.listAssignments", - "admin.roles.removeAssignments", - // TODO: admin.conversations.bulk* - https://github.com/slackapi/java-slack-sdk/issues/1087 - "admin.conversations.bulkArchive", - "admin.conversations.bulkDelete", - "admin.conversations.bulkMove" + "admin.roles.removeAssignments" ); List methodNames = new ArrayList<>(); for (String methodName : allMethodNames) { diff --git a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiAsyncTest.java b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiAsyncTest.java index ad07c984b..117601236 100644 --- a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiAsyncTest.java +++ b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiAsyncTest.java @@ -92,6 +92,9 @@ public void adminConversations() throws Exception { assertThat(methods.adminConversationsSetConversationPrefs(r -> r).get().isOk(), is(true)); assertThat(methods.adminConversationsSetTeams(r -> r).get().isOk(), is(true)); assertThat(methods.adminConversationsUnarchive(r -> r).get().isOk(), is(true)); + assertThat(methods.adminConversationsBulkMove(r -> r).get().isOk(), is(true)); + assertThat(methods.adminConversationsBulkDelete(r -> r).get().isOk(), is(true)); + assertThat(methods.adminConversationsBulkArchive(r -> r).get().isOk(), is(true)); } @Test diff --git a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiTest.java b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiTest.java index 6e2832662..5f9bc2f3b 100644 --- a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiTest.java +++ b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiTest.java @@ -110,6 +110,9 @@ public void adminConversations() throws Exception { assertThat(methods.adminConversationsSetConversationPrefs(r -> r).isOk(), is(true)); assertThat(methods.adminConversationsSetTeams(r -> r).isOk(), is(true)); assertThat(methods.adminConversationsUnarchive(r -> r).isOk(), is(true)); + assertThat(methods.adminConversationsBulkMove(r -> r).isOk(), is(true)); + assertThat(methods.adminConversationsBulkDelete(r -> r).isOk(), is(true)); + assertThat(methods.adminConversationsBulkArchive(r -> r).isOk(), is(true)); } @Test diff --git a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/FieldValidationTest.java b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/FieldValidationTest.java index adf7763d2..4c0fc4fa7 100644 --- a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/FieldValidationTest.java +++ b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/FieldValidationTest.java @@ -180,6 +180,18 @@ public void adminConversations() throws Exception { "getWarning", "getResponseMetadata" ); + verifyIfAllGettersReturnNonNull(parse("admin.conversations.bulkArchive", AdminConversationsBulkArchiveResponse.class), + "getWarning", + "getResponseMetadata" + ); + verifyIfAllGettersReturnNonNull(parse("admin.conversations.bulkDelete", AdminConversationsBulkDeleteResponse.class), + "getWarning", + "getResponseMetadata" + ); + verifyIfAllGettersReturnNonNull(parse("admin.conversations.bulkMove", AdminConversationsBulkMoveResponse.class), + "getWarning", + "getResponseMetadata" + ); } @Test diff --git a/slack-api-client/src/test/java/test_with_remote_apis/methods_admin_api/AdminApi_conversations_Test.java b/slack-api-client/src/test/java/test_with_remote_apis/methods_admin_api/AdminApi_conversations_Test.java index 7ccfcedd1..de7bed7f4 100644 --- a/slack-api-client/src/test/java/test_with_remote_apis/methods_admin_api/AdminApi_conversations_Test.java +++ b/slack-api-client/src/test/java/test_with_remote_apis/methods_admin_api/AdminApi_conversations_Test.java @@ -46,6 +46,7 @@ public static void tearDown() throws InterruptedException { static String teamAdminUserToken = System.getenv(Constants.SLACK_SDK_TEST_GRID_WORKSPACE_ADMIN_USER_TOKEN); static String orgAdminUserToken = System.getenv(Constants.SLACK_SDK_TEST_GRID_ORG_ADMIN_USER_TOKEN); static String teamId = System.getenv(Constants.SLACK_SDK_TEST_GRID_TEAM_ID); + static String teamId2 = System.getenv(Constants.SLACK_SDK_TEST_GRID_TEAM_ID_2); static String idpUsergroupId = System.getenv(Constants.SLACK_SDK_TEST_GRID_IDP_USERGROUP_ID); static String sharedChannelId = System.getenv(Constants.SLACK_SDK_TEST_GRID_SHARED_CHANNEL_ID); @@ -341,6 +342,110 @@ public void whitelist() throws Exception { } } + @Test + public void adminConversationsBulkMove() throws Exception { + if (orgAdminUserToken != null) { + AsyncMethodsClient orgAdminClient = slack.methodsAsync(orgAdminUserToken); + AdminConversationsCreateResponse creation1 = orgAdminClient.adminConversationsCreate(r -> r + .name("test-channel-1-" + System.currentTimeMillis()) + .teamId(teamId) + .isPrivate(false) + ).get(); + assertThat(creation1.getError(), is(nullValue())); + AdminConversationsCreateResponse creation2 = orgAdminClient.adminConversationsCreate(r -> r + .name("test-channel-2-" + System.currentTimeMillis()) + .teamId(teamId) + .isPrivate(false) + ).get(); + assertThat(creation2.getError(), is(nullValue())); + + AdminConversationsBulkMoveResponse moving = null; + while (moving == null || (moving.getError() != null && moving.getError().equals("action_already_in_progress"))) { + moving = orgAdminClient.adminConversationsBulkMove(r -> r + .channelIds(Arrays.asList(creation1.getChannelId(), creation2.getChannelId())) + .targetTeamId(teamId2) + ).get(); + if (moving.getError() != null) { + Thread.sleep(3_000L); + } + } + // To receive response_metadata + moving = orgAdminClient.adminConversationsBulkMove(r -> r + .channelIds(Arrays.asList("dummy")) + .targetTeamId(teamId2) + ).get(); + assertThat(moving.getError(), is("invalid_arguments")); + } + } + + @Test + public void adminConversationsBulkArchive() throws Exception { + if (orgAdminUserToken != null) { + AsyncMethodsClient orgAdminClient = slack.methodsAsync(orgAdminUserToken); + AdminConversationsCreateResponse creation1 = orgAdminClient.adminConversationsCreate(r -> r + .name("test-channel-1-" + System.currentTimeMillis()) + .teamId(teamId) + .isPrivate(false) + ).get(); + assertThat(creation1.getError(), is(nullValue())); + AdminConversationsCreateResponse creation2 = orgAdminClient.adminConversationsCreate(r -> r + .name("test-channel-2-" + System.currentTimeMillis()) + .teamId(teamId) + .isPrivate(false) + ).get(); + assertThat(creation2.getError(), is(nullValue())); + + AdminConversationsBulkArchiveResponse archiving = null; + while (archiving == null || (archiving.getError() != null && archiving.getError().equals("action_already_in_progress"))) { + archiving = orgAdminClient.adminConversationsBulkArchive(r -> r + .channelIds(Arrays.asList(creation1.getChannelId(), creation2.getChannelId())) + ).get(); + if (archiving.getError() != null) { + Thread.sleep(3_000L); + } + } + // To receive response_metadata + archiving = orgAdminClient.adminConversationsBulkArchive(r -> r + .channelIds(Arrays.asList("dummy")) + ).get(); + assertThat(archiving.getError(), is("invalid_arguments")); + } + } + + @Test + public void adminConversationsBulkDelete() throws Exception { + if (orgAdminUserToken != null) { + AsyncMethodsClient orgAdminClient = slack.methodsAsync(orgAdminUserToken); + AdminConversationsCreateResponse creation1 = orgAdminClient.adminConversationsCreate(r -> r + .name("test-channel-1-" + System.currentTimeMillis()) + .teamId(teamId) + .isPrivate(false) + ).get(); + assertThat(creation1.getError(), is(nullValue())); + AdminConversationsCreateResponse creation2 = orgAdminClient.adminConversationsCreate(r -> r + .name("test-channel-2-" + System.currentTimeMillis()) + .teamId(teamId) + .isPrivate(false) + ).get(); + assertThat(creation2.getError(), is(nullValue())); + + AdminConversationsBulkDeleteResponse deletion = null; + while (deletion == null || (deletion.getError() != null && deletion.getError().equals("action_already_in_progress"))) { + deletion = orgAdminClient.adminConversationsBulkDelete(r -> r + .channelIds(Arrays.asList(creation1.getChannelId(), creation2.getChannelId())) + ).get(); + if (deletion.getError() != null) { + Thread.sleep(3_000L); + } + } + // To receive response_metadata + deletion = orgAdminClient.adminConversationsBulkDelete(r -> r + .channelIds(Arrays.asList("dummy")) + ).get(); + assertThat(deletion.getError(), is("invalid_arguments")); + } + } + private String findUserId(List idsToSkip) throws Exception { String userId = null; UsersListResponse usersListResponse = slack.methodsAsync(teamAdminUserToken).usersList(req -> req).get(); diff --git a/slack-api-client/src/test/java/util/sample_json_generation/JsonDataRecorder.java b/slack-api-client/src/test/java/util/sample_json_generation/JsonDataRecorder.java index 07dad0c45..747b8ac4b 100644 --- a/slack-api-client/src/test/java/util/sample_json_generation/JsonDataRecorder.java +++ b/slack-api-client/src/test/java/util/sample_json_generation/JsonDataRecorder.java @@ -2,6 +2,7 @@ import com.google.gson.*; import com.slack.api.SlackConfig; +import com.slack.api.methods.response.admin.conversations.AdminConversationsBulkMoveResponse; import com.slack.api.methods.response.admin.users.AdminUsersSessionGetSettingsResponse; import com.slack.api.methods.response.chat.scheduled_messages.ChatScheduledMessagesListResponse; import com.slack.api.methods.response.team.profile.TeamProfileGetResponse; @@ -392,6 +393,18 @@ private void scanToNormalizeValues(String path, JsonElement parent, String name, array.add(gson.toJsonTree( ObjectInitializer.initProperties(new com.slack.api.model.User.Profile.StatusEmojiDisplayInfo()) )); + } else if (path.startsWith("/api/admin.conversations.bulk") && + name != null && name.equals("not_added")) { + try { + for (int idx = 0; idx < array.size(); idx++) { + array.remove(idx); + } + } catch (Exception e) { + log.info("Failed to remove an existing element from not_added", e); + } + AdminConversationsBulkMoveResponse.NotAdded notAdded = + ObjectInitializer.initProperties(new AdminConversationsBulkMoveResponse.NotAdded()); + array.add(gson.toJsonTree(notAdded)); } if (array.size() == 0) { List addressNames = Arrays.asList("from", "to", "cc");