import { OAuth2 } from 'oauth'; const Twitter = require('twitter'); async function getFollowing(handle, consumerKey, consumerSecret) { const url = 'friends/list'; const oauth2 = new OAuth2( consumerKey, consumerSecret, 'https://api.twitter.com/', null, 'oauth2/token', null ); return new Promise(resolve => { oauth2.getOAuthAccessToken( '', { grant_type: 'client_credentials', }, (error, accessToken) => { resolve(accessToken); } ); }) .then(accessToken => { const client = new Twitter({ consumer_key: consumerKey, consumer_secret: consumerSecret, bearer_token: accessToken, }); const params = { screen_name: handle }; return client .get(url, params) .then(followers => { // console.log(followers); const followerArray = []; for (let i = 0; i < followers.users.length; i += 1) { followerArray.push(followers.users[i].screen_name); } // console.log(followerArray); return followerArray; }) .catch(error => { throw error; }); }) .catch(error => error); } async function getUserTweets(args) { const url = 'statuses/user_timeline'; const oauth2 = new OAuth2( args.consumer_key, args.consumer_secret, 'https://api.twitter.com/', null, 'oauth2/token', null ); return new Promise(resolve => { oauth2.getOAuthAccessToken( '', { grant_type: 'client_credentials', }, (error, accessToken) => { resolve(accessToken); } ); }) .then(accessToken => { const client = new Twitter({ consumer_key: args.consumer_key, consumer_secret: args.consumer_secret, bearer_token: accessToken, }); const params = { screen_name: args.handle }; return client .get(url, params) .then(tweets => { const tweetArray = []; let listOfTweets; if (tweets.length <= 0) { listOfTweets = { name: '', handle: args.handle, location: '', description: '', followers_count: 0, friends_count: 0, favourites_count: 0, following: [], }; } return getFollowing( args.handle, args.consumer_key, args.consumer_secret ).then(data => { if (tweets.length >= 1) { listOfTweets = { name: tweets[0].user.name, handle: tweets[0].user.screen_name, location: tweets[0].user.location, description: tweets[0].user.description, followers_count: tweets[0].user.followers_count, friends_count: tweets[0].user.friends_count, favourites_count: tweets[0].user.favourites_count, following: data, }; } for (let i = 0; i < tweets.length; i += 1) { const t = { tweet: tweets[i].text, tweet_id: tweets[i].id_str, favorited: tweets[i].favorited, retweeted: tweets[i].retweeted, retweet_count: tweets[i].retweet_count, }; tweetArray.push(t); } tweetArray.sort((a, b) => b.retweet_count - a.retweet_count); const [topTweet] = tweetArray; listOfTweets.topTweet = topTweet; listOfTweets.tweets = { items: tweetArray }; return listOfTweets; }); }) .catch(error => { throw error; }); }) .catch(error => error); } // eslint-disable-next-line import/prefer-default-export export const resolvers = { Query: { getUserInfo: (root, args) => getUserTweets(args), }, };