Skip to content

Commit 9e33c00

Browse files
authored
feat: pagination for likes and retweets endpoints (#353)
* feat: pagination for likes and retweets endpoints
1 parent e96c24d commit 9e33c00

6 files changed

Lines changed: 103 additions & 28 deletions

File tree

.gitignore

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1+
test-twitter-credentials.json
12
/.idea/libraries
23
/.idea/*.xml
34
/.target
45
*.iml
56
*.class
6-
src/main/resources/twitter-credentials.json
7-
src/main/resources/twitter-credentials2.json
8-
src/main/java/com/socialmediaraiser/okhttpCache/
9-
src/main/java/io/github/redouane59/okhttpCache/
10-
src/main/java/com/socialmediaraiser/okhttpCache/*
11-
src/main/java/io/github/redouane59/okhttpCache/*
127
target/
138
*/target/**
149
*/target/*
@@ -17,8 +12,6 @@ target/
1712
/okhttpCache/*
1813
*.asc
1914
bundle.jar
20-
test-twitter-credentials.json
21-
2215
/.vscode
2316
/.settings
2417
.classpath

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,5 +194,5 @@
194194

195195
<url>https://github.com/Redouane59/twittered</url>
196196

197-
<version>2.15-SNAPSHOT</version>
197+
<version>2.15</version>
198198
</project>

src/main/java/io/github/redouane59/twitter/ITwitterClientV2.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,12 +361,20 @@ public interface ITwitterClientV2 {
361361
LikeResponse unlikeTweet(String tweetId);
362362

363363
/**
364-
* Allows you to get information about a Tweet’s liking users calling https://api.twitter.com/2/tweets/:id/liking_users
364+
* Allows you to get information about a Tweet’s all liking users calling https://api.twitter.com/2/tweets/:id/liking_users
365365
*
366366
* @param tweetId ID of the Tweet to request liking users of.
367367
*/
368368
UserList getLikingUsers(String tweetId);
369369

370+
/**
371+
* Allows you to get information about a Tweet’s liking users calling https://api.twitter.com/2/tweets/:id/liking_users
372+
*
373+
* @param tweetId ID of the Tweet to request liking users of.
374+
* @param maxResults the maximum results to be returned.
375+
*/
376+
UserList getLikingUsers(String tweetId, int maxResults);
377+
370378
/**
371379
* Allows you to get information about a user’s liked Tweets calling https://api.twitter.com/2/users/:id/liked_tweets
372380
*
@@ -443,6 +451,14 @@ public interface ITwitterClientV2 {
443451
* Allows you to get information about who has Retweeted a Tweet calling https://api.twitter.com/2/tweets/:id/retweeted_by
444452
*
445453
* @param tweetId the id of the tweet
454+
* @param maxResults the maximum results to be returned.
455+
*/
456+
UserList getRetweetingUsers(String tweetId, int maxResults);
457+
458+
/**
459+
* Allows you to get information about all users who have Retweeted a Tweet calling https://api.twitter.com/2/tweets/:id/retweeted_by
460+
*
461+
* @param tweetId the id of the tweet
446462
*/
447463
UserList getRetweetingUsers(String tweetId);
448464

src/main/java/io/github/redouane59/twitter/TwitterClient.java

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -448,20 +448,58 @@ public LikeResponse unlikeTweet(String tweetId) {
448448
}
449449

450450
@Override
451-
public UserList getRetweetingUsers(String tweetId) {
452-
String url = urlHelper.getRetweetersUrl(tweetId);
451+
public UserList getRetweetingUsers(String tweetId, int maxResults) {
452+
String url = urlHelper.getRetweetersUrl(tweetId);
453+
return getUsersRecursively(maxResults, url);
454+
}
455+
456+
457+
/**
458+
* Used for get liking users and get retweeting users endpoints recursively calls
459+
*/
460+
private UserList getUsersRecursively(int maxResults, String url) {
453461
Map<String, String> parameters = new HashMap<>();
454462
parameters.put(USER_FIELDS, ALL_USER_FIELDS);
455463
parameters.put(EXPANSION, PINNED_TWEET_ID);
456-
return getRequestHelper().getRequestWithParameters(url, parameters, UserList.class).orElseThrow(NoSuchElementException::new);
464+
UserList result = UserList.builder().data(new ArrayList<>()).meta(new UserMeta()).build();
465+
String next;
466+
467+
do {
468+
parameters.put(MAX_RESULTS, String.valueOf(Math.min(100, maxResults - result.getData().size())));
469+
Optional<UserList> userList = getRequestHelper().getRequestWithParameters(url, parameters, UserList.class);
470+
if (!userList.isPresent() || userList.get().getData() == null) {
471+
result.getMeta().setNextToken(null);
472+
break;
473+
}
474+
result.getData().addAll(userList.get().getData());
475+
476+
UserMeta meta = UserMeta.builder()
477+
.resultCount(result.getData().size())
478+
.nextToken(userList.get().getMeta().getNextToken())
479+
.build();
480+
result.setMeta(meta);
481+
next = userList.get().getMeta().getNextToken();
482+
parameters.put(AdditionalParameters.PAGINATION_TOKEN, next);
483+
} while (next != null && result.getData().size() < maxResults);
484+
485+
return result;
486+
}
487+
488+
489+
@Override
490+
public UserList getRetweetingUsers(String tweetId) {
491+
return getRetweetingUsers(tweetId, Integer.MAX_VALUE);
492+
}
493+
494+
@Override
495+
public UserList getLikingUsers(final String tweetId, int maxResults) {
496+
String url = getUrlHelper().getLikingUsersUrl(tweetId);
497+
return getUsersRecursively(maxResults, url);
457498
}
458499

459500
@Override
460501
public UserList getLikingUsers(final String tweetId) {
461-
String url = getUrlHelper().getLikingUsersUrl(tweetId);
462-
Map<String, String> parameters = new HashMap<>();
463-
parameters.put(USER_FIELDS, ALL_USER_FIELDS);
464-
return getRequestHelper().getRequestWithParameters(url, parameters, UserList.class).orElseThrow(NoSuchElementException::new);
502+
return getLikingUsers(tweetId, Integer.MAX_VALUE);
465503
}
466504

467505
@Override

src/test/java/io/github/redouane59/twitter/nrt/ITwitterClientV2Test.java

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -446,14 +446,31 @@ public void testGetTweetByIdWithExpansions() {
446446
}
447447

448448
@Test
449-
public void testGetLikingUsers() {
449+
public void testGetAllLikingUsers() {
450450
UserList result = twitterClient.getLikingUsers("1395447825366847488");
451451
assertNotNull(result.getData().get(0).getId());
452452
assertNotNull(result.getData().get(0).getName());
453453
assertNotNull(result.getData().get(0).getDisplayedName());
454454
assertNotNull(result.getData().get(0).getProfileImageUrl());
455455
assertNotNull(result.getData().get(0).getCreatedAt());
456-
assertTrue(result.getData().size() > 40);
456+
assertTrue(result.getData().size() > 105);
457+
}
458+
459+
@Test
460+
public void testGetLikingUsersWithMaxResults() {
461+
UserList result = twitterClient.getLikingUsers("1395447825366847488", 100);
462+
assertNotNull(result.getData().get(0).getId());
463+
assertNotNull(result.getData().get(0).getName());
464+
assertNotNull(result.getData().get(0).getDisplayedName());
465+
assertNotNull(result.getData().get(0).getProfileImageUrl());
466+
assertNotNull(result.getData().get(0).getCreatedAt());
467+
assertEquals(100, result.getData().size());
468+
result = twitterClient.getLikingUsers("1395447825366847488", 50);
469+
assertEquals(50, result.getData().size());
470+
result = twitterClient.getLikingUsers("1395447825366847488", 999999);
471+
assertTrue(result.getData().size() > 100);
472+
assertTrue(result.getData().size() < 1000);
473+
457474
}
458475

459476
@Test
@@ -514,17 +531,34 @@ public void testGetAllTweetCountWithParams() {
514531
}
515532

516533
@Test
517-
public void testGetRetweetingUsers() {
518-
String tweetId = "1415348607813832708";
534+
public void testAllGetRetweetingUsers() {
535+
String tweetId = "1460323737035677698";
519536
UserList result = twitterClient.getRetweetingUsers(tweetId);
520537
assertNotNull(result.getData());
521-
assertTrue(result.getData().size() > 10);
538+
assertTrue(result.getData().size() > 200);
539+
assertTrue(result.getData().size() < 400);
522540
assertNotNull(result.getData().get(0).getId());
523541
assertNotNull(result.getData().get(0).getName());
524542
assertNotNull(result.getData().get(0).getDisplayedName());
525543
assertNotNull(result.getData().get(0).getDateOfCreation());
526544
}
527545

546+
@Test
547+
public void testGetRetweetingUsersWithMaxResults() {
548+
String tweetId = "1460323737035677698";
549+
UserList result = twitterClient.getRetweetingUsers(tweetId, 50);
550+
assertNotNull(result.getData());
551+
assertNotNull(result.getData().get(0).getId());
552+
assertNotNull(result.getData().get(0).getName());
553+
assertNotNull(result.getData().get(0).getDisplayedName());
554+
assertNotNull(result.getData().get(0).getDateOfCreation());
555+
assertEquals(50, result.getData().size());
556+
result = twitterClient.getRetweetingUsers(tweetId, 150);
557+
assertEquals(150, result.getData().size());
558+
559+
560+
}
561+
528562
@Test
529563
public void testSpacesSearchAndLookup() {
530564
SpaceState expectedState = SpaceState.LIVE;

test-twitter-credentials.json

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)