commit
f70cf6b5c7
14 changed files with 164 additions and 7 deletions
8
src/BirdsiteLive.Common/Settings/LogsSettings.cs
Normal file
8
src/BirdsiteLive.Common/Settings/LogsSettings.cs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
namespace BirdsiteLive.Common.Settings
|
||||||
|
{
|
||||||
|
public class LogsSettings
|
||||||
|
{
|
||||||
|
public string Type { get; set; }
|
||||||
|
public string InstrumentationKey { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,11 +4,12 @@
|
||||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||||
<UserSecretsId>d21486de-a812-47eb-a419-05682bb68856</UserSecretsId>
|
<UserSecretsId>d21486de-a812-47eb-a419-05682bb68856</UserSecretsId>
|
||||||
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||||
<Version>0.1.0</Version>
|
<Version>0.2.0</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Lamar.Microsoft.DependencyInjection" Version="4.1.0" />
|
<PackageReference Include="Lamar.Microsoft.DependencyInjection" Version="4.1.0" />
|
||||||
|
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.16.0" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.8" />
|
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.8" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.3" />
|
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
34
src/BirdsiteLive/Controllers/StatisticsController.cs
Normal file
34
src/BirdsiteLive/Controllers/StatisticsController.cs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using BirdsiteLive.DAL.Contracts;
|
||||||
|
using BirdsiteLive.Models.StatisticsModels;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
|
||||||
|
namespace BirdsiteLive.Controllers
|
||||||
|
{
|
||||||
|
public class StatisticsController : Controller
|
||||||
|
{
|
||||||
|
private readonly ITwitterUserDal _twitterUserDal;
|
||||||
|
private readonly IFollowersDal _followersDal;
|
||||||
|
|
||||||
|
#region Ctor
|
||||||
|
public StatisticsController(ITwitterUserDal twitterUserDal, IFollowersDal followersDal)
|
||||||
|
{
|
||||||
|
_twitterUserDal = twitterUserDal;
|
||||||
|
_followersDal = followersDal;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public async Task<IActionResult> Index()
|
||||||
|
{
|
||||||
|
var stats = new Statistics
|
||||||
|
{
|
||||||
|
FollowersCount = await _followersDal.GetFollowersCountAsync(),
|
||||||
|
TwitterUserCount = await _twitterUserDal.GetTwitterUsersCountAsync()
|
||||||
|
};
|
||||||
|
return View(stats);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using BirdsiteLive.Common.Settings;
|
using BirdsiteLive.Common.Settings;
|
||||||
|
using BirdsiteLive.DAL.Contracts;
|
||||||
using BirdsiteLive.Models;
|
using BirdsiteLive.Models;
|
||||||
using BirdsiteLive.Models.WellKnownModels;
|
using BirdsiteLive.Models.WellKnownModels;
|
||||||
using BirdsiteLive.Twitter;
|
using BirdsiteLive.Twitter;
|
||||||
|
@ -15,12 +16,14 @@ namespace BirdsiteLive.Controllers
|
||||||
public class WellKnownController : ControllerBase
|
public class WellKnownController : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly ITwitterService _twitterService;
|
private readonly ITwitterService _twitterService;
|
||||||
|
private readonly ITwitterUserDal _twitterUserDal;
|
||||||
private readonly InstanceSettings _settings;
|
private readonly InstanceSettings _settings;
|
||||||
|
|
||||||
#region Ctor
|
#region Ctor
|
||||||
public WellKnownController(InstanceSettings settings, ITwitterService twitterService)
|
public WellKnownController(InstanceSettings settings, ITwitterService twitterService, ITwitterUserDal twitterUserDal)
|
||||||
{
|
{
|
||||||
_twitterService = twitterService;
|
_twitterService = twitterService;
|
||||||
|
_twitterUserDal = twitterUserDal;
|
||||||
_settings = settings;
|
_settings = settings;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -48,9 +51,10 @@ namespace BirdsiteLive.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
[Route("/nodeinfo/{id}.json")]
|
[Route("/nodeinfo/{id}.json")]
|
||||||
public IActionResult NodeInfo(string id)
|
public async Task<IActionResult> NodeInfo(string id)
|
||||||
{
|
{
|
||||||
var version = System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString(3);
|
var version = System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString(3);
|
||||||
|
var twitterUsersCount = await _twitterUserDal.GetTwitterUsersCountAsync();
|
||||||
|
|
||||||
if (id == "2.0")
|
if (id == "2.0")
|
||||||
{
|
{
|
||||||
|
@ -62,7 +66,7 @@ namespace BirdsiteLive.Controllers
|
||||||
localPosts = 0,
|
localPosts = 0,
|
||||||
users = new Users()
|
users = new Users()
|
||||||
{
|
{
|
||||||
total = 0
|
total = twitterUsersCount
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
software = new Software()
|
software = new Software()
|
||||||
|
@ -97,7 +101,7 @@ namespace BirdsiteLive.Controllers
|
||||||
localPosts = 0,
|
localPosts = 0,
|
||||||
users = new Users()
|
users = new Users()
|
||||||
{
|
{
|
||||||
total = 0
|
total = twitterUsersCount
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
software = new SoftwareV21()
|
software = new SoftwareV21()
|
||||||
|
|
8
src/BirdsiteLive/Models/StatisticsModels/Statistics.cs
Normal file
8
src/BirdsiteLive/Models/StatisticsModels/Statistics.cs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
namespace BirdsiteLive.Models.StatisticsModels
|
||||||
|
{
|
||||||
|
public class Statistics
|
||||||
|
{
|
||||||
|
public int FollowersCount { get; set; }
|
||||||
|
public int TwitterUserCount { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -38,8 +38,12 @@ namespace BirdsiteLive
|
||||||
// This method gets called by the runtime. Use this method to add services to the container.
|
// This method gets called by the runtime. Use this method to add services to the container.
|
||||||
public void ConfigureServices(IServiceCollection services)
|
public void ConfigureServices(IServiceCollection services)
|
||||||
{
|
{
|
||||||
//services.Configure<InstanceSettings>(Configuration.GetSection("Instance"));
|
var logsSettings = Configuration.GetSection("Logging").Get<LogsSettings>();
|
||||||
//services.Configure<TwitterSettings>(Configuration.GetSection("Twitter"));
|
if(string.Equals("insights", logsSettings.Type, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
var key = logsSettings.InstrumentationKey;
|
||||||
|
services.AddApplicationInsightsTelemetry(key);
|
||||||
|
}
|
||||||
|
|
||||||
services.AddControllersWithViews();
|
services.AddControllersWithViews();
|
||||||
}
|
}
|
||||||
|
@ -55,6 +59,9 @@ namespace BirdsiteLive
|
||||||
var dbSettings = Configuration.GetSection("Db").Get<DbSettings>();
|
var dbSettings = Configuration.GetSection("Db").Get<DbSettings>();
|
||||||
services.For<DbSettings>().Use(x => dbSettings);
|
services.For<DbSettings>().Use(x => dbSettings);
|
||||||
|
|
||||||
|
var logsSettings = Configuration.GetSection("Logging").Get<LogsSettings>();
|
||||||
|
services.For<LogsSettings>().Use(x => logsSettings);
|
||||||
|
|
||||||
if (string.Equals(dbSettings.Type, DbTypes.Postgres, StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(dbSettings.Type, DbTypes.Postgres, StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
var connString = $"Host={dbSettings.Host};Username={dbSettings.User};Password={dbSettings.Password};Database={dbSettings.Name}";
|
var connString = $"Host={dbSettings.Host};Username={dbSettings.User};Password={dbSettings.Password};Database={dbSettings.Name}";
|
||||||
|
|
12
src/BirdsiteLive/Views/Statistics/Index.cshtml
Normal file
12
src/BirdsiteLive/Views/Statistics/Index.cshtml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
@model BirdsiteLive.Models.StatisticsModels.Statistics
|
||||||
|
|
||||||
|
@{
|
||||||
|
ViewBag.Title = "Statistics";
|
||||||
|
}
|
||||||
|
|
||||||
|
<h2>Statistics</h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Twitter Users: @Model.TwitterUserCount</li>
|
||||||
|
<li>Followers: @Model.FollowersCount</li>
|
||||||
|
</ul>
|
|
@ -1,5 +1,7 @@
|
||||||
{
|
{
|
||||||
"Logging": {
|
"Logging": {
|
||||||
|
"Type": "none",
|
||||||
|
"InstrumentationKey": "key",
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Information",
|
"Default": "Information",
|
||||||
"Microsoft": "Warning",
|
"Microsoft": "Warning",
|
||||||
|
|
|
@ -40,6 +40,19 @@ namespace BirdsiteLive.DAL.Postgres.DataAccessLayers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<int> GetFollowersCountAsync()
|
||||||
|
{
|
||||||
|
var query = $"SELECT COUNT(*) FROM {_settings.FollowersTableName}";
|
||||||
|
|
||||||
|
using (var dbConnection = Connection)
|
||||||
|
{
|
||||||
|
dbConnection.Open();
|
||||||
|
|
||||||
|
var result = (await dbConnection.QueryAsync<int>(query)).FirstOrDefault();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<Follower> GetFollowerAsync(string acct, string host)
|
public async Task<Follower> GetFollowerAsync(string acct, string host)
|
||||||
{
|
{
|
||||||
var query = $"SELECT * FROM {_settings.FollowersTableName} WHERE acct = @acct AND host = @host";
|
var query = $"SELECT * FROM {_settings.FollowersTableName} WHERE acct = @acct AND host = @host";
|
||||||
|
|
|
@ -49,6 +49,19 @@ namespace BirdsiteLive.DAL.Postgres.DataAccessLayers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<int> GetTwitterUsersCountAsync()
|
||||||
|
{
|
||||||
|
var query = $"SELECT COUNT(*) FROM {_settings.TwitterUserTableName}";
|
||||||
|
|
||||||
|
using (var dbConnection = Connection)
|
||||||
|
{
|
||||||
|
dbConnection.Open();
|
||||||
|
|
||||||
|
var result = (await dbConnection.QueryAsync<int>(query)).FirstOrDefault();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<SyncTwitterUser[]> GetAllTwitterUsersAsync()
|
public async Task<SyncTwitterUser[]> GetAllTwitterUsersAsync()
|
||||||
{
|
{
|
||||||
var query = $"SELECT * FROM {_settings.TwitterUserTableName}";
|
var query = $"SELECT * FROM {_settings.TwitterUserTableName}";
|
||||||
|
|
|
@ -13,5 +13,6 @@ namespace BirdsiteLive.DAL.Contracts
|
||||||
Task UpdateFollowerAsync(Follower follower);
|
Task UpdateFollowerAsync(Follower follower);
|
||||||
Task DeleteFollowerAsync(int id);
|
Task DeleteFollowerAsync(int id);
|
||||||
Task DeleteFollowerAsync(string acct, string host);
|
Task DeleteFollowerAsync(string acct, string host);
|
||||||
|
Task<int> GetFollowersCountAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -10,5 +10,6 @@ namespace BirdsiteLive.DAL.Contracts
|
||||||
Task<SyncTwitterUser[]> GetAllTwitterUsersAsync();
|
Task<SyncTwitterUser[]> GetAllTwitterUsersAsync();
|
||||||
Task UpdateTwitterUserAsync(int id, long lastTweetPostedId, long lastTweetSynchronizedForAllFollowersId);
|
Task UpdateTwitterUserAsync(int id, long lastTweetPostedId, long lastTweetSynchronizedForAllFollowersId);
|
||||||
Task DeleteTwitterUserAsync(string acct);
|
Task DeleteTwitterUserAsync(string acct);
|
||||||
|
Task<int> GetTwitterUsersCountAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -137,6 +137,43 @@ namespace BirdsiteLive.DAL.Postgres.Tests.DataAccessLayers
|
||||||
Assert.AreEqual(0, result.Length);
|
Assert.AreEqual(0, result.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public async Task CountFollowersAsync()
|
||||||
|
{
|
||||||
|
var dal = new FollowersPostgresDal(_settings);
|
||||||
|
|
||||||
|
var result = await dal.GetFollowersCountAsync();
|
||||||
|
Assert.AreEqual(0, result);
|
||||||
|
|
||||||
|
//User 1
|
||||||
|
var acct = "myhandle1";
|
||||||
|
var host = "domain.ext";
|
||||||
|
var following = new[] { 1, 2, 3 };
|
||||||
|
var followingSync = new Dictionary<int, long>();
|
||||||
|
var inboxRoute = "/myhandle1/inbox";
|
||||||
|
var sharedInboxRoute = "/inbox";
|
||||||
|
await dal.CreateFollowerAsync(acct, host, inboxRoute, sharedInboxRoute, following, followingSync);
|
||||||
|
|
||||||
|
//User 2
|
||||||
|
acct = "myhandle2";
|
||||||
|
host = "domain.ext";
|
||||||
|
following = new[] { 2, 4, 5 };
|
||||||
|
inboxRoute = "/myhandle2/inbox";
|
||||||
|
sharedInboxRoute = "/inbox2";
|
||||||
|
await dal.CreateFollowerAsync(acct, host, inboxRoute, sharedInboxRoute, following, followingSync);
|
||||||
|
|
||||||
|
//User 2
|
||||||
|
acct = "myhandle3";
|
||||||
|
host = "domain.ext";
|
||||||
|
following = new[] { 1 };
|
||||||
|
inboxRoute = "/myhandle3/inbox";
|
||||||
|
sharedInboxRoute = "/inbox3";
|
||||||
|
await dal.CreateFollowerAsync(acct, host, inboxRoute, sharedInboxRoute, following, followingSync);
|
||||||
|
|
||||||
|
result = await dal.GetFollowersCountAsync();
|
||||||
|
Assert.AreEqual(3, result);
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public async Task CreateUpdateAndGetFollower_Add()
|
public async Task CreateUpdateAndGetFollower_Add()
|
||||||
{
|
{
|
||||||
|
|
|
@ -115,5 +115,21 @@ namespace BirdsiteLive.DAL.Postgres.Tests.DataAccessLayers
|
||||||
Assert.IsFalse(result[0].LastTweetPostedId == default);
|
Assert.IsFalse(result[0].LastTweetPostedId == default);
|
||||||
Assert.IsFalse(result[0].LastTweetSynchronizedForAllFollowersId == default);
|
Assert.IsFalse(result[0].LastTweetSynchronizedForAllFollowersId == default);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public async Task CountTwitterUsers()
|
||||||
|
{
|
||||||
|
var dal = new TwitterUserPostgresDal(_settings);
|
||||||
|
for (var i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
var acct = $"myid{i}";
|
||||||
|
var lastTweetId = 1548L;
|
||||||
|
|
||||||
|
await dal.CreateTwitterUserAsync(acct, lastTweetId);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = await dal.GetTwitterUsersCountAsync();
|
||||||
|
Assert.AreEqual(10, result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue