using InABox.Configuration; using InABox.Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace InABox.Database.Stores; public class GlobalSettingsStore : Store { private static Dictionary> _subStores = new(); public static void RegisterSubStore() where TSettings : BaseObject, IGlobalConfigurationSettings, new() where TStore : ISettingsStoreEventHandler { _subStores[typeof(TSettings).Name] = new(typeof(TSettings), typeof(TStore)); } private BaseObject GetSettings(GlobalSettings settings, Type TSettings) { var result = Serialization.Deserialize(TSettings, settings.Contents) as BaseObject; if(result is not null) { result.CommitChanges(); } else { result = (Activator.CreateInstance(TSettings) as BaseObject)!; } return result; } protected override void BeforeSave(GlobalSettings entity) { base.BeforeSave(entity); if(_subStores.TryGetValue(entity.Section, out var subStore)) { (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.BeforeSave(GetSettings(entity, subStore.Item1)); } } protected override void AfterSave(GlobalSettings entity) { base.AfterSave(entity); if(_subStores.TryGetValue(entity.Section, out var subStore)) { (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.AfterSave(GetSettings(entity, subStore.Item1)); } } protected override void BeforeDelete(GlobalSettings entity) { base.BeforeDelete(entity); if(_subStores.TryGetValue(entity.Section, out var subStore)) { (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.BeforeDelete(GetSettings(entity, subStore.Item1)); } } protected override void AfterDelete(GlobalSettings entity) { base.AfterDelete(entity); if(_subStores.TryGetValue(entity.Section, out var subStore)) { (Activator.CreateInstance(subStore.Item2) as ISettingsStoreEventHandler)!.AfterDelete(GetSettings(entity, subStore.Item1)); } } } public interface ISettingsStoreEventHandler { void BeforeSave(BaseObject entity); void AfterSave(BaseObject entity); void BeforeDelete(BaseObject entity); void AfterDelete(BaseObject entity); } public interface ISettingsStoreEventHandler : ISettingsStoreEventHandler where T : BaseObject { void BeforeSave(T entity); void AfterSave(T entity); void BeforeDelete(T entity); void AfterDelete(T entity); void ISettingsStoreEventHandler.BeforeSave(BaseObject entity) => BeforeSave((T)entity); void ISettingsStoreEventHandler.AfterSave(BaseObject entity) => AfterSave((T)entity); void ISettingsStoreEventHandler.BeforeDelete(BaseObject entity) => BeforeDelete((T)entity); void ISettingsStoreEventHandler.AfterDelete(BaseObject entity) => AfterDelete((T)entity); }