feed.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { HttpClient } from "@angular/common/http";
  2. import { Injectable } from "@angular/core";
  3. import { TwitterApiProvider } from "../twitter-api/twitter-api";
  4. import { P2pDatabaseGunProvider } from "../p2p-database-gun/p2p-database-gun";
  5. import { P2pStorageIpfsProvider } from "../p2p-storage-ipfs/p2p-storage-ipfs";
  6. @Injectable()
  7. export class FeedProvider {
  8. constructor(
  9. private http: HttpClient,
  10. private twitter: TwitterApiProvider,
  11. private gun: P2pDatabaseGunProvider,
  12. private ipfs: P2pStorageIpfsProvider
  13. ) {}
  14. public async loadUserTimeline(
  15. userId,
  16. oldestPublicTweet?,
  17. oldestPrivateTweet?
  18. ) {
  19. const maxId = oldestPublicTweet ? oldestPublicTweet["id_str"] : undefined;
  20. // Fetch tweets from Twitter
  21. let tweets = await this.twitter.fetchUserTimeline(userId, maxId);
  22. tweets = tweets.filter(tweet => tweet.id_str != maxId);
  23. // Determine start and end of time interval to look for private tweets
  24. const intervalStart: Date = oldestPrivateTweet
  25. ? new Date(oldestPrivateTweet["created_at"])
  26. : new Date();
  27. const intervalEnd: Date = this.getOldestTweetTimestamp(tweets);
  28. // Fetch private tweet hashs from P2P DB for corresponding interval
  29. const privateTweetHashs: string[] = await this.gun.fetchPrivateTweetHashsForUserInInterval(
  30. userId,
  31. intervalStart,
  32. intervalEnd
  33. );
  34. if (privateTweetHashs.length) {
  35. // Load private tweets from P2P storage
  36. let privateTweets = await this.ipfs.fetchTweets(privateTweetHashs);
  37. // Add user object to private tweets
  38. privateTweets = await Promise.all(
  39. privateTweets.map(async tweet => await this.addUserToTweet(tweet))
  40. );
  41. // Combine and sort tweets
  42. return tweets
  43. .concat(privateTweets)
  44. .sort((a, b) => this.sortByDateAsc(a, b));
  45. } else {
  46. return tweets;
  47. }
  48. }
  49. public async loadHomeTimeline(
  50. userId,
  51. oldestPublicTweet?,
  52. oldestPrivateTweet?
  53. ) {
  54. // Fetch tweets from Twitter
  55. const maxId = oldestPublicTweet ? oldestPublicTweet["id_str"] : undefined;
  56. let tweets = await this.twitter.fetchHomeFeed(maxId);
  57. tweets = tweets.filter(tweet => tweet.id_str != maxId);
  58. // Determine start and end of time interval to look for private tweets
  59. const intervalStart: Date = oldestPrivateTweet
  60. ? new Date(oldestPrivateTweet["created_at"])
  61. : new Date();
  62. const intervalEnd: Date = this.getOldestTweetTimestamp(tweets);
  63. // Fetch user's friends
  64. const friends = await this.twitter.fetchFriends(userId);
  65. let privateTweetHashs = [];
  66. friends.forEach(async friend => {
  67. privateTweetHashs = privateTweetHashs.concat(
  68. await this.gun.fetchPrivateTweetHashsForUserInInterval(
  69. friend.id_str,
  70. intervalStart,
  71. intervalEnd
  72. )
  73. );
  74. });
  75. // Add users private tweets
  76. privateTweetHashs = privateTweetHashs.concat(
  77. await this.gun.fetchPrivateTweetHashsForUserInInterval(
  78. userId,
  79. intervalStart,
  80. intervalEnd
  81. )
  82. );
  83. if (privateTweetHashs.length) {
  84. // Load private tweets from P2P storage
  85. let privateTweets = await this.ipfs.fetchTweets(privateTweetHashs);
  86. // Add user object to private tweets
  87. privateTweets = await Promise.all(
  88. privateTweets.map(async tweet => await this.addUserToTweet(tweet))
  89. );
  90. // Combine and sort tweets
  91. return tweets
  92. .concat(privateTweets)
  93. .sort((a, b) => this.sortByDateAsc(a, b));
  94. } else {
  95. return tweets;
  96. }
  97. }
  98. private async addUserToTweet(tweet) {
  99. tweet.user = await this.twitter.fetchUser(tweet.user_id);
  100. return tweet;
  101. }
  102. private getOldestTweetTimestamp(tweets): Date {
  103. if (tweets.length < 15) {
  104. // End of timeline is reached - load all private tweets
  105. return new Date("2018-04-01T00:00:00");
  106. } else {
  107. const lastTweetTimestamp = tweets[tweets.length - 1].created_at;
  108. return new Date(lastTweetTimestamp);
  109. }
  110. }
  111. private sortByDateAsc(a, b) {
  112. const dateA = new Date(a.created_at);
  113. const dateB = new Date(b.created_at);
  114. if (dateA > dateB) {
  115. return -1;
  116. } else if (dateA < dateB) {
  117. return 1;
  118. } else {
  119. return 0;
  120. }
  121. }
  122. }