using System; using System.Collections.Generic; using Kreta.Core; using Kreta.DataAccessManual; using Kreta.DataAccessManual.Interfaces; using Kreta.Enums; using Kreta.Framework.Caching; using Kreta.KretaServer.Exceptions; using Newtonsoft.Json; namespace Kreta.KretaServer.Caching { public class SystemSettingsCache : GenericCache { private static readonly string SystemSettingsCacheKeyPrefix = $"{Constants.Cache.CacheKeyPrefix}{nameof(SystemSettingsCache)}_"; private static readonly string SystemSettingsRegionPrefix = $"{Constants.Cache.CacheKeyPrefix}{nameof(SystemSettingsCache)}Region_"; public SystemSettingsCache(Framework.Caching.CacheManager cacheManager) : base(cacheManager, nameof(SystemSettingsCache)) { } [Serializable] public class SystemSettingsData { public RendszerBeallitasTipusEnum BeallitasTipus { get; set; } public SystemSettingsControlTypeEnum Type { get; set; } public string Json { get; set; } public bool IsDisabled { get; set; } } private string GetCacheKey(string keyPrefix, RendszerBeallitasTipusEnum beallitasTipus, string intezmenyAzonosito, int tanevId) { return $"{keyPrefix}{intezmenyAzonosito.ToLower()}.{tanevId}.{(int)beallitasTipus}"; } private static string GetRegionKey(string intezmenyAzonosito) => $"{SystemSettingsRegionPrefix}{intezmenyAzonosito}"; private SystemSettingsData LoadSystemSettingByType(IRendszerBeallitasDAL dal, RendszerBeallitasTipusEnum beallitasTipus, int tanevId) { var rb = dal.Get(beallitasTipus, tanevId); if (rb != null) { return new SystemSettingsData { Type = (SystemSettingsControlTypeEnum)rb.ErtekTipus, Json = rb.Ertek, BeallitasTipus = (RendszerBeallitasTipusEnum)rb.BeallitasTipus, IsDisabled = rb.IsDisabled }; } throw new KretaException($"System setting not found: {beallitasTipus}"); } private SystemSettingsData LoadSystemSettingByType(RendszerBeallitasTipusEnum beallitasTipus, string intezmenyAzonosito, int tanevId) { return Dal.OrganizationConnection.Run(intezmenyAzonosito, h => { return LoadSystemSettingByType(h.RendszerBeallitas(), beallitasTipus, tanevId); }); } /// /// Visszaad egy rendszerbeállítást /// public SystemSettingsData GetSystemSetting(RendszerBeallitasTipusEnum beallitasTipus, string intezmenyAzonosito, int tanevId) { var key = GetCacheKey(SystemSettingsCacheKeyPrefix, beallitasTipus, intezmenyAzonosito, tanevId); var region = GetRegionKey(intezmenyAzonosito); var result = GetOrAddWithRegion(key, region, (k, r) => LoadSystemSettingByType(beallitasTipus, intezmenyAzonosito, tanevId)); return result; } /// /// Visszaadja az összes rendszerbeállítást /// public List GetSystemSettings(string intezmenyAzonosito, int tanevId) { return Dal.OrganizationConnection.Run(intezmenyAzonosito, h => { List result = new List(); var dal = h.RendszerBeallitas(); foreach (RendszerBeallitasTipusEnum beallitasTipus in Enum.GetValues(typeof(RendszerBeallitasTipusEnum))) { var key = GetCacheKey(SystemSettingsCacheKeyPrefix, beallitasTipus, intezmenyAzonosito, tanevId); var region = GetRegionKey(intezmenyAzonosito); result.Add(GetOrAddWithRegion(key, region, (k, r) => LoadSystemSettingByType(dal, beallitasTipus, tanevId))); } return result; }); } /// /// Ment egy rendszerbeállítás /// public void SetSystemSettings(RendszerBeallitasTipusEnum beallitasTipus, string intezmenyAzonosito, int tanevId, object settingobject, int? kovTanevId) { Dal.OrganizationConnection.Run(intezmenyAzonosito, h => { var dal = h.RendszerBeallitas(); var rb = dal.Get(beallitasTipus, tanevId); if (rb != null) { string json = JsonConvert.SerializeObject(settingobject); rb.Ertek = json; dal.FullUpdate(rb); } else { throw new ArgumentException("Invalid System settings type given"); } var key = GetCacheKey(SystemSettingsCacheKeyPrefix, beallitasTipus, intezmenyAzonosito, tanevId); var region = GetRegionKey(intezmenyAzonosito); var value = LoadSystemSettingByType(dal, beallitasTipus, tanevId); AddOrUpdateWithRegion(key, region, value, k => value); if (kovTanevId.IsEntityId()) { try { key = GetCacheKey(SystemSettingsCacheKeyPrefix, beallitasTipus, intezmenyAzonosito, (int)kovTanevId); region = GetRegionKey(intezmenyAzonosito); value = LoadSystemSettingByType(dal, beallitasTipus, (int)kovTanevId); AddOrUpdateWithRegion(key, region, value, k => value); } catch (KretaException) { // Köv tanév esetén nem foglalkozunk azzal a hibával, hogy nem található a rendszerbeállítás, // mivel új rendszerbeállítás felvételekor nem tudjuk beszúrni a rendszerbeállítás táblába az értéket, // mert nem feltétlen szerepel tanévrendje események köv tanévhez. } } }); } public bool ResetSystemSettings(string intezmenyAzonosito, int? intezmenyID, int? tanevID, List exceptSystemSettings) { return Dal.OrganizationConnection.Run(intezmenyAzonosito, h => { try { h.RendszerBeallitas().ResetSystemSettings(intezmenyID, tanevID, exceptSystemSettings); } catch { return false; } var region = GetRegionKey(intezmenyAzonosito); ClearRegion(region); return true; }); } public void RemoveSystemSetting(RendszerBeallitasTipusEnum beallitasTipus, string intezmenyAzonosito, int tanevId) { var key = GetCacheKey(SystemSettingsCacheKeyPrefix, beallitasTipus, intezmenyAzonosito, tanevId); var region = GetRegionKey(intezmenyAzonosito); RemoveFromRegion(key, region); } } }