Эх сурвалжийг харах

Added basic error handling and UI messages

Lukas Angerer 5 жил өмнө
parent
commit
e9eda70d16

+ 16 - 0
CronAlarm/Models/StatusMessage.cs

@@ -0,0 +1,16 @@
+namespace CronAlarm.Models
+{
+    public class StatusMessage
+    {
+        private static int nextId = 1;
+
+        public int Id { get; }
+        public string Type { get; set; }
+        public string Message { get; set; }
+
+        public StatusMessage()
+        {
+            Id = nextId++;
+        }
+    }
+}

+ 7 - 1
CronAlarm/Pages/AlertSelection.razor

@@ -1,4 +1,10 @@
-
+@foreach (var msg in Messages)
+{
+    <div class="alert alert-@msg.Type" role="alert">
+        @msg.Message
+    </div>
+}
+
 @foreach (var group in Config.Groups)
 {
     <div class="row alert-group">

+ 51 - 4
CronAlarm/Pages/AlertSelection.razor.cs

@@ -1,8 +1,11 @@
 using CronAlarm.Config;
+using CronAlarm.Models;
 using Microsoft.AspNetCore.Components;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Net.Http;
+using System.Threading.Tasks;
 
 namespace CronAlarm.Pages
 {
@@ -16,6 +19,8 @@ namespace CronAlarm.Pages
 
         private IDictionary<string, int> SelectedOptions { get; set; } = new Dictionary<string, int>();
 
+        private IList<StatusMessage> Messages { get; set; } = new List<StatusMessage>();
+
         public AlertSelection()
         {
         }
@@ -41,7 +46,7 @@ namespace CronAlarm.Pages
             return SelectedOptions.ContainsKey(group) && SelectedOptions[group] == index ? "active" : string.Empty;
         }
 
-        private void Save()
+        private async void Save()
         {
             var alerts = new List<CronEntry>();
             foreach (var group in Config.Groups)
@@ -58,12 +63,27 @@ namespace CronAlarm.Pages
                 }
             }
 
-            ResetGroups(CronFragmentHandler.Update(alerts));
+            try
+            {
+                ResetGroups(CronFragmentHandler.Update(alerts));
+            }
+            catch (AggregateException e)
+            {
+                await ProcessAggregateException(e);
+            }
+            await AddMessage("success", "crontab successfully updated");
         }
 
-        private void Reset()
+        private async void Reset()
         {
-            ResetGroups(CronFragmentHandler.GetExpressions());
+            try
+            {
+                ResetGroups(CronFragmentHandler.GetExpressions());
+            }
+            catch (AggregateException e)
+            {
+                await ProcessAggregateException(e);
+            }
         }
 
         private void ResetGroups(IEnumerable<string> cronLines)
@@ -75,5 +95,32 @@ namespace CronAlarm.Pages
                 SelectedOptions[group.Name] = group.IndexedOptions.Select(item => item.ToTuple()).FirstOrDefault(item => current.Contains(item.Item2.Pattern))?.Item1 ?? -1;
             }
         }
+
+        private async Task AddMessage(string type, string message)
+        {
+            var item = new StatusMessage
+            {
+                Type = type,
+                Message = message,
+            };
+
+            Messages.Add(item);
+            await Task.Delay(5000);
+            Messages = Messages.Where(i => i.Id != item.Id).ToList();
+            StateHasChanged();
+        }
+
+        private async Task ProcessAggregateException(AggregateException exception)
+        {
+            var httpException = exception.InnerExceptions.OfType<HttpRequestException>().FirstOrDefault();
+            if (httpException != null)
+            {
+                await AddMessage("danger", $"Error from CronAPI: {httpException.Message}");
+            }
+            else
+            {
+                await AddMessage("danger", "Unknown Error");
+            }
+        }
     }
 }