Skip to content

Instantly share code, notes, and snippets.

@carefree-ladka
Created May 22, 2024 15:48
Show Gist options
  • Save carefree-ladka/a2e5c973be3087d1cc508375f9e082be to your computer and use it in GitHub Desktop.
Save carefree-ladka/a2e5c973be3087d1cc508375f9e082be to your computer and use it in GitHub Desktop.
Twitter Like System
class Twitter {
constructor() {
this.users = {};
this.tweets = [];
this.followers = {};
}
postTweet(userId, content) {
const tweet = {
id: this.tweets.length,
userId,
content,
likes: 0,
timestamp: new Date().getTime()
};
this.tweets.push(tweet);
if (!this.users[userId]) {
this.users[userId] = [];
}
this.users[userId].push(tweet.id);
return tweet.id;
}
likeTweet(userId, tweetId) {
const tweet = this.tweets[tweetId];
if (tweet) {
tweet.likes++;
}
}
dislikeTweet(userId, tweetId) {
const tweet = this.tweets[tweetId];
if (tweet) {
tweet.likes--;
}
}
getTopLikedTweets(userId, k = 10) {
const userTweets = this.users[userId] || [];
const sortedTweets = userTweets.map(id => this.tweets[id])
.sort((a, b) => b.likes - a.likes);
return sortedTweets.slice(0, k);
}
follow(userId, followeeId) {
if (!this.followers[userId]) {
this.followers[userId] = new Set();
}
this.followers[userId].add(followeeId);
}
unfollow(userId, followeeId) {
if (this.followers[userId]) {
this.followers[userId].delete(followeeId);
}
}
generateNewsFeed(userId) {
let newsFeed = [];
const userTweets = this.users[userId] || [];
newsFeed.push(...userTweets.map(id => this.tweets[id]));
const followees = this.followers[userId] || new Set();
followees.forEach(followeeId => {
const followeeTweets = this.users[followeeId] || [];
newsFeed.push(...followeeTweets.map(id => this.tweets[id]));
});
newsFeed.sort((a, b) => b.timestamp - a.timestamp);
return newsFeed;
}
}
// Example Usage
const twitter = new Twitter();
const userId1 = 'user1';
const userId2 = 'user2';
twitter.postTweet(userId1, 'Hello World!');
twitter.postTweet(userId1, 'Another tweet from user1');
twitter.postTweet(userId2, 'Tweet from user2');
twitter.likeTweet(userId1, 2); // Like user2's tweet
twitter.likeTweet(userId2, 0); // Like user1's tweet
twitter.likeTweet(userId2, 1); // Like user1's tweet
twitter.follow(userId1, userId2);
console.log('User1 news feed:', twitter.generateNewsFeed(userId1));
console.log('User2 news feed:', twitter.generateNewsFeed(userId2));
console.log('Top liked tweets for user1:', twitter.getTopLikedTweets(userId1, 1));
twitter.unfollow(userId1, userId2);
console.log('User1 news feed after unfollowing user2:', twitter.generateNewsFeed(userId1));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment