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;
            }
        }
Esempio n. 3
0
        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
        }
Esempio n. 4
0
 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);
        }
Esempio n. 6
0
        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
        }