refactor: logging for exceptions

This commit is contained in:
estrogen elf
2025-08-09 08:47:17 -05:00
parent fd57aad4dd
commit 09cc3320e5
6 changed files with 157 additions and 78 deletions

View File

@@ -46,6 +46,8 @@ public partial class MainWindowViewModel
});
_schemaPaneService.SchemaPaneItems.Subscribe(async item =>
{
try
{
var document = item.Tab switch
{
@@ -63,6 +65,14 @@ public partial class MainWindowViewModel
OpenSchemaPaneCommand.NotifyCanExecuteChanged();
CloseSchemaAllCommand.NotifyCanExecuteChanged();
}
}
catch (Exception ex)
{
this.Log()
.Error(ex, "Failed to load schema pane item.");
_notificationService.Notify("Schema pane", ex.Message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
throw;
}
});
WeakReferenceMessenger.Default.RegisterAll(this);
@@ -91,6 +101,8 @@ public partial class MainWindowViewModel
{
if (value == null) return;
Task.Run(async () =>
{
try
{
var document = value.Tab switch
{
@@ -111,6 +123,14 @@ public partial class MainWindowViewModel
CloseSchemaAllCommand.NotifyCanExecuteChanged();
}
});
}
catch (Exception ex)
{
this.Log()
.Error(ex, "Failed to load schema search details.");
_notificationService.Notify("Schema search", ex.Message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
throw;
}
});
}
@@ -131,15 +151,24 @@ public partial class MainWindowViewModel
{
if (searchText == null) return [];
try
{
var lcuSchemaDocument = await _documentService.GetLcuSchemaDocumentAsync(cancellationToken);
var gameClientDocument = await _documentService.GetLolClientDocumentAsync(cancellationToken);
var lcuResults = lcuSchemaDocument.OpenApiDocument.Components.Schemas.Keys.Where(key => key.Contains(searchText, StringComparison.OrdinalIgnoreCase))
.Select(key => new SchemaSearchDetailsViewModel(key, Pages.Endpoints.Tab.LCU));
var gameClientResults = gameClientDocument.OpenApiDocument.Components.Schemas.Keys.Where(key => key.Contains(searchText, StringComparison.OrdinalIgnoreCase))
.Select(key => new SchemaSearchDetailsViewModel(key, Pages.Endpoints.Tab.GameClient));
return Enumerable.Concat(lcuResults, gameClientResults);
}
catch (Exception ex)
{
this.Log()
.Error(ex, "Failed to load populate.");
_notificationService.Notify("Schema search", ex.Message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
throw;
}
}
[RelayCommand(CanExecute = nameof(CanOpenSchemaPane))]
private void OpenSchemaPane()

View File

@@ -1,21 +1,26 @@
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Needlework.Net.Extensions;
using Needlework.Net.Services;
using Needlework.Net.ViewModels.Shared;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Needlework.Net.ViewModels.Pages.Console;
public partial class ConsoleViewModel : PageBase
public partial class ConsoleViewModel : PageBase, IEnableLogger
{
private readonly DocumentService _documentService;
private readonly NotificationService _notificationService;
public ConsoleViewModel(DocumentService documentService, NotificationService notificationService) : base("Console", "fa-solid fa-terminal")
{
_request = new(notificationService, Endpoints.Tab.LCU);
_documentService = documentService;
_notificationService = notificationService;
}
public List<string> RequestMethods { get; } = ["GET", "POST", "PUT", "DELETE", "HEAD", "PATCH", "OPTIONS", "TRACE"];
@@ -27,6 +32,8 @@ public partial class ConsoleViewModel : PageBase
[ObservableProperty] private RequestViewModel _request;
public override async Task InitializeAsync()
{
try
{
var document = await _documentService.GetLcuSchemaDocumentAsync();
Dispatcher.UIThread.Invoke(() =>
@@ -36,6 +43,13 @@ public partial class ConsoleViewModel : PageBase
});
IsBusy = false;
}
catch (Exception ex)
{
this.Log()
.Error(ex, "Failed to load console.");
_notificationService.Notify("Console", ex.Message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
}
}
[RelayCommand]
private async Task SendRequest()

View File

@@ -2,6 +2,7 @@
using AvaloniaEdit.Utils;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Needlework.Net.Extensions;
using Needlework.Net.Models;
using Needlework.Net.Services;
using System;
@@ -16,7 +17,7 @@ public enum Tab
GameClient
}
public partial class EndpointsViewModel : PageBase
public partial class EndpointsViewModel : PageBase, IEnableLogger
{
private readonly DocumentService _documentService;
@@ -35,13 +36,24 @@ public partial class EndpointsViewModel : PageBase
[ObservableProperty] private bool _isBusy = true;
public override async Task InitializeAsync()
{
try
{
await AddEndpoint(Tab.LCU);
IsBusy = false;
}
catch (Exception ex)
{
this.Log()
.Error(ex, "Failed to load endpoints.");
_notificationService.Notify("Endpoints", ex.Message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
}
}
[RelayCommand]
private async Task AddEndpoint(Tab tab)
{
try
{
Document document = tab switch
{
@@ -63,6 +75,13 @@ public partial class EndpointsViewModel : PageBase
});
});
}
catch (Exception ex)
{
this.Log()
.Error(ex, "Failed to add endpoint.");
_notificationService.Notify("Endpoints", ex.Message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
}
}
private void OnEndpointNavigation(string? title, Guid guid)
{

View File

@@ -19,11 +19,14 @@ public partial class HomeViewModel : PageBase, IEnableLogger
{
private readonly HextechDocsService _hextechDocsService;
private readonly NotificationService _notificationService;
private readonly IDisposable _carouselNextDisposable;
public HomeViewModel(HextechDocsService hextechDocsService) : base("Home", "fa-solid fa-house")
public HomeViewModel(HextechDocsService hextechDocsService, NotificationService notificationService) : base("Home", "fa-solid fa-house")
{
_hextechDocsService = hextechDocsService;
_notificationService = notificationService;
_carouselNextDisposable = Observable.Timer(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5))
.Select(time => Unit.Default)
@@ -75,6 +78,7 @@ public partial class HomeViewModel : PageBase, IEnableLogger
{
this.Log()
.Error(ex, "Failed to get posts from HextechDocs.");
_notificationService.Notify("Home", ex.Message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
}
}
}

View File

@@ -2,6 +2,7 @@
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using DebounceThrottle;
using Needlework.Net.Extensions;
using Needlework.Net.Helpers;
using Needlework.Net.Services;
using Needlework.Net.ViewModels.Pages.Endpoints;
@@ -12,7 +13,7 @@ using System.Threading.Tasks;
namespace Needlework.Net.ViewModels.Pages.Schemas
{
public partial class SchemasViewModel : PageBase
public partial class SchemasViewModel : PageBase, IEnableLogger
{
private readonly DebounceDispatcher _debounceDispatcher = new(TimeSpan.FromMilliseconds(500));
@@ -20,12 +21,15 @@ namespace Needlework.Net.ViewModels.Pages.Schemas
private readonly SchemaPaneService _schemaPaneService;
private readonly NotificationService _notificationService;
private List<SchemaSearchDetailsViewModel> _schemas = [];
public SchemasViewModel(DocumentService documentService, SchemaPaneService schemaPaneService) : base("Schemas", "fa-solid fa-file-lines")
public SchemasViewModel(DocumentService documentService, SchemaPaneService schemaPaneService, NotificationService notificationService) : base("Schemas", "fa-solid fa-file-lines")
{
_documentService = documentService;
_schemaPaneService = schemaPaneService;
_notificationService = notificationService;
}
[ObservableProperty]
@@ -59,6 +63,8 @@ namespace Needlework.Net.ViewModels.Pages.Schemas
}
public override async Task InitializeAsync()
{
try
{
var lcuSchemaDocument = await _documentService.GetLcuSchemaDocumentAsync();
var lolClientDocument = await _documentService.GetLolClientDocumentAsync();
@@ -73,5 +79,12 @@ namespace Needlework.Net.ViewModels.Pages.Schemas
IsBusy = false;
});
}
catch (Exception ex)
{
this.Log()
.Error(ex, "Failed to load schemas.");
_notificationService.Notify("Schemas", ex.Message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
}
}
}
}

View File

@@ -103,7 +103,7 @@ public partial class WebSocketViewModel : PageBase, IEnableLogger
var message = "Failed to get event types from GitHub. Please check your internet connection or try again later.";
this.Log()
.Error(ex, message);
_notificationService.Notify(AppInfo.Name, message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
_notificationService.Notify("WebSocket", message, FluentAvalonia.UI.Controls.InfoBarSeverity.Error);
}
}