@page "/admin/servers/nodes" @using MoonCore.Blazor.Tailwind.Alerts @using MoonCore.Helpers @using MoonCore.Models @using MoonlightServers.Shared.Http.Responses.Admin.Nodes @using MoonCore.Blazor.Tailwind.Components @using MoonCore.Blazor.Tailwind.Dt @using MoonCore.Blazor.Tailwind.Toasts @using MoonlightServers.Frontend.Services @using MoonlightServers.Shared.Http.Responses.Admin.Nodes.Sys @inject HttpApiClient ApiClient @inject NodeService NodeService @inject AlertService AlertService @inject ToastService ToastService @attribute [Authorize(Policy = "permissions:admin.servers.nodes.get")]
Create
@context.Name @{ bool isFetched; NodeSystemStatusResponse? data; lock (Responses) isFetched = Responses.TryGetValue(context.Id, out data); } @if (isFetched) { if (data == null) { API Error } else { if (data.RoundtripSuccess) { Online (@(data.Version)) } else { Error Details } } } else { Loading }
33% of 6 Cores
1.56GB / 64GB
78.68GB / 1TB
@code { private DataTable Table; private Dictionary Responses = new(); private async Task> LoadData(PaginationOptions options) => await ApiClient.GetJson>($"api/admin/servers/nodes?page={options.Page}&pageSize={options.PerPage}"); private async Task Delete(NodeDetailResponse detailResponse) { await AlertService.ConfirmDanger( "Node deletion", $"Do you really want to delete the node '{detailResponse.Name}'", async () => { await ApiClient.Delete($"api/admin/servers/nodes/{detailResponse.Id}"); await ToastService.Success("Successfully deleted node"); await Table.Refresh(); } ); } private Task LoadNodeStatus(int node) { Task.Run(async () => { try { var status = await NodeService.GetSystemStatus(node); lock (Responses) Responses[node] = status; } catch (Exception e) { lock (Responses) Responses[node] = null; } await InvokeAsync(StateHasChanged); }); return Task.CompletedTask; } private async Task ShowErrorDetails(int id) { NodeSystemStatusResponse? data; lock (Responses) data = Responses.GetValueOrDefault(id); if (data == null) return; var message = $"Failed after {Math.Round(data.RoundtripTime.TotalSeconds, 2)} seconds: " + (data.RoundtripRemoteFailure ? "(Failed at node)" : "(Failed at api server)") + $" {data.RoundtripError}"; await AlertService.Danger("Node error details", message); } }