diff --git a/Aaru.Server/Components/Admin/AdminNavMenu.razor b/Aaru.Server/Components/Admin/AdminNavMenu.razor index 26028b87..161f9efc 100644 --- a/Aaru.Server/Components/Admin/AdminNavMenu.razor +++ b/Aaru.Server/Components/Admin/AdminNavMenu.razor @@ -11,6 +11,9 @@ Block descriptors + + CHS + Commands diff --git a/Aaru.Server/Components/Admin/Pages/Chs/View.razor b/Aaru.Server/Components/Admin/Pages/Chs/View.razor new file mode 100644 index 00000000..d03970ce --- /dev/null +++ b/Aaru.Server/Components/Admin/Pages/Chs/View.razor @@ -0,0 +1,82 @@ +@page "/admin/chs" +@attribute [Authorize] +@layout AdminLayout + +@inject Microsoft.EntityFrameworkCore.IDbContextFactory DbContextFactory + +Chs + +@if(!_initialized) +{ +
+

Loading...

+
+ + return; +} + +
+ + + + + + + + + + @foreach(Chs item in _items) + { + + + + + + } + +
+ @DisplayNameHelper.GetDisplayName(typeof(Chs), nameof(Chs.Cylinders)) + + @DisplayNameHelper.GetDisplayName(typeof(Chs), nameof(Chs.Heads)) + + @DisplayNameHelper.GetDisplayName(typeof(Chs), nameof(Chs.Sectors)) +
+ @item.Cylinders + + @item.Heads + + @item.Sectors +
+ + @if(_duplicates.Count > 0) + { +
+ The following CHS have duplicates. + + + + @foreach(ChsModel item in _duplicates) + { + + + + } + +
+ @item.Cylinders/@item.Heads/@item.Sectors +
+
+ + + } +
+ + + +
Are you sure you want to delete the duplicates?
+
+ + + + +
\ No newline at end of file diff --git a/Aaru.Server/Components/Admin/Pages/Chs/View.razor.cs b/Aaru.Server/Components/Admin/Pages/Chs/View.razor.cs new file mode 100644 index 00000000..486a9ccb --- /dev/null +++ b/Aaru.Server/Components/Admin/Pages/Chs/View.razor.cs @@ -0,0 +1,106 @@ +using Aaru.CommonTypes.Metadata; +using Aaru.Server.Database.Models; +using BlazorBootstrap; +using Microsoft.EntityFrameworkCore; +using DbContext = Aaru.Server.Database.DbContext; + +namespace Aaru.Server.Components.Admin.Pages.Chs; + +public partial class View +{ + private Modal? _consolidateModal; + List _duplicates; + bool _initialized; + List _items; + + + /// + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + StateHasChanged(); + + await using DbContext ctx = await DbContextFactory.CreateDbContextAsync(); + + _items = await ctx.Chs.OrderBy(static c => c.Cylinders) + .ThenBy(static c => c.Heads) + .ThenBy(static c => c.Sectors) + .ToListAsync(); + + _duplicates = await ctx.Chs.GroupBy(static x => new + { + x.Cylinders, + x.Heads, + x.Sectors + }) + .Where(static x => x.Count() > 1) + .Select(static x => new ChsModel + { + Cylinders = x.Key.Cylinders, + Heads = x.Key.Heads, + Sectors = x.Key.Sectors + }) + .ToListAsync(); + + _initialized = true; + + StateHasChanged(); + } + + Task ConsolidateDuplicatesAsync() => _consolidateModal?.ShowAsync(); + + Task HideConsolidateModalAsync() => _consolidateModal?.HideAsync(); + + async Task ConfirmConsolidateAsync() + { + await using DbContext ctx = await DbContextFactory.CreateDbContextAsync(); + + foreach(ChsModel duplicate in _duplicates) + { + CommonTypes.Metadata.Chs? master = ctx.Chs.FirstOrDefault(m => m.Cylinders == duplicate.Cylinders && + m.Heads == duplicate.Heads && + m.Sectors == duplicate.Sectors); + + if(master is null) continue; + + foreach(CommonTypes.Metadata.Chs chs in await ctx.Chs.Where(m => m.Cylinders == duplicate.Cylinders && + m.Heads == duplicate.Heads && + m.Sectors == duplicate.Sectors) + .Skip(1) + .ToArrayAsync()) + { + foreach(TestedMedia media in ctx.TestedMedia.Where(d => d.CHS.Id == chs.Id)) media.CHS = master; + + foreach(TestedMedia media in ctx.TestedMedia.Where(d => d.CurrentCHS.Id == chs.Id)) + media.CurrentCHS = master; + + ctx.Chs.Remove(chs); + } + } + + await ctx.SaveChangesAsync(); + + _items = await ctx.Chs.OrderBy(static c => c.Cylinders) + .ThenBy(static c => c.Heads) + .ThenBy(static c => c.Sectors) + .ToListAsync(); + + _duplicates = await ctx.Chs.GroupBy(static x => new + { + x.Cylinders, + x.Heads, + x.Sectors + }) + .Where(static x => x.Count() > 1) + .Select(static x => new ChsModel + { + Cylinders = x.Key.Cylinders, + Heads = x.Key.Heads, + Sectors = x.Key.Sectors + }) + .ToListAsync(); + + StateHasChanged(); + } +} \ No newline at end of file