LANCommander/LANCommander.Server/UI/Pages/Settings/Updates.razor
Pat Hartl add770b227 Refactor Settings
Settings for the server are now combined with the settings from the SDK. This introduces a large breaking change and a migration should be created. This refactor utilizes .NET Configuration and the Options pattern. This will allow for the overriding of any setting using envionment variables. It also means that Settings.yml can be used to override any .NET configuration. A SettingsProvider implementation was created, and any updating of settings was changed from SettingsService.SaveSettings() to SettingsProvider.Update(s => { ... })
2025-11-16 12:31:25 -06:00

146 lines
5 KiB
Text

@page "/Settings/Updates"
@using LANCommander.Server.Services.Abstractions
@using LANCommander.Server.Settings
@using LANCommander.Server.Settings.Enums
@using Markdig
@using Microsoft.Extensions.Options
@using Octokit
@using Semver
@inject IMessageService MessageService
@inject UpdateService UpdateService
@inject IGitHubService GitHubService
@inject IVersionProvider VersionProvider
@inject ILogger<Updates> Logger
@inject IOptions<Settings> Settings
@inject SettingsProvider<Settings> SettingsProvider
@attribute [Authorize(Roles = RoleService.AdministratorRoleName)]
<PageHeader Title="Updates">
<PageHeaderExtra>
<Flex Justify="FlexJustify.End" Align="FlexAlign.Center" Gap="FlexGap.Small">
Release Channel:
<EnumSelect TEnum="ReleaseChannel" OnSelectedItemChanged="ReleaseChannelChanged" @bind-Value="Settings.Value.Server.Update.ReleaseChannel" Disabled="Loading" />
<Button Type="@ButtonType.Primary" OnClick="Update" Disabled="@(!UpdateAvailable || Updating)" Loading="Updating">Update</Button>
</Flex>
</PageHeaderExtra>
</PageHeader>
<PageContent>
<Flex Direction="FlexDirection.Vertical" Gap="FlexGap.Small">
@if (!Loading && !UpdateAvailable)
{
<Alert Type="@AlertType.Success" Message="You are on the latest version!" ShowIcon="true" />
}
else if (!Loading && UpdateAvailable)
{
<Alert Type="@AlertType.Info" Message="A newer version of LANCommander is available" ShowIcon="true" />
}
else
{
<Alert Type="@AlertType.Warning" Message="Loading release information..." ShowIcon="true" />
}
@if (Releases != null && Releases.Count() > 0)
{
foreach (var release in Releases)
{
<Card Title="@release.Name">
<TitleTemplate>
@release.Name <span style="font-size: 70%; margin-right: 6px;">@release.PublishedAt.GetValueOrDefault().ToString("MMMM d yyyy")</span>
@if (Releases.First().Equals(release))
{
<Tag Color="@PresetColor.Gold.ToString()">Latest</Tag>
}
@if (release.TagName == $"v{CurrentVersion}")
{
<Tag Color="@PresetColor.Blue.ToString()">Current</Tag>
}
</TitleTemplate>
<Extra>
<a href="@release.HtmlUrl" target="_blank">View Release</a>
</Extra>
<Body>
@((MarkupString)Markdown.ToHtml(release.Body))
</Body>
</Card>
}
}
else
{
for (var i = 0; i < 5; i++)
{
<Card Loading="true" Style="width: 100%;"></Card>
}
}
</Flex>
</PageContent>
@code {
string RootPath = Path.GetPathRoot(Directory.GetCurrentDirectory());
bool Loading { get; set; } = true;
bool Updating { get; set; } = false;
bool UpdateAvailable { get; set; } = false;
SemVersion LatestVersion { get; set; }
SemVersion CurrentVersion { get; set; }
IEnumerable<Release> Releases { get; set; } = new List<Release>();
protected override async Task OnInitializedAsync()
{
await CheckForUpdate();
}
async Task CheckForUpdate()
{
Loading = true;
await InvokeAsync(StateHasChanged);
await Task.Yield();
CurrentVersion = VersionProvider.GetCurrentVersion();
UpdateAvailable = await UpdateService.UpdateAvailableAsync();
LatestVersion = await GitHubService.GetLatestVersionAsync(Settings.Value.Server.Update.ReleaseChannel);
Releases = await GitHubService.GetReleasesAsync(5);
Loading = false;
await InvokeAsync(StateHasChanged);
await Task.Yield();
}
async Task ReleaseChannelChanged(ReleaseChannel releaseChannel)
{
if (!Loading)
{
SettingsProvider.Update(s =>
{
s.Server.Update.ReleaseChannel = releaseChannel;
});
MessageService.Success($"Changed release channel to {releaseChannel}!");
}
}
async Task Update()
{
try {
Updating = true;
if (Settings.Value.Server.Launcher.HostUpdates)
await UpdateService.DownloadLauncherReleaseAsync(Releases.First());
await UpdateService.DownloadServerReleaseAsync(Releases.First());
}
catch (NotImplementedException ex) {
MessageService.Error(ex.Message);
Logger.LogError(ex, "An unknown error occurred.");
}
catch (Exception ex)
{
MessageService.Error("An unknown error occurred while updating. Please check the logs");
Logger.LogError(ex, "An unknown error occurred.");
}
}
}