public async Task <UserWithTweetsToSync[]> ProcessAsync(SyncTwitterUser[] syncTwitterUsers, CancellationToken ct) { var usersWtTweets = new List <UserWithTweetsToSync>(); //TODO multithread this foreach (var user in syncTwitterUsers) { var tweets = RetrieveNewTweets(user); if (tweets.Length > 0 && user.LastTweetPostedId != -1) { var userWtTweets = new UserWithTweetsToSync { User = user, Tweets = tweets }; usersWtTweets.Add(userWtTweets); } else if (tweets.Length > 0 && user.LastTweetPostedId == -1) { var tweetId = tweets.Last().Id; var now = DateTime.UtcNow; await _twitterUserDal.UpdateTwitterUserAsync(user.Id, tweetId, tweetId, now); } else { var now = DateTime.UtcNow; await _twitterUserDal.UpdateTwitterUserAsync(user.Id, user.LastTweetPostedId, user.LastTweetSynchronizedForAllFollowersId, now); } } return(usersWtTweets.ToArray()); }
public async Task ProcessAsync(UserWithTweetsToSync userWithTweetsToSync, CancellationToken ct) { try { if (userWithTweetsToSync.Tweets.Length == 0) { _logger.LogWarning("No tweets synchronized"); return; } if (userWithTweetsToSync.Followers.Length == 0) { _logger.LogWarning("No Followers found for {User}", userWithTweetsToSync.User.Acct); return; } var userId = userWithTweetsToSync.User.Id; var followingSyncStatuses = userWithTweetsToSync.Followers.Select(x => x.FollowingsSyncStatus[userId]).ToList(); if (followingSyncStatuses.Count == 0) { _logger.LogWarning("No Followers sync found for {User}, Id: {UserId}", userWithTweetsToSync.User.Acct, userId); return; } var lastPostedTweet = userWithTweetsToSync.Tweets.Select(x => x.Id).Max(); var minimumSync = followingSyncStatuses.Min(); var now = DateTime.UtcNow; await _twitterUserDal.UpdateTwitterUserAsync(userId, lastPostedTweet, minimumSync, now); } catch (Exception e) { _logger.LogError(e, "SaveProgressionProcessor.ProcessAsync() Exception"); throw; } }
public async Task ProcessAsync_Test() { #region Stubs var user = new SyncTwitterUser { Id = 1 }; var tweet1 = new ExtractedTweet { Id = 36 }; var tweet2 = new ExtractedTweet { Id = 37 }; var follower1 = new Follower { FollowingsSyncStatus = new Dictionary <int, long> { { 1, 37 } } }; var usersWithTweets = new UserWithTweetsToSync { Tweets = new [] { tweet1, tweet2 }, Followers = new [] { follower1 }, User = user }; var loggerMock = new Mock <ILogger <SaveProgressionProcessor> >(); #endregion #region Mocks var twitterUserDalMock = new Mock <ITwitterUserDal>(MockBehavior.Strict); twitterUserDalMock .Setup(x => x.UpdateTwitterUserAsync( It.Is <int>(y => y == user.Id), It.Is <long>(y => y == tweet2.Id), It.Is <long>(y => y == tweet2.Id), It.IsAny <DateTime>() )) .Returns(Task.CompletedTask); #endregion var processor = new SaveProgressionProcessor(twitterUserDalMock.Object, loggerMock.Object); await processor.ProcessAsync(usersWithTweets, CancellationToken.None); #region Validations twitterUserDalMock.VerifyAll(); loggerMock.VerifyAll(); #endregion }
public async Task ProcessAsync(UserWithTweetsToSync userWithTweetsToSync, CancellationToken ct) { var userId = userWithTweetsToSync.User.Id; var lastPostedTweet = userWithTweetsToSync.Tweets.Select(x => x.Id).Max(); var minimumSync = userWithTweetsToSync.Followers.Select(x => x.FollowingsSyncStatus[userId]).Min(); var now = DateTime.UtcNow; await _twitterUserDal.UpdateTwitterUserAsync(userId, lastPostedTweet, minimumSync, now); }
public async Task <UserWithTweetsToSync> ProcessAsync(UserWithTweetsToSync userWithTweetsToSync, CancellationToken ct) { var user = userWithTweetsToSync.User; // Process Shared Inbox var followersWtSharedInbox = userWithTweetsToSync.Followers .Where(x => !string.IsNullOrWhiteSpace(x.SharedInboxRoute)) .ToList(); await ProcessFollowersWithSharedInbox(userWithTweetsToSync.Tweets, followersWtSharedInbox, user); // Process Inbox var followerWtInbox = userWithTweetsToSync.Followers .Where(x => string.IsNullOrWhiteSpace(x.SharedInboxRoute)) .ToList(); await ProcessFollowersWithInbox(userWithTweetsToSync.Tweets, followerWtInbox, user); return(userWithTweetsToSync); }
public async Task ProcessAsync_MultiInstances_SharedInbox_OneTweet_Test() { #region Stubs var tweetId = 1; var host1 = "domain1.ext"; var host2 = "domain2.ext"; var sharedInbox = "/inbox"; var userId1 = 2; var userId2 = 3; var userAcct = "user"; var userWithTweets = new UserWithTweetsToSync() { Tweets = new[] { new ExtractedTweet { Id = tweetId } }, User = new SyncTwitterUser { Acct = userAcct }, Followers = new[] { new Follower { Id = userId1, Host = host1, SharedInboxRoute = sharedInbox }, new Follower { Id = userId2, Host = host2, SharedInboxRoute = sharedInbox }, } }; #endregion #region Mocks var sendTweetsToInboxTaskMock = new Mock <ISendTweetsToInboxTask>(MockBehavior.Strict); var sendTweetsToSharedInboxTaskMock = new Mock <ISendTweetsToSharedInboxTask>(MockBehavior.Strict); foreach (var host in new [] { host1, host2 }) { sendTweetsToSharedInboxTaskMock .Setup(x => x.ExecuteAsync( It.Is <ExtractedTweet[]>(y => y.Length == 1), It.Is <SyncTwitterUser>(y => y.Acct == userAcct), It.Is <string>(y => y == host), It.Is <Follower[]>(y => y.Length == 1))) .Returns(Task.CompletedTask); } var loggerMock = new Mock <ILogger <SendTweetsToFollowersProcessor> >(); #endregion var processor = new SendTweetsToFollowersProcessor(sendTweetsToInboxTaskMock.Object, sendTweetsToSharedInboxTaskMock.Object, loggerMock.Object); var result = await processor.ProcessAsync(userWithTweets, CancellationToken.None); #region Validations sendTweetsToInboxTaskMock.VerifyAll(); sendTweetsToSharedInboxTaskMock.VerifyAll(); #endregion }