diff --git a/src/BirdsiteLive/Controllers/StatisticsController.cs b/src/BirdsiteLive/Controllers/StatisticsController.cs
index 5a9aef8..2252274 100644
--- a/src/BirdsiteLive/Controllers/StatisticsController.cs
+++ b/src/BirdsiteLive/Controllers/StatisticsController.cs
@@ -32,6 +32,7 @@ namespace BirdsiteLive.Controllers
var stats = new Models.StatisticsModels.Statistics
{
FollowersCount = await _followersDal.GetFollowersCountAsync(),
+ FailingFollowersCount = await _followersDal.GetFailingFollowersCountAsync(),
TwitterUserCount = await _twitterUserDal.GetTwitterUsersCountAsync(),
TwitterStatistics = _twitterStatistics.GetStatistics(),
ExtractionStatistics = _extractionStatistics.GetStatistics(),
diff --git a/src/BirdsiteLive/Models/StatisticsModels/Statistics.cs b/src/BirdsiteLive/Models/StatisticsModels/Statistics.cs
index a2dd693..8cb2adf 100644
--- a/src/BirdsiteLive/Models/StatisticsModels/Statistics.cs
+++ b/src/BirdsiteLive/Models/StatisticsModels/Statistics.cs
@@ -6,8 +6,10 @@ namespace BirdsiteLive.Models.StatisticsModels
public class Statistics
{
public int FollowersCount { get; set; }
+ public int FailingFollowersCount { get; set; }
public int TwitterUserCount { get; set; }
public ApiStatistics TwitterStatistics { get; set; }
public ExtractionStatistics ExtractionStatistics { get; set; }
+
}
}
\ No newline at end of file
diff --git a/src/BirdsiteLive/Views/Statistics/Index.cshtml b/src/BirdsiteLive/Views/Statistics/Index.cshtml
index c3dd57f..25a0795 100644
--- a/src/BirdsiteLive/Views/Statistics/Index.cshtml
+++ b/src/BirdsiteLive/Views/Statistics/Index.cshtml
@@ -10,6 +10,7 @@
- Twitter Users: @Model.TwitterUserCount
- Followers: @Model.FollowersCount
+ - Failing Followers: @Model.FailingFollowersCount
Twitter API (Min, Avg, Max for the last 24h)
diff --git a/src/DataAccessLayers/BirdsiteLive.DAL.Postgres/DataAccessLayers/FollowersPostgresDal.cs b/src/DataAccessLayers/BirdsiteLive.DAL.Postgres/DataAccessLayers/FollowersPostgresDal.cs
index bcdda0f..db2f9f7 100644
--- a/src/DataAccessLayers/BirdsiteLive.DAL.Postgres/DataAccessLayers/FollowersPostgresDal.cs
+++ b/src/DataAccessLayers/BirdsiteLive.DAL.Postgres/DataAccessLayers/FollowersPostgresDal.cs
@@ -53,6 +53,19 @@ namespace BirdsiteLive.DAL.Postgres.DataAccessLayers
}
}
+ public async Task GetFailingFollowersCountAsync()
+ {
+ var query = $"SELECT COUNT(*) FROM {_settings.FollowersTableName} WHERE postingErrorCount > 0";
+
+ using (var dbConnection = Connection)
+ {
+ dbConnection.Open();
+
+ var result = (await dbConnection.QueryAsync(query)).FirstOrDefault();
+ return result;
+ }
+ }
+
public async Task GetFollowerAsync(string acct, string host)
{
var query = $"SELECT * FROM {_settings.FollowersTableName} WHERE acct = @acct AND host = @host";
diff --git a/src/DataAccessLayers/BirdsiteLive.DAL/Contracts/IFollowersDal.cs b/src/DataAccessLayers/BirdsiteLive.DAL/Contracts/IFollowersDal.cs
index 86caa02..fe87b28 100644
--- a/src/DataAccessLayers/BirdsiteLive.DAL/Contracts/IFollowersDal.cs
+++ b/src/DataAccessLayers/BirdsiteLive.DAL/Contracts/IFollowersDal.cs
@@ -15,5 +15,6 @@ namespace BirdsiteLive.DAL.Contracts
Task DeleteFollowerAsync(int id);
Task DeleteFollowerAsync(string acct, string host);
Task GetFollowersCountAsync();
+ Task GetFailingFollowersCountAsync();
}
}
\ No newline at end of file
diff --git a/src/Tests/BirdsiteLive.DAL.Postgres.Tests/DataAccessLayers/FollowersPostgresDalTests.cs b/src/Tests/BirdsiteLive.DAL.Postgres.Tests/DataAccessLayers/FollowersPostgresDalTests.cs
index 62cb3e6..a22df0f 100644
--- a/src/Tests/BirdsiteLive.DAL.Postgres.Tests/DataAccessLayers/FollowersPostgresDalTests.cs
+++ b/src/Tests/BirdsiteLive.DAL.Postgres.Tests/DataAccessLayers/FollowersPostgresDalTests.cs
@@ -237,7 +237,7 @@ namespace BirdsiteLive.DAL.Postgres.Tests.DataAccessLayers
actorId = $"https://{host}/{acct}";
await dal.CreateFollowerAsync(acct, host, inboxRoute, sharedInboxRoute, actorId, following, followingSync);
- //User 2
+ //User 3
acct = "myhandle3";
host = "domain.ext";
following = new[] { 1 };
@@ -250,6 +250,54 @@ namespace BirdsiteLive.DAL.Postgres.Tests.DataAccessLayers
Assert.AreEqual(3, result);
}
+ [TestMethod]
+ public async Task CountFailingFollowersAsync()
+ {
+ var dal = new FollowersPostgresDal(_settings);
+
+ var result = await dal.GetFailingFollowersCountAsync();
+ Assert.AreEqual(0, result);
+
+ //User 1
+ var acct = "myhandle1";
+ var host = "domain.ext";
+ var following = new[] { 1, 2, 3 };
+ var followingSync = new Dictionary();
+ var inboxRoute = "/myhandle1/inbox";
+ var sharedInboxRoute = "/inbox";
+ var actorId = $"https://{host}/{acct}";
+ await dal.CreateFollowerAsync(acct, host, inboxRoute, sharedInboxRoute, actorId, following, followingSync);
+
+ //User 2
+ acct = "myhandle2";
+ host = "domain.ext";
+ following = new[] { 2, 4, 5 };
+ inboxRoute = "/myhandle2/inbox";
+ sharedInboxRoute = "/inbox2";
+ actorId = $"https://{host}/{acct}";
+ await dal.CreateFollowerAsync(acct, host, inboxRoute, sharedInboxRoute, actorId, following, followingSync);
+
+ var follower = await dal.GetFollowerAsync(acct, host);
+ follower.PostingErrorCount = 1;
+ await dal.UpdateFollowerAsync(follower);
+
+ //User 3
+ acct = "myhandle3";
+ host = "domain.ext";
+ following = new[] { 1 };
+ inboxRoute = "/myhandle3/inbox";
+ sharedInboxRoute = "/inbox3";
+ actorId = $"https://{host}/{acct}";
+ await dal.CreateFollowerAsync(acct, host, inboxRoute, sharedInboxRoute, actorId, following, followingSync);
+
+ follower = await dal.GetFollowerAsync(acct, host);
+ follower.PostingErrorCount = 50;
+ await dal.UpdateFollowerAsync(follower);
+
+ result = await dal.GetFailingFollowersCountAsync();
+ Assert.AreEqual(2, result);
+ }
+
[TestMethod]
public async Task CreateUpdateAndGetFollower_Add()
{