diff --git a/Source/AppScaffolding/AppScaffolding.csproj b/Source/AppScaffolding/AppScaffolding.csproj index 3bde0ed0..7406b271 100644 --- a/Source/AppScaffolding/AppScaffolding.csproj +++ b/Source/AppScaffolding/AppScaffolding.csproj @@ -2,7 +2,7 @@ net6.0 - 8.4.3.1 + 8.4.4.1 diff --git a/Source/FileLiberator/DownloadPdf.cs b/Source/FileLiberator/DownloadPdf.cs index 527c3244..9f259cc4 100644 --- a/Source/FileLiberator/DownloadPdf.cs +++ b/Source/FileLiberator/DownloadPdf.cs @@ -24,7 +24,7 @@ namespace FileLiberator { OnBegin(libraryBook); - try + try { var proposedDownloadFilePath = getProposedDownloadFilePath(libraryBook); var actualDownloadedFilePath = await downloadPdfAsync(libraryBook, proposedDownloadFilePath); @@ -32,13 +32,22 @@ namespace FileLiberator libraryBook.Book.UpdatePdfStatus(result.IsSuccess ? LiberatedStatus.Liberated : LiberatedStatus.NotLiberated); - return result; - } + return result; + } + catch (Exception ex) + { + Serilog.Log.Logger.Error(ex, "Error downloading PDF"); + + var result = new StatusHandler(); + result.AddError($"Error downloading PDF. See log for details. Error summary: {ex.Message}"); + + return result; + } finally { OnCompleted(libraryBook); - } - } + } + } private static string getProposedDownloadFilePath(LibraryBook libraryBook) { diff --git a/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs b/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs index 0acb338c..c4008b58 100644 --- a/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs @@ -7,6 +7,7 @@ using Avalonia.Media; using Avalonia.Media.Imaging; using DataLayer; using Dinah.Core; +using Dinah.Core.ErrorHandling; using FileLiberator; using LibationFileManager; using ReactiveUI; @@ -289,25 +290,36 @@ namespace LibationAvalonia.ViewModels Logger.Info($"{((Processable)sender).Name} Step, Completed: {libraryBook.Book}"); UnlinkProcessable((Processable)sender); - if (Processes.Count > 0) - { - NextProcessable(); - LinkProcessable(CurrentProcessable); - var result = await CurrentProcessable.ProcessSingleAsync(libraryBook, validate: true); + if (Processes.Count == 0) + { + Completed?.Invoke(this, EventArgs.Empty); + return; + } - if (result.HasErrors) - { - foreach (var errorMessage in result.Errors.Where(e => e != "Validation failed")) - Logger.Error(errorMessage); + NextProcessable(); + LinkProcessable(CurrentProcessable); - Completed?.Invoke(this, EventArgs.Empty); - } - } - else + StatusHandler result; + try { - Completed?.Invoke(this, EventArgs.Empty); - } - } + result = await CurrentProcessable.ProcessSingleAsync(libraryBook, validate: true); + } + catch (Exception ex) + { + Serilog.Log.Logger.Error(ex, $"{nameof(Processable_Completed)} error"); + + result = new StatusHandler(); + result.AddError($"{nameof(Processable_Completed)} error. See log for details. Error summary: {ex.Message}"); + } + + if (result.HasErrors) + { + foreach (var errorMessage in result.Errors.Where(e => e != "Validation failed")) + Logger.Error(errorMessage); + + Completed?.Invoke(this, EventArgs.Empty); + } + } #endregion diff --git a/Source/LibationWinForms/ProcessQueue/ProcessBook.cs b/Source/LibationWinForms/ProcessQueue/ProcessBook.cs index 4d538a43..fffd0d78 100644 --- a/Source/LibationWinForms/ProcessQueue/ProcessBook.cs +++ b/Source/LibationWinForms/ProcessQueue/ProcessBook.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using ApplicationServices; using DataLayer; using Dinah.Core; +using Dinah.Core.ErrorHandling; using Dinah.Core.WindowsDesktop.Drawing; using FileLiberator; using LibationFileManager; @@ -279,36 +280,47 @@ namespace LibationWinForms.ProcessQueue updateBookInfo(); } - private async void Processable_Completed(object sender, LibraryBook libraryBook) - { - Logger.Info($"{((Processable)sender).Name} Step, Completed: {libraryBook.Book}"); - UnlinkProcessable((Processable)sender); + private async void Processable_Completed(object sender, LibraryBook libraryBook) + { + Logger.Info($"{((Processable)sender).Name} Step, Completed: {libraryBook.Book}"); + UnlinkProcessable((Processable)sender); - if (Processes.Count > 0) - { - NextProcessable(); - LinkProcessable(CurrentProcessable); - var result = await CurrentProcessable.ProcessSingleAsync(libraryBook, validate: true); + if (Processes.Count == 0) + { + Completed?.Invoke(this, EventArgs.Empty); + return; + } - if (result.HasErrors) - { - foreach (var errorMessage in result.Errors.Where(e => e != "Validation failed")) - Logger.Error(errorMessage); + NextProcessable(); + LinkProcessable(CurrentProcessable); - Completed?.Invoke(this, EventArgs.Empty); - } - } - else - { - Completed?.Invoke(this, EventArgs.Empty); - } - } + StatusHandler result; + try + { + result = await CurrentProcessable.ProcessSingleAsync(libraryBook, validate: true); + } + catch (Exception ex) + { + Serilog.Log.Logger.Error(ex, $"{nameof(Processable_Completed)} error"); - #endregion + result = new StatusHandler(); + result.AddError($"{nameof(Processable_Completed)} error. See log for details. Error summary: {ex.Message}"); + } - #region Failure Handler + if (result.HasErrors) + { + foreach (var errorMessage in result.Errors.Where(e => e != "Validation failed")) + Logger.Error(errorMessage); - private ProcessBookResult showRetry(LibraryBook libraryBook) + Completed?.Invoke(this, EventArgs.Empty); + } + } + + #endregion + + #region Failure Handler + + private ProcessBookResult showRetry(LibraryBook libraryBook) { Logger.Error("ERROR. All books have not been processed. Most recent book: processing failed");