Browse Source

Merge remote-tracking branch 'origin/kenric' into frank

frogsoftware 1 year ago
parent
commit
12c9d29564
2 changed files with 36 additions and 15 deletions
  1. 18 12
      InABox.Core/Postable/PosterEngine.cs
  2. 18 3
      InABox.Core/Postable/PosterUtils.cs

+ 18 - 12
InABox.Core/Postable/PosterEngine.cs

@@ -103,6 +103,16 @@ namespace InABox.Core
         /// <param name="model"></param>
         public abstract void AfterPost(IDataModel<TPostable> model);
 
+        private static void SetFailed(IList<TPostable> entities)
+        {
+            foreach (var post in entities)
+            {
+                post.PostedStatus = PostedStatus.PostFailed;
+                post.PostedNote = "Post failed.";
+            }
+            new Client<TPostable>().Save(entities, "Post failed by user.");
+        }
+
         public bool Process(IDataModel<TPostable> model)
         {
             if (!BeforePost(model))
@@ -144,26 +154,22 @@ namespace InABox.Core
                 }
                 else
                 {
-                    foreach (var post in entities)
-                    {
-                        post.PostedStatus = PostedStatus.PostFailed;
-                        post.PostedNote = "Post failed.";
-                    }
-                    new Client<TPostable>().Save(entities, "Post failed by user.");
+                    SetFailed(entities);
                 }
                 return success;
             }
+            catch (PostCancelledException)
+            {
+                var entities = data.ToObjects<TPostable>().ToList();
+                SetFailed(entities);
+                throw;
+            }
             catch(Exception e)
             {
                 Logger.Send(LogType.Error, "", $"Post Failed: {CoreUtils.FormatException(e)}");
 
                 var entities = data.ToObjects<TPostable>().ToList();
-                foreach (var post in entities)
-                {
-                    post.PostedStatus = PostedStatus.PostFailed;
-                    post.PostedNote = e.Message;
-                }
-                new Client<TPostable>().Save(entities, "Post failed by user.");
+                SetFailed(entities);
                 throw;
             }
         }

+ 18 - 3
InABox.Core/Postable/PosterUtils.cs

@@ -16,6 +16,8 @@ namespace InABox.Core
         {
             public Type Engine { get; set; }
 
+            public Type Entity { get; set; }
+
             public Type Poster { get; set; }
         }
 
@@ -44,6 +46,7 @@ namespace InABox.Core
             ).Select(x => new EngineType
             {
                 Engine = x,
+                Entity = x.GetInterfaceDefinition(typeof(IPosterEngine<,,>))!.GenericTypeArguments[0],
                 Poster = x.GetInterfaceDefinition(typeof(IPosterEngine<,,>))!.GenericTypeArguments[1].GetGenericTypeDefinition()
             }).ToArray();
             return _posterEngines;
@@ -129,14 +132,26 @@ namespace InABox.Core
             }
             var poster = GetPosters()?.FirstOrDefault(x => x.EntityName() == settings.PosterType)!;
 
-            return (GetPosterEngines().FirstOrDefault(x => poster.HasInterface(x.Poster))?.Engine
-                ?? throw new Exception("No poster for the given settings.")).MakeGenericType(typeof(T));
+            var engines = GetPosterEngines().Where(x => poster.HasInterface(x.Poster)).ToList();
+            if (!engines.Any())
+            {
+                throw new Exception("No poster for the given settings.");
+            }
+            else if(engines.Count == 1)
+            {
+                return engines[0].Engine.MakeGenericType(typeof(T));
+            }
+            else
+            {
+                return engines.Single(x => x.Entity == typeof(T)).Engine.MakeGenericType(typeof(T));
+            }
         }
 
         public static IPosterEngine<T> CreateEngine<T>()
             where T : Entity, IPostable, IRemotable, IPersistent, new()
         {
-            return (Activator.CreateInstance(GetEngine<T>()) as IPosterEngine<T>)!;
+            var engine = GetEngine<T>();
+            return (Activator.CreateInstance(engine) as IPosterEngine<T>)!;
         }
 
         /// <summary>