mirror of
https://github.com/aaru-dps/Aaru.Server.git
synced 2025-12-16 19:24:27 +00:00
Add statistics page (empty).
This commit is contained in:
@@ -23,4 +23,8 @@
|
|||||||
<Folder Include="wwwroot\assets\"/>
|
<Folder Include="wwwroot\assets\"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Aaru.Server.Database\Aaru.Server.Database.csproj"/>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -20,6 +20,12 @@
|
|||||||
</NavLink>
|
</NavLink>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="nav-item px-3">
|
||||||
|
<NavLink class="nav-link" href="Stats">
|
||||||
|
<span aria-hidden="true" class="bi bi-graph-up-nav-menu"></span> Statistics
|
||||||
|
</NavLink>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="nav-item px-3 sidebar-nav">
|
<div class="nav-item px-3 sidebar-nav">
|
||||||
@((MarkupString)_sidebarMarkup)
|
@((MarkupString)_sidebarMarkup)
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -66,6 +66,10 @@
|
|||||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-arrow-bar-left' viewBox='0 0 16 16'%3E%3Cpath d='M12.5 15a.5.5 0 0 1-.5-.5v-13a.5.5 0 0 1 1 0v13a.5.5 0 0 1-.5.5ZM10 8a.5.5 0 0 1-.5.5H3.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L3.707 7.5H9.5a.5.5 0 0 1 .5.5Z'/%3E%3C/svg%3E");
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-arrow-bar-left' viewBox='0 0 16 16'%3E%3Cpath d='M12.5 15a.5.5 0 0 1-.5-.5v-13a.5.5 0 0 1 1 0v13a.5.5 0 0 1-.5.5ZM10 8a.5.5 0 0 1-.5.5H3.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L3.707 7.5H9.5a.5.5 0 0 1 .5.5Z'/%3E%3C/svg%3E");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.bi-graph-up-nav-menu {
|
||||||
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-graph-up' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M0 0h1v15h15v1H0zm14.817 3.113a.5.5 0 0 1 .07.704l-4.5 5.5a.5.5 0 0 1-.74.037L7.06 6.767l-3.656 5.027a.5.5 0 0 1-.808-.588l4-5.5a.5.5 0 0 1 .758-.06l2.609 2.61 4.15-5.073a.5.5 0 0 1 .704-.07'/%3E%3C/svg%3E");
|
||||||
|
}
|
||||||
|
|
||||||
.nav-item {
|
.nav-item {
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
padding-bottom: 0.5rem;
|
padding-bottom: 0.5rem;
|
||||||
|
|||||||
6
Aaru.Server.New/Components/Pages/Stats.razor
Normal file
6
Aaru.Server.New/Components/Pages/Stats.razor
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
@page "/Stats"
|
||||||
|
@using Aaru.Server.Database
|
||||||
|
|
||||||
|
@inject Microsoft.EntityFrameworkCore.IDbContextFactory<DbContext> DbContextFactory
|
||||||
|
|
||||||
|
<PageTitle>Aaru: Statistics</PageTitle>
|
||||||
129
Aaru.Server.New/Components/Pages/Stats.razor.cs
Normal file
129
Aaru.Server.New/Components/Pages/Stats.razor.cs
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
using Aaru.CommonTypes.Interop;
|
||||||
|
using Aaru.CommonTypes.Metadata;
|
||||||
|
using Aaru.Server.Database.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using DbContext = Aaru.Server.Database.DbContext;
|
||||||
|
using PlatformID = Aaru.CommonTypes.Interop.PlatformID;
|
||||||
|
|
||||||
|
namespace Aaru.Server.New.Components.Pages;
|
||||||
|
|
||||||
|
public partial class Stats
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
await base.OnInitializedAsync();
|
||||||
|
|
||||||
|
// TOOD: Cache real OS name in database, lookups would be much faster
|
||||||
|
await using DbContext _ctx = await DbContextFactory.CreateDbContextAsync();
|
||||||
|
|
||||||
|
var operatingSystems = (await _ctx.OperatingSystems.OrderBy(static os => os.Name)
|
||||||
|
.ThenBy(static os => os.Version)
|
||||||
|
.Select(static nvs => new NameValueStats
|
||||||
|
{
|
||||||
|
name =
|
||||||
|
$"{GetPlatformName(nvs.Name, nvs.Version)}{(string.IsNullOrEmpty(nvs.Version) ? "" : " ")}{nvs.Version}",
|
||||||
|
Value = nvs.Count
|
||||||
|
})
|
||||||
|
.ToListAsync()).OrderBy(static os => os.name)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var versions = (await _ctx.Versions.Select(static nvs => new NameValueStats
|
||||||
|
{
|
||||||
|
name = nvs.Name == "previous" ? "Previous than 3.4.99.0" : nvs.Name,
|
||||||
|
Value = nvs.Count
|
||||||
|
})
|
||||||
|
.ToListAsync()).OrderBy(static version => version.name)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
List<Command> commands = await _ctx.Commands.OrderBy(static c => c.Name).ToListAsync();
|
||||||
|
|
||||||
|
List<Filter> filters = await _ctx.Filters.OrderBy(static filter => filter.Name).ToListAsync();
|
||||||
|
|
||||||
|
List<MediaFormat> mediaImages = await _ctx.MediaFormats.OrderBy(static format => format.Name).ToListAsync();
|
||||||
|
|
||||||
|
List<Partition> partitions = await _ctx.Partitions.OrderBy(static partition => partition.Name).ToListAsync();
|
||||||
|
|
||||||
|
List<Filesystem> filesystems =
|
||||||
|
await _ctx.Filesystems.OrderBy(static filesystem => filesystem.Name).ToListAsync();
|
||||||
|
|
||||||
|
List<MediaItem> realMedia = [];
|
||||||
|
List<MediaItem> virtualMedia = [];
|
||||||
|
|
||||||
|
await foreach(Media nvs in _ctx.Medias.AsAsyncEnumerable())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
(string type, string subType) mediaType =
|
||||||
|
MediaType.MediaTypeToString((CommonTypes.MediaType)Enum.Parse(typeof(CommonTypes.MediaType),
|
||||||
|
nvs.Type));
|
||||||
|
|
||||||
|
if(nvs.Real)
|
||||||
|
{
|
||||||
|
realMedia.Add(new MediaItem
|
||||||
|
{
|
||||||
|
Type = mediaType.type,
|
||||||
|
SubType = mediaType.subType,
|
||||||
|
Count = nvs.Count
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
virtualMedia.Add(new MediaItem
|
||||||
|
{
|
||||||
|
Type = mediaType.type,
|
||||||
|
SubType = mediaType.subType,
|
||||||
|
Count = nvs.Count
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
if(nvs.Real)
|
||||||
|
{
|
||||||
|
realMedia.Add(new MediaItem
|
||||||
|
{
|
||||||
|
Type = nvs.Type,
|
||||||
|
SubType = null,
|
||||||
|
Count = nvs.Count
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
virtualMedia.Add(new MediaItem
|
||||||
|
{
|
||||||
|
Type = nvs.Type,
|
||||||
|
SubType = null,
|
||||||
|
Count = nvs.Count
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
realMedia = realMedia.OrderBy(static media => media.Type).ThenBy(static media => media.SubType).ToList();
|
||||||
|
virtualMedia = virtualMedia.OrderBy(static media => media.Type).ThenBy(static media => media.SubType).ToList();
|
||||||
|
|
||||||
|
|
||||||
|
List<DeviceItem> devices = await _ctx.DeviceStats.Include(static deviceStat => deviceStat.Report)
|
||||||
|
.Select(static device => new DeviceItem
|
||||||
|
{
|
||||||
|
Manufacturer = device.Manufacturer,
|
||||||
|
Model = device.Model,
|
||||||
|
Revision = device.Revision,
|
||||||
|
Bus = device.Bus,
|
||||||
|
ReportId = device.Report != null && device.Report.Id != 0
|
||||||
|
? device.Report.Id
|
||||||
|
: 0
|
||||||
|
})
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
devices = devices.OrderBy(static device => device.Manufacturer)
|
||||||
|
.ThenBy(static device => device.Model)
|
||||||
|
.ThenBy(static device => device.Revision)
|
||||||
|
.ThenBy(static device => device.Bus)
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
static string GetPlatformName(string name, string version) =>
|
||||||
|
DetectOS.GetPlatformName((PlatformID)Enum.Parse(typeof(PlatformID), name), version);
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ using Aaru.Server.New.Components.Account;
|
|||||||
using Microsoft.AspNetCore.Components.Authorization;
|
using Microsoft.AspNetCore.Components.Authorization;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using DbContext = Aaru.Server.Database.DbContext;
|
||||||
|
|
||||||
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
|
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
@@ -24,10 +25,10 @@ builder.Services.AddAuthentication(options =>
|
|||||||
string connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ??
|
string connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ??
|
||||||
throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
|
throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
|
||||||
|
|
||||||
builder.Services.AddDbContext<DbContext>(options => options
|
builder.Services.AddDbContextFactory<DbContext>(options => options
|
||||||
.UseMySql(connectionString,
|
.UseMySql(connectionString,
|
||||||
new MariaDbServerVersion(new Version(10, 4, 0)))
|
new MariaDbServerVersion(new Version(10, 4, 0)))
|
||||||
.UseLazyLoadingProxies());
|
.UseLazyLoadingProxies());
|
||||||
|
|
||||||
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
|
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user