Add tool for finding and updating missing archives for games
parent
15ac48caab
commit
b59b0eca0e
|
@ -8,7 +8,7 @@
|
||||||
<MenuItem RouterLink="/Settings/General">General</MenuItem>
|
<MenuItem RouterLink="/Settings/General">General</MenuItem>
|
||||||
<MenuItem RouterLink="/Settings/Users">Users</MenuItem>
|
<MenuItem RouterLink="/Settings/Users">Users</MenuItem>
|
||||||
<MenuItem RouterLink="/Settings/Authentication">Authentication</MenuItem>
|
<MenuItem RouterLink="/Settings/Authentication">Authentication</MenuItem>
|
||||||
<MenuItem RouterLink="/Settings/Tools">Tools</MenuItem>
|
<MenuItem RouterLink="/Settings/Tools" RouterMatch="@NavLinkMatch.Prefix">Tools</MenuItem>
|
||||||
</Menu>
|
</Menu>
|
||||||
</Sider>
|
</Sider>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
@page "/Settings/Tools/MissingArchives"
|
||||||
|
@using LANCommander.Models;
|
||||||
|
@using LANCommander.Pages.Games.Components;
|
||||||
|
@layout SettingsLayout
|
||||||
|
@inject IMessageService MessageService
|
||||||
|
@inject ArchiveService ArchiveService
|
||||||
|
@attribute [Authorize(Roles = "Administrator")]
|
||||||
|
|
||||||
|
<PageHeader Title="Missing Archives" />
|
||||||
|
|
||||||
|
<div style="padding: 0 24px;">
|
||||||
|
<p>
|
||||||
|
These archives are missing their backing file in the "Upload" directory of your server. This may result in broken downloads for clients. To fix, either upload a new file or delete the offending archive.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<Table TItem="Archive" DataSource="@Archives" Loading="@Loading">
|
||||||
|
<PropertyColumn Property="a => a.Version" Sortable />
|
||||||
|
<PropertyColumn Property="a => a.Game.Title" />
|
||||||
|
<PropertyColumn Property="a => a.CreatedOn" Format="MM/dd/yyyy hh:mm tt" Sortable />
|
||||||
|
<PropertyColumn Property="a => a.CreatedBy" Sortable>
|
||||||
|
@context.CreatedBy?.UserName
|
||||||
|
</PropertyColumn>
|
||||||
|
<ActionColumn Title="" Style="text-align: right">
|
||||||
|
<Space Direction="DirectionVHType.Horizontal">
|
||||||
|
<SpaceItem>
|
||||||
|
<Button OnClick="() => Upload(context)" Icon="@IconType.Outline.Upload" Type="@ButtonType.Text" />
|
||||||
|
</SpaceItem>
|
||||||
|
<SpaceItem>
|
||||||
|
<Popconfirm OnConfirm="() => Delete(context)" Title="Are you sure you want to delete this archive?">
|
||||||
|
<Button Icon="@IconType.Outline.Close" Type="@ButtonType.Text" Danger />
|
||||||
|
</Popconfirm>
|
||||||
|
</SpaceItem>
|
||||||
|
</Space>
|
||||||
|
</ActionColumn>
|
||||||
|
</Table>
|
||||||
|
|
||||||
|
<ArchiveUploader @ref="Uploader" OnArchiveUploaded="OnArchiveUploaded" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
@code {
|
||||||
|
ICollection<Archive> Archives;
|
||||||
|
bool Loading = true;
|
||||||
|
|
||||||
|
ArchiveUploader Uploader;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
await LoadData();
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task LoadData()
|
||||||
|
{
|
||||||
|
Loading = true;
|
||||||
|
|
||||||
|
Archives = new List<Archive>();
|
||||||
|
|
||||||
|
foreach (var archive in await ArchiveService.Get())
|
||||||
|
{
|
||||||
|
var archivePath = ArchiveService.GetArchiveFileLocation(archive);
|
||||||
|
var exists = await ArchiveService.Exists(archive.Id);
|
||||||
|
|
||||||
|
if (!exists)
|
||||||
|
Archives.Add(archive);
|
||||||
|
else if (new FileInfo(archivePath).Length == 0)
|
||||||
|
Archives.Add(archive);
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task Upload(Archive archive)
|
||||||
|
{
|
||||||
|
var archiveFilePath = ArchiveService.GetArchiveFileLocation(archive);
|
||||||
|
|
||||||
|
if (await ArchiveService.Exists(archive.Id))
|
||||||
|
File.Delete(archiveFilePath);
|
||||||
|
|
||||||
|
System.IO.File.Create(archiveFilePath).Close();
|
||||||
|
|
||||||
|
await Uploader.Open(archive);
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task OnArchiveUploaded(Archive archive)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await ArchiveService.Update(archive);
|
||||||
|
|
||||||
|
await LoadData();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
await MessageService.Error("Archive could not be updated.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async Task Delete(Archive archive)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await ArchiveService.Delete(archive);
|
||||||
|
|
||||||
|
await LoadData();
|
||||||
|
|
||||||
|
await MessageService.Success("Archive deleted!");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
await MessageService.Error("Archive could not be deleted.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,6 +21,12 @@
|
||||||
Some file sizes are cached in the database. Click the button below to scan through all files and recalculate their size.
|
Some file sizes are cached in the database. Click the button below to scan through all files and recalculate their size.
|
||||||
</p>
|
</p>
|
||||||
<Button Type="@ButtonType.Primary" OnClick="RecalculateFileSizes" Loading="RecalculatingFileSizes">Recalculate</Button>
|
<Button Type="@ButtonType.Primary" OnClick="RecalculateFileSizes" Loading="RecalculatingFileSizes">Recalculate</Button>
|
||||||
|
|
||||||
|
<Divider />
|
||||||
|
|
||||||
|
<h3>Missing Archives</h3>
|
||||||
|
<p>List and fix all archives that are missing their backing files.</p>
|
||||||
|
<a href="/Settings/Tools/MissingArchives" class="ant-btn ant-btn-primary">View Missing Archives</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue