Browse Source

Improvements to GlobalSettingsStore

Kenric Nugteren 2 weeks ago
parent
commit
167dea1116
2 changed files with 35 additions and 14 deletions
  1. 29 8
      InABox.Database/Stores/GlobalSettingsStore.cs
  2. 6 6
      InABox.Database/Stores/Store.cs

+ 29 - 8
InABox.Database/Stores/GlobalSettingsStore.cs

@@ -1,7 +1,9 @@
 using InABox.Configuration;
 using InABox.Core;
+using NPOI.OpenXmlFormats.Dml;
 using System;
 using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -33,45 +35,64 @@ public class GlobalSettingsStore : Store<GlobalSettings>
         return result;
     }
 
+    private bool TryGetSubStore(GlobalSettings entity, [NotNullWhen(true)] out ISettingsStoreEventHandler? subStore, [NotNullWhen(true)] out BaseObject? TSettings)
+    {
+        if(_subStores.TryGetValue(entity.Section, out var subStoreTuple))
+        {
+            subStore = (Activator.CreateInstance(subStoreTuple.Item2) as ISettingsStoreEventHandler)!;
+            subStore.Parent = this;
+            TSettings = GetSettings(entity, subStoreTuple.Item1);
+            return true;
+        }
+        else
+        {
+            subStore = null;
+            TSettings = null;
+            return false;
+        }
+    }
+
     protected override void BeforeSave(GlobalSettings entity)
     {
         base.BeforeSave(entity);
-        if(_subStores.TryGetValue(entity.Section, out var subStore))
+        if(TryGetSubStore(entity, out var subStore, out var settings))
         {
-            (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.BeforeSave(GetSettings(entity, subStore.Item1));
+            subStore.BeforeSave(settings);
         }
     }
 
     protected override void AfterSave(GlobalSettings entity)
     {
         base.AfterSave(entity);
-        if(_subStores.TryGetValue(entity.Section, out var subStore))
+        if(TryGetSubStore(entity, out var subStore, out var settings))
         {
-            (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.AfterSave(GetSettings(entity, subStore.Item1));
+            subStore.AfterSave(settings);
         }
     }
 
     protected override void BeforeDelete(GlobalSettings entity)
     {
         base.BeforeDelete(entity);
-        if(_subStores.TryGetValue(entity.Section, out var subStore))
+        if(TryGetSubStore(entity, out var subStore, out var settings))
         {
-            (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.BeforeDelete(GetSettings(entity, subStore.Item1));
+            subStore.BeforeDelete(settings);
         }
     }
 
     protected override void AfterDelete(GlobalSettings entity)
     {
         base.AfterDelete(entity);
-        if(_subStores.TryGetValue(entity.Section, out var subStore))
+        if(TryGetSubStore(entity, out var subStore, out var settings))
         {
-            (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.AfterDelete(GetSettings(entity, subStore.Item1));
+            subStore.AfterDelete(settings);
         }
     }
 }
 
 public interface ISettingsStoreEventHandler
 {
+    IStore Parent { set; }
+    
     void BeforeSave(BaseObject entity);
     void AfterSave(BaseObject entity);
     void BeforeDelete(BaseObject entity);

+ 6 - 6
InABox.Database/Stores/Store.cs

@@ -588,9 +588,9 @@ namespace InABox.Database
         public static void RegisterListener<TType>(Action<Guid[]> listener)
             => _listeners.Add(new Tuple<Type, Action<Guid[]>>(typeof(TType), listener));
 
-        private void NotifyListeners(IEnumerable<T> items)
+        private void NotifyListeners(IList<T> items)
         {
-            var ids = items.Select(x => x.ID).ToArray();
+            var ids = items.ToArray(x => x.ID);
             foreach (var listener in _listeners.Where(x => x.Item1 == typeof(T)))
                 listener.Item2(ids);
             
@@ -644,11 +644,11 @@ namespace InABox.Database
             }
         }
 
-        private void DoDelete(IEnumerable<T> entities, string auditnote)
+        private void DoDelete(IList<T> entities, string auditnote)
         {
             UpdateUserTracking(UserTrackingAction.Write);
 
-            entities = RunScript(ScriptType.BeforeDelete, entities);
+            entities = RunScript(ScriptType.BeforeDelete, entities).AsIList();
 
             try
             {
@@ -666,7 +666,7 @@ namespace InABox.Database
 
                 foreach (var entity in entities) AfterDelete(entity);
 
-                entities = RunScript(ScriptType.AfterDelete, entities);
+                entities = RunScript(ScriptType.AfterDelete, entities).AsIList();
                 
                 NotifyListeners(entities);
             }
@@ -688,7 +688,7 @@ namespace InABox.Database
 
         public void Delete(IEnumerable<T> entities, string auditnote)
         {
-            DoDelete(entities, auditnote);
+            DoDelete(entities.AsIList(), auditnote);
         }
 
         public void Delete(IEnumerable<Entity> entities, string auditnote)