Skip to content

Commit 1873880

Browse files
committed
Add rate limits
1 parent ddfcfaa commit 1873880

File tree

6 files changed

+47
-3
lines changed

6 files changed

+47
-3
lines changed

slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimitTier.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ public enum MethodsRateLimitTier {
6969
}
7070

7171
public static Integer getAllowedRequestsPerMinute(MethodsRateLimitTier tier) {
72+
if (tier == null) {
73+
// Just in case, this method returns Tier2 when the given Tier is null to avoid runtime errors
74+
// Tier2 may not be optimal in the case but it works for most cases
75+
return allowedRequestsPerMinute.get(MethodsRateLimitTier.Tier2);
76+
}
7277
return allowedRequestsPerMinute.get(tier);
7378
}
7479

slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ public static void setRateLimitTier(String methodName, MethodsRateLimitTier tier
4040

4141
// Tier1
4242
final List<String> adminApiMethods_Tier1 = Arrays.asList(
43-
ADMIN_TEAMS_CREATE
43+
ADMIN_TEAMS_CREATE,
44+
ADMIN_USERGROUPS_ADD_CHANNELS
4445
);
4546
for (String methods : adminApiMethods_Tier1) {
4647
setRateLimitTier(methods, Tier1);
@@ -81,7 +82,10 @@ public static void setRateLimitTier(String methodName, MethodsRateLimitTier tier
8182
ADMIN_USERS_SET_OWNER,
8283
ADMIN_USERS_SET_REGULAR,
8384

84-
ADMIN_USERS_SESSION_RESET
85+
ADMIN_USERS_SESSION_RESET,
86+
87+
ADMIN_USERGROUPS_LIST_CHANNELS,
88+
ADMIN_USERGROUPS_REMOVE_CHANNELS
8589
);
8690
for (String methods : adminApiMethods_Tier2) {
8791
setRateLimitTier(methods, Tier2);

slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsRateLimiter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ private WaitTime calculateWaitTime(String teamId, String methodName, String suff
5656
String key = methodName + suffix;
5757

5858
MethodsRateLimitTier tier = MethodsRateLimits.lookupRateLimitTier(methodName);
59+
if (tier == null) {
60+
log.warn("Rate Limit Tier for method: {} is not found", methodName);
61+
}
5962
int allowedRequests = getAllowedRequestsPerMinute(tier);
6063
if (log.isDebugEnabled()) {
6164
int currentRequests = getNumberOfLastMinuteRequests(teamId, key);

slack-api-client/src/test/java/test_locally/api/MethodsTest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package test_locally.api;
22

33
import com.slack.api.methods.Methods;
4+
import com.slack.api.methods.MethodsRateLimitTier;
5+
import com.slack.api.methods.MethodsRateLimits;
46
import org.junit.Test;
57

68
import java.lang.reflect.Field;
@@ -17,7 +19,7 @@ public void verifyTheCoverage() {
1719
// https://api.slack.com/methods
1820
// var methodNames = [].slice.call(document.getElementsByClassName('bold')).map(e => e.text);console.log(methodNames.toString());console.log(methodNames.length);
1921
// 188 endpoints as of Jan 30
20-
String methods = "admin.apps.approve,admin.apps.restrict,admin.apps.approved.list,admin.apps.requests.list,admin.apps.restricted.list,admin.conversations.setTeams,admin.emoji.add,admin.emoji.addAlias,admin.emoji.list,admin.emoji.remove,admin.emoji.rename,admin.inviteRequests.approve,admin.inviteRequests.deny,admin.inviteRequests.list,admin.inviteRequests.approved.list,admin.inviteRequests.denied.list,admin.teams.admins.list,admin.teams.create,admin.teams.list,admin.teams.owners.list,admin.teams.settings.info,admin.teams.settings.setDefaultChannels,admin.teams.settings.setDescription,admin.teams.settings.setDiscoverability,admin.teams.settings.setIcon,admin.teams.settings.setName,admin.users.assign,admin.users.invite,admin.users.list,admin.users.remove,admin.users.setAdmin,admin.users.setExpiration,admin.users.setOwner,admin.users.setRegular,admin.users.session.reset,api.test,apps.permissions.info,apps.permissions.request,apps.permissions.resources.list,apps.permissions.scopes.list,apps.permissions.users.list,apps.permissions.users.request,apps.uninstall,auth.revoke,auth.test,bots.info,chat.delete,chat.deleteScheduledMessage,chat.getPermalink,chat.meMessage,chat.postEphemeral,chat.postMessage,chat.scheduleMessage,chat.unfurl,chat.update,chat.scheduledMessages.list,conversations.archive,conversations.close,conversations.create,conversations.history,conversations.info,conversations.invite,conversations.join,conversations.kick,conversations.leave,conversations.list,conversations.members,conversations.open,conversations.rename,conversations.replies,conversations.setPurpose,conversations.setTopic,conversations.unarchive,dialog.open,dnd.endDnd,dnd.endSnooze,dnd.info,dnd.setSnooze,dnd.teamInfo,emoji.list,files.comments.delete,files.delete,files.info,files.list,files.revokePublicURL,files.sharedPublicURL,files.upload,files.remote.add,files.remote.info,files.remote.list,files.remote.remove,files.remote.share,files.remote.update,migration.exchange,oauth.access,oauth.token,oauth.v2.access,pins.add,pins.list,pins.remove,reactions.add,reactions.get,reactions.list,reactions.remove,reminders.add,reminders.complete,reminders.delete,reminders.info,reminders.list,rtm.connect,rtm.start,search.all,search.files,search.messages,stars.add,stars.list,stars.remove,team.accessLogs,team.billableInfo,team.info,team.integrationLogs,team.profile.get,usergroups.create,usergroups.disable,usergroups.enable,usergroups.list,usergroups.update,usergroups.users.list,usergroups.users.update,users.conversations,users.deletePhoto,users.getPresence,users.identity,users.info,users.list,users.lookupByEmail,users.setActive,users.setPhoto,users.setPresence,users.profile.get,users.profile.set,views.open,views.publish,views.push,views.update,channels.archive,channels.create,channels.history,channels.info,channels.invite,channels.join,channels.kick,channels.leave,channels.list,channels.mark,channels.rename,channels.replies,channels.setPurpose,channels.setTopic,channels.unarchive,groups.archive,groups.create,groups.createChild,groups.history,groups.info,groups.invite,groups.kick,groups.leave,groups.list,groups.mark,groups.open,groups.rename,groups.replies,groups.setPurpose,groups.setTopic,groups.unarchive,im.close,im.history,im.list,im.mark,im.open,im.replies,mpim.close,mpim.history,mpim.list,mpim.mark,mpim.open,mpim.replies";
22+
String methods = "admin.apps.approve,admin.apps.restrict,admin.apps.approved.list,admin.apps.requests.list,admin.apps.restricted.list,admin.conversations.setTeams,admin.emoji.add,admin.emoji.addAlias,admin.emoji.list,admin.emoji.remove,admin.emoji.rename,admin.inviteRequests.approve,admin.inviteRequests.deny,admin.inviteRequests.list,admin.inviteRequests.approved.list,admin.inviteRequests.denied.list,admin.teams.admins.list,admin.teams.create,admin.teams.list,admin.teams.owners.list,admin.teams.settings.info,admin.teams.settings.setDefaultChannels,admin.teams.settings.setDescription,admin.teams.settings.setDiscoverability,admin.teams.settings.setIcon,admin.teams.settings.setName,admin.usergroups.addChannels,admin.usergroups.listChannels,admin.usergroups.removeChannels,admin.users.assign,admin.users.invite,admin.users.list,admin.users.remove,admin.users.setAdmin,admin.users.setExpiration,admin.users.setOwner,admin.users.setRegular,admin.users.session.reset,api.test,apps.permissions.info,apps.permissions.request,apps.permissions.resources.list,apps.permissions.scopes.list,apps.permissions.users.list,apps.permissions.users.request,apps.uninstall,auth.revoke,auth.test,bots.info,chat.delete,chat.deleteScheduledMessage,chat.getPermalink,chat.meMessage,chat.postEphemeral,chat.postMessage,chat.scheduleMessage,chat.unfurl,chat.update,chat.scheduledMessages.list,conversations.archive,conversations.close,conversations.create,conversations.history,conversations.info,conversations.invite,conversations.join,conversations.kick,conversations.leave,conversations.list,conversations.members,conversations.open,conversations.rename,conversations.replies,conversations.setPurpose,conversations.setTopic,conversations.unarchive,dialog.open,dnd.endDnd,dnd.endSnooze,dnd.info,dnd.setSnooze,dnd.teamInfo,emoji.list,files.comments.delete,files.delete,files.info,files.list,files.revokePublicURL,files.sharedPublicURL,files.upload,files.remote.add,files.remote.info,files.remote.list,files.remote.remove,files.remote.share,files.remote.update,migration.exchange,oauth.access,oauth.token,oauth.v2.access,pins.add,pins.list,pins.remove,reactions.add,reactions.get,reactions.list,reactions.remove,reminders.add,reminders.complete,reminders.delete,reminders.info,reminders.list,rtm.connect,rtm.start,search.all,search.files,search.messages,stars.add,stars.list,stars.remove,team.accessLogs,team.billableInfo,team.info,team.integrationLogs,team.profile.get,usergroups.create,usergroups.disable,usergroups.enable,usergroups.list,usergroups.update,usergroups.users.list,usergroups.users.update,users.conversations,users.deletePhoto,users.getPresence,users.identity,users.info,users.list,users.lookupByEmail,users.setActive,users.setPhoto,users.setPresence,users.profile.get,users.profile.set,views.open,views.publish,views.push,views.update,channels.archive,channels.create,channels.history,channels.info,channels.invite,channels.join,channels.kick,channels.leave,channels.list,channels.mark,channels.rename,channels.replies,channels.setPurpose,channels.setTopic,channels.unarchive,groups.archive,groups.create,groups.createChild,groups.history,groups.info,groups.invite,groups.kick,groups.leave,groups.list,groups.mark,groups.open,groups.rename,groups.replies,groups.setPurpose,groups.setTopic,groups.unarchive,im.close,im.history,im.list,im.mark,im.open,im.replies,mpim.close,mpim.history,mpim.list,mpim.mark,mpim.open,mpim.replies";
2123
final List<String> existingMethods = new ArrayList<>();
2224
for (Field f : Methods.class.getDeclaredFields()) {
2325
int modifiers = f.getModifiers();
@@ -36,5 +38,11 @@ public void verifyTheCoverage() {
3638
}
3739
}
3840

41+
for (String method : methods.split(",")) {
42+
MethodsRateLimitTier tier = MethodsRateLimits.lookupRateLimitTier(method);
43+
if (tier == null) {
44+
fail(method + " is not supported yet!");
45+
}
46+
}
3947
}
4048
}

slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiAsyncTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.slack.api.Slack;
44
import com.slack.api.SlackConfig;
55
import com.slack.api.methods.AsyncMethodsClient;
6+
import com.slack.api.methods.MethodsClient;
67
import org.junit.After;
78
import org.junit.Before;
89
import org.junit.Test;
@@ -141,4 +142,16 @@ public void adminUsers() throws Exception {
141142
.get().isOk(), is(true));
142143
}
143144

145+
@Test
146+
public void adminUsergroups() throws Exception {
147+
AsyncMethodsClient methods = slack.methodsAsync(ValidToken);
148+
149+
assertThat(methods.adminUsergroupsAddChannels(r -> r.teamId("T123").usergroupId("S123").channelIds(Arrays.asList("C123", "C234")))
150+
.get().isOk(), is(true));
151+
assertThat(methods.adminUsergroupsListChannels(r -> r.teamId("T123").usergroupId("S123").includeNumMembers(true))
152+
.get().isOk(), is(true));
153+
assertThat(methods.adminUsergroupsRemoveChannels(r -> r.usergroupId("S123").channelIds(Arrays.asList("C123", "C234")))
154+
.get().isOk(), is(true));
155+
}
156+
144157
}

slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,15 @@ public void adminUsers() throws Exception {
141141
.isOk(), is(true));
142142
}
143143

144+
@Test
145+
public void adminUsergroups() throws Exception {
146+
MethodsClient methods = slack.methods(ValidToken);
147+
148+
assertThat(methods.adminUsergroupsAddChannels(r -> r.teamId("T123").usergroupId("S123").channelIds(Arrays.asList("C123", "C234")))
149+
.isOk(), is(true));
150+
assertThat(methods.adminUsergroupsListChannels(r -> r.teamId("T123").usergroupId("S123").includeNumMembers(true))
151+
.isOk(), is(true));
152+
assertThat(methods.adminUsergroupsRemoveChannels(r -> r.usergroupId("S123").channelIds(Arrays.asList("C123", "C234")))
153+
.isOk(), is(true));
154+
}
144155
}

0 commit comments

Comments
 (0)