This commit is contained in:
skidoodle 2024-03-13 00:33:46 +01:00
commit e124a47765
19374 changed files with 9806149 additions and 0 deletions

View file

@ -0,0 +1,184 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Kreta.DataAccessManual;
using Kreta.Framework;
using Kreta.Framework.Caching;
using Microsoft.Extensions.Configuration;
using Kreta.Client.GlobalApi;
using Kreta.Core.Enum;
using Kreta.Core.FeatureToggle;
using Kreta.Core.FeatureToggle.Configuration;
using System.Configuration;
using Kreta.Core;
namespace Kreta.KretaServer.Caching
{
public sealed class ConnectionStringCache : GenericCache<object>
{
private static readonly string SystemConnectionStringsCache = $"{nameof(Kreta)}_{nameof(SystemConnectionStringsCache)}";
private static readonly string IntezmenyConnectionStringsCache = $"{nameof(Kreta)}_{nameof(IntezmenyConnectionStringsCache)}";
public ConnectionStringCache(Framework.Caching.CacheManager cacheManager) : base(cacheManager, nameof(ConnectionStringCache))
{
}
#region Private methods
private List<string> LoadSystemConnectionStrings()
{
var systemConnectionStrings = new List<string>();
if (!string.IsNullOrWhiteSpace(KretaServer.Instance.Configuration.IntezmenyConnectionStringFile))
{
string intezmenyConnectionStringFile = KretaServer.Instance.Configuration.IntezmenyConnectionStringFile;
try
{
if (File.Exists(intezmenyConnectionStringFile))
{
var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder();
builder.AddJsonFile(intezmenyConnectionStringFile);
IConfigurationRoot configuration = builder.Build();
systemConnectionStrings = configuration.GetSection("config:connectionStrings").GetChildren().Select(x => x.Value).ToList();
}
}
catch (Exception ex)
{
SDAServer.Instance.Logger.ExceptionThrown(ex);
}
}
else
{
systemConnectionStrings = new List<string> { KretaServer.Instance.Configuration.DBConnection };
}
AddOrUpdate(SystemConnectionStringsCache, systemConnectionStrings, oldValue => systemConnectionStrings);
return systemConnectionStrings;
}
private Dictionary<string, string> GetIntezmenyConnectionStrings()
{
var globalApiFeature = new UseGlobalApiConnectionStringFeature((FeatureConfigurationSection)ConfigurationManager.GetSection(Constants.ConfigurationSectionNames.FeatureConfig));
var result = (Dictionary<string, string>)Get(IntezmenyConnectionStringsCache) ??
(globalApiFeature.IsEnabled ? LoadIntezmenyConnectionStringsGlobalApi() : LoadIntezmenyConnectionStrings());
return result;
}
private Dictionary<string, string> LoadIntezmenyConnectionStrings()
{
var intezmenyConnectionStrings = new Dictionary<string, string>();
IEnumerable<string> systemConnectionStrings = GetSystemConnectionStrings();
if (systemConnectionStrings.Any())
{
// intézmény kapcsolati leírók feltöltése (json fájlban megadott rendszer leíró db-kből lekérdezem a DB-khez tartozó intézményeket)
foreach (var connectionString in systemConnectionStrings)
{
intezmenyConnectionStrings = Dal.ServiceSystemConnection.Run(connectionString, h =>
{
return intezmenyConnectionStrings.Concat(
h.IntezmenyDal().GetOsszesIntezmeny()
.Select(intezmeny => new { key = intezmeny.ToLower(), value = connectionString })
.ToDictionary(k => k.key, v => v.value)
).ToDictionary(k => k.Key, v => v.Value);
});
}
}
AddOrUpdate(IntezmenyConnectionStringsCache, intezmenyConnectionStrings, oldValue => intezmenyConnectionStrings);
return intezmenyConnectionStrings;
}
private Dictionary<string, string> LoadIntezmenyConnectionStringsGlobalApi()
{
var systemType = KretaServer.Instance.Configuration.SystemType;
var intezmenyConnectionStrings = new Dictionary<string, string>();
var globalDbConnection = KretaServer.Instance.Configuration.GlobalDbConnection;
var globalApiClient = GlobalApiClientFactory.Build();
var token = globalApiClient.GetPrivateToken();
var dbConnectionList = globalApiClient.GetKretaAdatbaziselerhetosegek(token.AccessToken, systemType);
foreach (var dbConnenction in dbConnectionList)
{
intezmenyConnectionStrings.Add(dbConnenction.IntezmenyAzonosito.ToLower(), string.Format(globalDbConnection, dbConnenction.SqlInstanceName, dbConnenction.DatabaseName));
}
AddOrUpdate(IntezmenyConnectionStringsCache, intezmenyConnectionStrings, oldValue => intezmenyConnectionStrings);
return intezmenyConnectionStrings;
}
private string GetIntezmenyiFelhasznalo(string intezmenyAzonosito)
{
return $"KR_{intezmenyAzonosito}_user";
}
#endregion
#region Public methods
public IEnumerable<string> GetOsszesIntezmeny()
{
return GetIntezmenyConnectionStrings().Keys;
}
public IEnumerable<string> GetSystemConnectionStrings()
{
var result = (IList<string>)Get(SystemConnectionStringsCache) ?? LoadSystemConnectionStrings();
return result;
}
public string GetSystemConnectionString(string intezmenyAzonosito)
{
intezmenyAzonosito = intezmenyAzonosito.ToLower();
Dictionary<string, string> intezmenyConnectionStrings = GetIntezmenyConnectionStrings();
return intezmenyConnectionStrings.TryGetValue(intezmenyAzonosito, out string value)
? value
: KretaServer.Instance.Configuration.DBConnection;
}
public string GetIntezmenyConnectionString(string intezmenyAzonosito)
{
intezmenyAzonosito = intezmenyAzonosito.ToLower();
string connectionString = GetSystemConnectionString(intezmenyAzonosito);
Dictionary<string, string> intezmenyConnectionStrings = GetIntezmenyConnectionStrings();
if (intezmenyConnectionStrings.ContainsKey(intezmenyAzonosito))
{
var builder = new System.Data.SqlClient.SqlConnectionStringBuilder(connectionString)
{
UserID = GetIntezmenyiFelhasznalo(intezmenyAzonosito),
};
return builder.ToString();
}
return connectionString;
}
public void FillCache()
{
_ = GetSystemConnectionStrings();
_ = GetIntezmenyConnectionStrings();
}
public void ResetCache()
{
_ = LoadSystemConnectionStrings();
_ = LoadIntezmenyConnectionStrings();
}
#endregion
}
}

View file

@ -0,0 +1,172 @@
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<SystemSettingsCache.SystemSettingsData>
{
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);
});
}
/// <summary>
/// Visszaad egy rendszerbeállítást
/// </summary>
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;
}
/// <summary>
/// Visszaadja az összes rendszerbeállítást
/// </summary>
public List<SystemSettingsData> GetSystemSettings(string intezmenyAzonosito, int tanevId)
{
return Dal.OrganizationConnection.Run(intezmenyAzonosito, h =>
{
List<SystemSettingsData> result = new List<SystemSettingsData>();
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;
});
}
/// <summary>
/// Ment egy rendszerbeállítás
/// </summary>
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<int> 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);
}
}
}