浏览代码

Fixed some exception handling stuff

Kenric Nugteren 2 月之前
父节点
当前提交
a16e8596af

+ 8 - 30
InABox.Server/RPC/Handlers/Query.cs

@@ -13,38 +13,16 @@ public class RpcQueryHandler : RpcCommandHandler<IRpcServer, RpcQueryCommand, Rp
 
         var response = new RpcQueryResult();
 
-        var tasks = new List<Task<RpcQueryTable>>();
-        foreach (var query in parameters.Queries)
+        var tasks = parameters.Queries.ToArray(query => Task.Run(() =>
         {
-            var task = Task.Run(() =>
-            {
-                var table = new RpcQueryTable() { Key = query.Key };
-                try
-                {
-                    var store = DbFactory.FindStore(query.Type, user.ID, user.UserID, session.Platform, session.Version ?? "", logger);
-                    table.Table = store.Query(query.Filter, query.Columns, query.Sort, query.Range);
-                }
-                catch (Exception e)
-                {
-                    logger.Send(
-                        LogType.Error, 
-                        user.UserID,
-                        string.Format(
-                            "[{0} {1}] Error: {2}\n{3}", 
-                            PlatformUtils.PlatformToString(session.Platform), 
-                            session.Version,
-                            e.Message,
-                            e.StackTrace
-                        )
-                    );                       
-                }
-                return table;
-            });
-            tasks.Add(task);
-        }
-        Task.WaitAll(tasks.ToArray());
+            var table = new RpcQueryTable() { Key = query.Key };
+            var store = DbFactory.FindStore(query.Type, user.ID, user.UserID, session.Platform, session.Version ?? "", logger);
+            table.Table = store.Query(query.Filter, query.Columns, query.Sort, query.Range);
+            return table;
+        }));
+        Task.WaitAll(tasks);
 
-        response.Tables = tasks.Select(x => x.Result).ToArray();
+        response.Tables = tasks.ToArray(x => x.Result);
         
         return response;
     }

+ 52 - 44
inabox.wpf/DigitalForms/Designer/DynamicEditFormWindow.xaml.cs

@@ -309,59 +309,67 @@ public partial class DynamicFormEditWindow : Window, IDynamicFormWindow
         string? error = null;
         string? errorDetails = null;
 
-        Progress.ShowModal("Loading Form", (progress) =>
+        try
         {
-            var formid = formInstance.Form.ID;
+            Progress.ShowModal("Loading Form", (progress) =>
+            {
+                var formid = formInstance.Form.ID;
 
-            values = DigitalForm.DeserializeFormData(formInstance);
+                values = DigitalForm.DeserializeFormData(formInstance);
 
-            var results = Client.QueryMultiple(
-                new KeyedQueryDef<DigitalFormVariable>(Filter<DigitalFormVariable>.Where(x => x.Form.ID).IsEqualTo(formid)),
-                new KeyedQueryDef<DigitalFormLayout>(
-                    Filter<DigitalFormLayout>.Where(x => x.Form.ID).IsEqualTo(formid)
-                        .And(x => x.Active).IsEqualTo(true)
-                        .And(x => x.Layout).IsNotEqualTo("")));
+                var results = Client.QueryMultiple(
+                    new KeyedQueryDef<DigitalFormVariable>(Filter<DigitalFormVariable>.Where(x => x.Form.ID).IsEqualTo(formid)),
+                    new KeyedQueryDef<DigitalFormLayout>(
+                        Filter<DigitalFormLayout>.Where(x => x.Form.ID).IsEqualTo(formid)
+                            .And(x => x.Active).IsEqualTo(true)
+                            .And(x => x.Layout).IsNotEqualTo("")));
 
-            variables = results[nameof(DigitalFormVariable)].Rows.Select(x => x.ToObject<DigitalFormVariable>()).ToArray();
+                variables = results[nameof(DigitalFormVariable)].Rows.Select(x => x.ToObject<DigitalFormVariable>()).ToArray();
 
-            var desktopLayout = results[nameof(DigitalFormLayout)]
-                .Rows.FirstOrDefault(x => x.Get<DigitalFormLayout, DFLayoutType>(x => x.Type) == DFLayoutType.Desktop)
-                ?.ToObject<DigitalFormLayout>();
+                var desktopLayout = results[nameof(DigitalFormLayout)]
+                    .Rows.FirstOrDefault(x => x.Get<DigitalFormLayout, DFLayoutType>(x => x.Type) == DFLayoutType.Desktop)
+                    ?.ToObject<DigitalFormLayout>();
 
-            layout = desktopLayout ?? results[nameof(DigitalFormLayout)].ToObjects<DigitalFormLayout>().FirstOrDefault();
-            if (layout != null)
-            {
-                if (parent is null)
+                layout = desktopLayout ?? results[nameof(DigitalFormLayout)].ToObjects<DigitalFormLayout>().FirstOrDefault();
+                if (layout != null)
                 {
-                    var parentlink = CoreUtils.HasProperty(formInstance.GetType(), "Parent")
-                        ? CoreUtils.GetPropertyValue(formInstance, "Parent") as IEntityLink
-                        : null;
-                    var parenttype = parentlink?.GetType().BaseType?.GetGenericArguments().FirstOrDefault();
-
-                    if (parenttype != null && parentlink != null)
+                    if (parent is null)
                     {
-                        var parentid = parentlink.ID;
-                        var filter = Filter.Create(parenttype);
-                        filter.Property = "ID";
-                        filter.Operator = Operator.IsEqualTo;
-                        filter.Value = parentid;
-
-                        parent = Client.Create(parenttype)
-                            .Query(filter, DFUtils.RequiredEntityColumns(formInstance.GetType(), parenttype, variables), null).ToObjects(parenttype).FirstOrDefault() as Entity;
-                    }
-
-                    if (parent == null)
-                    {
-                        error = "An error occurred while loading the form: Form Entity is null";
-                        errorDetails = $"Form parent is null; Form Type: {formInstance.GetType()}; Parent Type: {parenttype}; Form ID: {formInstance.ID}";
+                        var parentlink = CoreUtils.HasProperty(formInstance.GetType(), "Parent")
+                            ? CoreUtils.GetPropertyValue(formInstance, "Parent") as IEntityLink
+                            : null;
+                        var parenttype = parentlink?.GetType().BaseType?.GetGenericArguments().FirstOrDefault();
+
+                        if (parenttype != null && parentlink != null)
+                        {
+                            var parentid = parentlink.ID;
+                            var filter = Filter.Create(parenttype);
+                            filter.Property = "ID";
+                            filter.Operator = Operator.IsEqualTo;
+                            filter.Value = parentid;
+
+                            parent = Client.Create(parenttype)
+                                .Query(filter, DFUtils.RequiredEntityColumns(formInstance.GetType(), parenttype, variables), null).ToObjects(parenttype).FirstOrDefault() as Entity;
+                        }
+
+                        if (parent == null)
+                        {
+                            error = "An error occurred while loading the form: Form Entity is null";
+                            errorDetails = $"Form parent is null; Form Type: {formInstance.GetType()}; Parent Type: {parenttype}; Form ID: {formInstance.ID}";
+                        }
                     }
                 }
-            }
-            else
-            {
-                error = "No layout found for form!";
-            }
-        });
+                else
+                {
+                    error = "No layout found for form!";
+                }
+            });
+        }
+        catch(Exception e)
+        {
+            MessageWindow.ShowError("Error occurred loading form", e);
+            return false;
+        }
 
         if (!error.IsNullOrWhiteSpace())
         {
@@ -430,7 +438,7 @@ public partial class DynamicFormEditWindow : Window, IDynamicFormWindow
                     : "";*/
             }
 
-            DigitalForm.SerializeFormData(formInstance, variables, form.SaveValues());
+            DigitalForm.SerializeFormData(formInstance, form.SaveValues());
         }
 
         return form.Result == FormResult.Save || form.Result == FormResult.Complete;

+ 7 - 0
inabox.wpf/DynamicGrid/DynamicEditorForm/DynamicEditorForm.xaml.cs

@@ -191,7 +191,14 @@ public partial class DynamicEditorForm : ThemableChromelessWindow, IDynamicEdito
             }
         }
         if (Result == true)
+        {
             Form.SaveItem(e);
+        }
+        if (e.Cancel)
+        {
+            Result = null;
+            return;
+        }
         SubPanelClosed?.Invoke(this);
     }
 

+ 1 - 1
inabox.wpf/ProgressWindow/Progress.cs

@@ -168,7 +168,7 @@ namespace InABox.WPF
             progress.ShowDialog();
             if(exception is not null)
             {
-                throw exception;
+                throw new AggregateException(exception);
             }
         }