Skip to content

Commit 05ba174

Browse files
authored
Add JSON data covering all the rate limit tiers of Web APIs (#815)
1 parent bba92bc commit 05ba174

File tree

3 files changed

+295
-2
lines changed

3 files changed

+295
-2
lines changed
Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
{
2+
"admin.analytics.getFile": "Tier2",
3+
"admin.apps.approve": "Tier2",
4+
"admin.apps.approved.list": "Tier2",
5+
"admin.apps.clearResolution": "Tier2",
6+
"admin.apps.requests.list": "Tier2",
7+
"admin.apps.restrict": "Tier2",
8+
"admin.apps.restricted.list": "Tier2",
9+
"admin.apps.uninstall": "Tier1",
10+
"admin.auth.policy.assignEntities": "Tier4",
11+
"admin.auth.policy.getEntities": "Tier4",
12+
"admin.auth.policy.removeEntities": "Tier4",
13+
"admin.barriers.create": "Tier2",
14+
"admin.barriers.delete": "Tier2",
15+
"admin.barriers.list": "Tier2",
16+
"admin.barriers.update": "Tier2",
17+
"admin.conversations.archive": "Tier2",
18+
"admin.conversations.convertToPrivate": "Tier2",
19+
"admin.conversations.create": "Tier2",
20+
"admin.conversations.delete": "Tier2",
21+
"admin.conversations.disconnectShared": "Tier2",
22+
"admin.conversations.ekm.listOriginalConnectedChannelInfo": "Tier2",
23+
"admin.conversations.getConversationPrefs": "Tier2",
24+
"admin.conversations.getTeams": "Tier2",
25+
"admin.conversations.invite": "Tier2",
26+
"admin.conversations.rename": "Tier2",
27+
"admin.conversations.restrictAccess.addGroup": "Tier2",
28+
"admin.conversations.restrictAccess.listGroups": "Tier2",
29+
"admin.conversations.restrictAccess.removeGroup": "Tier1",
30+
"admin.conversations.search": "Tier2",
31+
"admin.conversations.setConversationPrefs": "Tier2",
32+
"admin.conversations.setTeams": "Tier2",
33+
"admin.conversations.unarchive": "Tier2",
34+
"admin.conversations.whitelist.add": "Tier2",
35+
"admin.conversations.whitelist.listGroupsLinkedToChannel": "Tier2",
36+
"admin.conversations.whitelist.remove": "Tier1",
37+
"admin.emoji.add": "Tier2",
38+
"admin.emoji.addAlias": "Tier2",
39+
"admin.emoji.list": "Tier2",
40+
"admin.emoji.remove": "Tier2",
41+
"admin.emoji.rename": "Tier2",
42+
"admin.inviteRequests.approve": "Tier2",
43+
"admin.inviteRequests.approved.list": "Tier2",
44+
"admin.inviteRequests.denied.list": "Tier2",
45+
"admin.inviteRequests.deny": "Tier2",
46+
"admin.inviteRequests.list": "Tier2",
47+
"admin.teams.admins.list": "Tier3",
48+
"admin.teams.create": "Tier1",
49+
"admin.teams.list": "Tier3",
50+
"admin.teams.owners.list": "Tier3",
51+
"admin.teams.settings.info": "Tier3",
52+
"admin.teams.settings.setDefaultChannels": "Tier2",
53+
"admin.teams.settings.setDescription": "Tier2",
54+
"admin.teams.settings.setDiscoverability": "Tier2",
55+
"admin.teams.settings.setIcon": "Tier2",
56+
"admin.teams.settings.setName": "Tier3",
57+
"admin.usergroups.addChannels": "Tier1",
58+
"admin.usergroups.addTeams": "Tier2",
59+
"admin.usergroups.listChannels": "Tier2",
60+
"admin.usergroups.removeChannels": "Tier2",
61+
"admin.users.assign": "Tier2",
62+
"admin.users.invite": "Tier2",
63+
"admin.users.list": "Tier3",
64+
"admin.users.remove": "Tier2",
65+
"admin.users.session.clearSettings": "Tier4",
66+
"admin.users.session.getSettings": "Tier4",
67+
"admin.users.session.invalidate": "Tier2",
68+
"admin.users.session.list": "Tier2",
69+
"admin.users.session.reset": "Tier2",
70+
"admin.users.session.setSettings": "Tier4",
71+
"admin.users.setAdmin": "Tier2",
72+
"admin.users.setExpiration": "Tier2",
73+
"admin.users.setOwner": "Tier2",
74+
"admin.users.setRegular": "Tier2",
75+
"api.test": "Tier4",
76+
"apps.connections.open": "Tier1",
77+
"apps.event.authorizations.list": "Tier4",
78+
"apps.permissions.info": "Tier2",
79+
"apps.permissions.request": "Tier2",
80+
"apps.permissions.resources.list": "Tier2",
81+
"apps.permissions.scopes.list": "Tier2",
82+
"apps.permissions.users.list": "Tier2",
83+
"apps.permissions.users.request": "Tier2",
84+
"apps.uninstall": "Tier1",
85+
"auth.revoke": "Tier3",
86+
"auth.teams.list": "Tier2",
87+
"auth.test": "SpecialTier_auth_test",
88+
"bots.info": "Tier3",
89+
"calls.add": "Tier2",
90+
"calls.end": "Tier2",
91+
"calls.info": "Tier2",
92+
"calls.participants.add": "Tier2",
93+
"calls.participants.remove": "Tier2",
94+
"calls.update": "Tier2",
95+
"channels.archive": "Tier2",
96+
"channels.create": "Tier2",
97+
"channels.history": "Tier2",
98+
"channels.info": "Tier3",
99+
"channels.invite": "Tier3",
100+
"channels.join": "Tier3",
101+
"channels.kick": "Tier3",
102+
"channels.leave": "Tier3",
103+
"channels.list": "Tier3",
104+
"channels.mark": "Tier3",
105+
"channels.rename": "Tier2",
106+
"channels.replies": "Tier3",
107+
"channels.setPurpose": "Tier2",
108+
"channels.setTopic": "Tier2",
109+
"channels.unarchive": "Tier2",
110+
"chat.delete": "Tier3",
111+
"chat.deleteScheduledMessage": "Tier3",
112+
"chat.getPermalink": "SpecialTier_chat_getPermalink",
113+
"chat.meMessage": "Tier3",
114+
"chat.postEphemeral": "Tier4",
115+
"chat.postMessage": "SpecialTier_chat_postMessage",
116+
"chat.scheduleMessage": "Tier3",
117+
"chat.scheduledMessages.list": "Tier3",
118+
"chat.unfurl": "Tier3",
119+
"chat.update": "Tier3",
120+
"conversations.acceptSharedInvite": "Tier1",
121+
"conversations.approveSharedInvite": "Tier1",
122+
"conversations.archive": "Tier2",
123+
"conversations.close": "Tier2",
124+
"conversations.create": "Tier2",
125+
"conversations.declineSharedInvite": "Tier1",
126+
"conversations.history": "Tier3",
127+
"conversations.info": "Tier3",
128+
"conversations.invite": "Tier3",
129+
"conversations.inviteShared": "Tier2",
130+
"conversations.join": "Tier3",
131+
"conversations.kick": "Tier3",
132+
"conversations.leave": "Tier3",
133+
"conversations.list": "Tier2",
134+
"conversations.listConnectInvites": "Tier1",
135+
"conversations.mark": "Tier3",
136+
"conversations.members": "Tier4",
137+
"conversations.open": "Tier3",
138+
"conversations.rename": "Tier2",
139+
"conversations.replies": "Tier3",
140+
"conversations.setPurpose": "Tier2",
141+
"conversations.setTopic": "Tier2",
142+
"conversations.unarchive": "Tier2",
143+
"dialog.open": "Tier4",
144+
"dnd.endDnd": "Tier2",
145+
"dnd.endSnooze": "Tier2",
146+
"dnd.info": "Tier3",
147+
"dnd.setSnooze": "Tier2",
148+
"dnd.teamInfo": "Tier2",
149+
"emoji.list": "Tier2",
150+
"files.comments.delete": "Tier2",
151+
"files.delete": "Tier3",
152+
"files.info": "Tier4",
153+
"files.list": "Tier3",
154+
"files.remote.add": "Tier2",
155+
"files.remote.info": "Tier2",
156+
"files.remote.list": "Tier2",
157+
"files.remote.remove": "Tier2",
158+
"files.remote.share": "Tier2",
159+
"files.remote.update": "Tier2",
160+
"files.revokePublicURL": "Tier3",
161+
"files.sharedPublicURL": "Tier3",
162+
"files.upload": "Tier2",
163+
"groups.archive": "Tier2",
164+
"groups.create": "Tier2",
165+
"groups.createChild": "Tier2",
166+
"groups.history": "Tier2",
167+
"groups.info": "Tier3",
168+
"groups.invite": "Tier3",
169+
"groups.kick": "Tier3",
170+
"groups.leave": "Tier3",
171+
"groups.list": "Tier3",
172+
"groups.mark": "Tier3",
173+
"groups.open": "Tier3",
174+
"groups.rename": "Tier2",
175+
"groups.replies": "Tier2",
176+
"groups.setPurpose": "Tier2",
177+
"groups.setTopic": "Tier2",
178+
"groups.unarchive": "Tier2",
179+
"im.close": "Tier2",
180+
"im.history": "Tier4",
181+
"im.list": "Tier2",
182+
"im.mark": "Tier3",
183+
"im.open": "Tier4",
184+
"im.replies": "Tier2",
185+
"migration.exchange": "Tier2",
186+
"mpim.close": "Tier2",
187+
"mpim.history": "Tier3",
188+
"mpim.list": "Tier2",
189+
"mpim.mark": "Tier3",
190+
"mpim.open": "Tier3",
191+
"mpim.replies": "Tier2",
192+
"oauth.access": "Tier4",
193+
"oauth.token": "Tier4",
194+
"oauth.v2.access": "Tier4",
195+
"oauth.v2.exchange": "Tier3",
196+
"openid.connect.token": "Tier4",
197+
"openid.connect.userInfo": "Tier3",
198+
"pins.add": "Tier2",
199+
"pins.list": "Tier2",
200+
"pins.remove": "Tier2",
201+
"reactions.add": "Tier3",
202+
"reactions.get": "Tier3",
203+
"reactions.list": "Tier2",
204+
"reactions.remove": "Tier2",
205+
"reminders.add": "Tier2",
206+
"reminders.complete": "Tier2",
207+
"reminders.delete": "Tier2",
208+
"reminders.info": "Tier2",
209+
"reminders.list": "Tier2",
210+
"rtm.connect": "Tier1",
211+
"rtm.start": "Tier1",
212+
"search.all": "Tier2",
213+
"search.files": "Tier2",
214+
"search.messages": "Tier2",
215+
"stars.add": "Tier2",
216+
"stars.list": "Tier3",
217+
"stars.remove": "Tier2",
218+
"team.accessLogs": "Tier2",
219+
"team.billableInfo": "Tier2",
220+
"team.info": "Tier3",
221+
"team.integrationLogs": "Tier2",
222+
"team.profile.get": "Tier3",
223+
"usergroups.create": "Tier2",
224+
"usergroups.disable": "Tier2",
225+
"usergroups.enable": "Tier2",
226+
"usergroups.list": "Tier2",
227+
"usergroups.update": "Tier2",
228+
"usergroups.users.list": "Tier2",
229+
"usergroups.users.update": "Tier2",
230+
"users.conversations": "Tier2",
231+
"users.deletePhoto": "Tier2",
232+
"users.getPresence": "Tier3",
233+
"users.identity": "Tier3",
234+
"users.info": "Tier4",
235+
"users.list": "Tier2",
236+
"users.lookupByEmail": "Tier3",
237+
"users.profile.get": "Tier4",
238+
"users.profile.set": "Tier4",
239+
"users.setActive": "Tier2",
240+
"users.setPhoto": "Tier2",
241+
"users.setPresence": "Tier2",
242+
"views.open": "Tier4",
243+
"views.publish": "Tier4",
244+
"views.push": "Tier4",
245+
"views.update": "Tier4",
246+
"workflows.stepCompleted": "Tier2",
247+
"workflows.stepFailed": "Tier2",
248+
"workflows.updateStep": "Tier2"
249+
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
import lombok.extern.slf4j.Slf4j;
44

5-
import java.util.Arrays;
6-
import java.util.List;
5+
import java.util.*;
76
import java.util.concurrent.ConcurrentHashMap;
87
import java.util.concurrent.ConcurrentMap;
98

@@ -23,6 +22,14 @@ public static MethodsRateLimitTier lookupRateLimitTier(String methodName) {
2322
}
2423
}
2524

25+
public TreeMap<String, String> toMap() {
26+
TreeMap<String, String> result = new TreeMap<>(); // using TreeMap to sort the keys
27+
for (Map.Entry<String, MethodsRateLimitTier> e : methodNameToTier.entrySet()) {
28+
result.put(e.getKey(), e.getValue().name());
29+
}
30+
return result;
31+
}
32+
2633
public static void setRateLimitTier(String methodName, MethodsRateLimitTier tier) {
2734
MethodsRateLimitTier currentTier = lookupRateLimitTier(methodName);
2835
if (currentTier == null) {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package test_locally.sample_json_generation;
2+
3+
import com.slack.api.SlackConfig;
4+
import com.slack.api.methods.MethodsRateLimits;
5+
import com.slack.api.util.json.GsonFactory;
6+
import org.junit.Test;
7+
8+
import java.io.File;
9+
import java.io.IOException;
10+
import java.nio.charset.StandardCharsets;
11+
import java.nio.file.Files;
12+
import java.nio.file.Path;
13+
14+
public class RateLimitsDumpTest {
15+
// This test class generates JSON data covering the rate limits for all public endpoints.
16+
17+
static String outputDirectory = "../metadata";
18+
19+
public void dump(String path, Object obj) throws IOException {
20+
SlackConfig config = new SlackConfig();
21+
config.setPrettyResponseLoggingEnabled(true);
22+
String json = GsonFactory.createSnakeCase(config).toJson(obj);
23+
Path filePath = new File(toFilePath(path)).toPath();
24+
Files.createDirectories(filePath.getParent());
25+
Files.write(filePath, json.getBytes(StandardCharsets.UTF_8));
26+
}
27+
28+
private String toFilePath(String path) {
29+
return outputDirectory + "/" + path;
30+
}
31+
32+
@Test
33+
public void webApi() throws Exception {
34+
dump("web-api/rate_limit_tiers.json", new MethodsRateLimits().toMap());
35+
}
36+
37+
}

0 commit comments

Comments
 (0)