diff --git a/src/BirdsiteLive.Pipeline/Processors/SaveProgressionProcessor.cs b/src/BirdsiteLive.Pipeline/Processors/SaveProgressionProcessor.cs index c7cbc36..c2f3ff5 100644 --- a/src/BirdsiteLive.Pipeline/Processors/SaveProgressionProcessor.cs +++ b/src/BirdsiteLive.Pipeline/Processors/SaveProgressionProcessor.cs @@ -5,27 +5,57 @@ using System.Threading.Tasks; using BirdsiteLive.DAL.Contracts; using BirdsiteLive.Pipeline.Contracts; using BirdsiteLive.Pipeline.Models; +using Microsoft.Extensions.Logging; namespace BirdsiteLive.Pipeline.Processors { public class SaveProgressionProcessor : ISaveProgressionProcessor { private readonly ITwitterUserDal _twitterUserDal; - + private readonly ILogger _logger; + #region Ctor - public SaveProgressionProcessor(ITwitterUserDal twitterUserDal) + public SaveProgressionProcessor(ITwitterUserDal twitterUserDal, ILogger logger) { _twitterUserDal = twitterUserDal; + _logger = logger; } #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); + 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; + } } } } \ No newline at end of file diff --git a/src/Tests/BirdsiteLive.Pipeline.Tests/Processors/SaveProgressionProcessorTests.cs b/src/Tests/BirdsiteLive.Pipeline.Tests/Processors/SaveProgressionProcessorTests.cs index b2a99b9..c95eed6 100644 --- a/src/Tests/BirdsiteLive.Pipeline.Tests/Processors/SaveProgressionProcessorTests.cs +++ b/src/Tests/BirdsiteLive.Pipeline.Tests/Processors/SaveProgressionProcessorTests.cs @@ -8,6 +8,7 @@ using BirdsiteLive.Pipeline.Models; using BirdsiteLive.Pipeline.Processors; using BirdsiteLive.Twitter.Models; using Castle.DynamicProxy.Contributors; +using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; @@ -53,6 +54,8 @@ namespace BirdsiteLive.Pipeline.Tests.Processors }, User = user }; + + var loggerMock = new Mock>(); #endregion #region Mocks @@ -67,11 +70,12 @@ namespace BirdsiteLive.Pipeline.Tests.Processors .Returns(Task.CompletedTask); #endregion - var processor = new SaveProgressionProcessor(twitterUserDalMock.Object); + var processor = new SaveProgressionProcessor(twitterUserDalMock.Object, loggerMock.Object); await processor.ProcessAsync(usersWithTweets, CancellationToken.None); #region Validations twitterUserDalMock.VerifyAll(); + loggerMock.VerifyAll(); #endregion } @@ -129,13 +133,16 @@ namespace BirdsiteLive.Pipeline.Tests.Processors It.IsAny() )) .Returns(Task.CompletedTask); + + var loggerMock = new Mock>(); #endregion - var processor = new SaveProgressionProcessor(twitterUserDalMock.Object); + var processor = new SaveProgressionProcessor(twitterUserDalMock.Object, loggerMock.Object); await processor.ProcessAsync(usersWithTweets, CancellationToken.None); #region Validations twitterUserDalMock.VerifyAll(); + loggerMock.VerifyAll(); #endregion } @@ -201,13 +208,16 @@ namespace BirdsiteLive.Pipeline.Tests.Processors It.IsAny() )) .Returns(Task.CompletedTask); + + var loggerMock = new Mock>(); #endregion - var processor = new SaveProgressionProcessor(twitterUserDalMock.Object); + var processor = new SaveProgressionProcessor(twitterUserDalMock.Object, loggerMock.Object); await processor.ProcessAsync(usersWithTweets, CancellationToken.None); #region Validations twitterUserDalMock.VerifyAll(); + loggerMock.VerifyAll(); #endregion } }