kreta/Kreta.KretaServer/SystemSettings/SystemSettingsManager.cs
2024-03-13 00:33:46 +01:00

389 lines
18 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Kreta.Enums;
using Kreta.Framework;
using Kreta.KretaServer.Caching;
using Kreta.KretaServer.SystemSettings.SettingsTypes;
using Newtonsoft.Json;
namespace Kreta.KretaServer.SystemSettings
{
public static class SystemSettingsManager
{
private static T DeserializeControlObject<T>(string json, SystemSettingsControlTypeEnum controlType)
{
Type typeinfo = null;
switch (controlType)
{
case SystemSettingsControlTypeEnum.CheckBox:
typeinfo = typeof(SettingsCheckBox);
break;
case SystemSettingsControlTypeEnum.CheckBoxGroup:
typeinfo = typeof(SettingsCheckBoxGroup);
break;
case SystemSettingsControlTypeEnum.DatePicker:
typeinfo = typeof(SettingsDatePicker);
break;
case SystemSettingsControlTypeEnum.TimePicker:
typeinfo = typeof(SettingsTimePicker);
break;
case SystemSettingsControlTypeEnum.NumericTextBox:
typeinfo = typeof(SettingsNumericTextBox);
break;
case SystemSettingsControlTypeEnum.DropDownList:
typeinfo = typeof(SettingsDropDownList);
break;
case SystemSettingsControlTypeEnum.RadioButtonGroup:
typeinfo = typeof(SettingsRadioButtonGroup);
break;
case SystemSettingsControlTypeEnum.TrueFalse:
typeinfo = typeof(SettingsSwitchButton);
break;
case SystemSettingsControlTypeEnum.MultiSelect:
typeinfo = typeof(SettingsMultiSelect);
break;
default:
break;
}
return (T)JsonConvert.DeserializeObject(json, typeinfo);
}
/// <summary>
/// Visszaadja az adotr rendszerbeállítás értékét.
/// </summary>
/// <typeparam name="T">Enum, String, int, bool, List<int>, List<string> List<Enum></typeparam>
/// <param name="beallitasTipus"></param>
/// <returns>
/// Az adott beállítás értéke a megadott típusba vagy a megadott tipus alap értéke ha nincs érték PL: CheckBoxGroup.
/// </returns>
public static T GetSystemSettingValue<T>(RendszerBeallitasTipusEnum beallitasTipus, string intezmenyAzonosito, int tanevId)
{
var setting = SDAServer.Instance.CacheManager.AquireCache<SystemSettingsCache>().GetSystemSetting(beallitasTipus, intezmenyAzonosito, tanevId);
var inputType = typeof(T);
switch (setting.Type)
{
case SystemSettingsControlTypeEnum.CheckBox:
var checkBox = DeserializeControlObject<SettingsCheckBox>(setting.Json, setting.Type);
{
if (inputType.Equals(typeof(string)))
{
return (T)((object)checkBox.IsSelected.ToString());
}
if (inputType.Equals(typeof(bool)))
{
return (T)((object)checkBox.IsSelected);
}
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
case SystemSettingsControlTypeEnum.CheckBoxGroup:
var checkBoxGroup = DeserializeControlObject<SettingsCheckBoxGroup>(setting.Json, setting.Type);
{
if (inputType.Equals(typeof(string)))
{
var selectedOptions = string.Join(",", checkBoxGroup.Options.Where(x => x.Selected).Select(y => y.Value).ToArray());
return (T)((object)selectedOptions);
}
if (inputType.Equals(typeof(List<string>)))
{
var stringList = new List<string>();
foreach (var box in checkBoxGroup.Options)
{
if (box.Selected)
{
stringList.Add(box.Value);
}
}
return (T)((object)stringList);
}
if (inputType.Equals(typeof(List<int>)))
{
var intList = new List<int>();
foreach (var box in checkBoxGroup.Options)
{
int optionValue;
if (box.Selected)
{
if (int.TryParse(box.Value, out optionValue))
{
intList.Add(optionValue);
}
else
{
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
}
}
}
return (T)((object)intList);
}
}
var nestedTypes = inputType.GetGenericArguments();
if (nestedTypes.Length == 1 && nestedTypes[0].IsEnum)
{
var nestedType = nestedTypes[0];
var enumlist = (IList)Activator.CreateInstance(inputType);
foreach (var box in checkBoxGroup.Options)
{
int enumvalue;
if (int.TryParse(box.Value, out enumvalue) && Enum.IsDefined(nestedType, enumvalue))
{
enumlist.Add(Enum.Parse(nestedType, box.Value));
}
}
return (T)(enumlist);
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
case SystemSettingsControlTypeEnum.DatePicker:
var datePicker = DeserializeControlObject<SettingsDatePicker>(setting.Json, setting.Type);
{
if (inputType.Equals(typeof(string)))
{
return (T)((object)datePicker.Date.ToString());
}
if (inputType.Equals(typeof(DateTime)))
{
return (T)((object)datePicker.Date);
}
if (inputType.Equals(typeof(DateTime?)))
{
if (datePicker.Date.HasValue)
{
return (T)((object)datePicker.Date.Value);
}
return (T)(object)null;
}
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
case SystemSettingsControlTypeEnum.TimePicker:
var timePicker = DeserializeControlObject<SettingsTimePicker>(setting.Json, setting.Type);
{
if (inputType.Equals(typeof(string)))
{
return (T)((object)timePicker.Time.ToString());
}
if (inputType.Equals(typeof(TimeSpan)))
{
return (T)((object)timePicker.Time);
}
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
case SystemSettingsControlTypeEnum.NumericTextBox:
var numericTextBox = DeserializeControlObject<SettingsNumericTextBox>(setting.Json, setting.Type);
{
if (inputType.Equals(typeof(string)))
{
return (T)((object)numericTextBox.Value.ToString());
}
if (inputType.Equals(typeof(int)) || inputType.Equals(typeof(double)))
{
return (T)((object)numericTextBox.Value);
}
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
case SystemSettingsControlTypeEnum.DropDownList:
var dropDown = DeserializeControlObject<SettingsDropDownList>(setting.Json, setting.Type);
var value = dropDown.Options.First(x => x.Selected == true).Value;
{
if (inputType.Equals(typeof(string)))
{
return (T)((object)value);
}
if (inputType.Equals(typeof(int)))
{
int result;
if (int.TryParse(value, out result))
{
return (T)((object)result);
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
}
if (inputType.IsEnum)
{
int valueInt;
if (int.TryParse(value, out valueInt) && Enum.IsDefined(inputType, valueInt))
{
return (T)Enum.Parse(inputType, valueInt.ToString());
}
}
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
case SystemSettingsControlTypeEnum.RadioButtonGroup:
var radiobuttonGroup = DeserializeControlObject<SettingsRadioButtonGroup>(setting.Json, setting.Type);
var selected = radiobuttonGroup.Options.First(x => x.Selected).Value;
{
if (inputType.Equals(typeof(string)))
{
return (T)((object)selected);
}
if (inputType.Equals(typeof(int)))
{
int result;
if (int.TryParse(selected, out result))
{
return (T)((object)result);
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
}
if (inputType.IsEnum)
{
int enumInt;
if (int.TryParse(selected, out enumInt) && Enum.IsDefined(inputType, enumInt))
{
return (T)Enum.Parse(inputType, enumInt.ToString());
}
}
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
case SystemSettingsControlTypeEnum.TrueFalse:
var switchbutton = DeserializeControlObject<SettingsSwitchButton>(setting.Json, setting.Type);
{
if (inputType.Equals(typeof(string)))
{
return (T)((object)switchbutton.Value.ToString());
}
if (inputType.Equals(typeof(bool)))
{
return (T)((object)switchbutton.Value);
}
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
case SystemSettingsControlTypeEnum.MultiSelect:
var multiSelect = DeserializeControlObject<SettingsMultiSelect>(setting.Json, setting.Type);
{
if (inputType.Equals(typeof(string)))
{
var selectedOptions = string.Join(",", multiSelect.Options.Where(x => x.Selected).Select(y => y.Value).ToArray());
return (T)((object)selectedOptions);
}
if (inputType.Equals(typeof(List<string>)))
{
var stringList = new List<string>();
foreach (var box in multiSelect.Options)
{
if (box.Selected)
{
stringList.Add(box.Value);
}
}
return (T)((object)stringList);
}
if (inputType.Equals(typeof(List<int>)))
{
var intList = new List<int>();
foreach (var box in multiSelect.Options)
{
int optionValue;
if (box.Selected)
{
if (int.TryParse(box.Value, out optionValue))
{
intList.Add(optionValue);
}
else
{
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
}
}
}
return (T)((object)intList);
}
}
var nestedMultiTypes = inputType.GetGenericArguments();
if (nestedMultiTypes.Length == 1 && nestedMultiTypes[0].IsEnum)
{
var nestedType = nestedMultiTypes[0];
var enumlist = (IList)Activator.CreateInstance(inputType);
foreach (var box in multiSelect.Options)
{
int enumvalue;
if (int.TryParse(box.Value, out enumvalue) && Enum.IsDefined(nestedType, enumvalue))
{
enumlist.Add(Enum.Parse(nestedType, box.Value));
}
}
return (T)(enumlist);
}
throw new InvalidCastException(string.Format("Can not cast setting value string to a given Type of {0}", inputType.ToString()));
default:
throw new NotSupportedException("The given SystemSettingsControl Type is unsupportd by the method!");
}
}
/// <summary>
/// Beállítja az adott beállítás értékét.
/// </summary>
/// <param name="settingType">Rendszerbeállítás tipus</param>
/// <param name="settingObject">
/// SystemSettingType object
/// </param>
public static void SetSystemSettings(RendszerBeallitasTipusEnum settingType, string intezmenyAzonosito, int tanevId, object settingObject, int? kovTanevId)
{
SDAServer.Instance.CacheManager.AquireCache<SystemSettingsCache>().SetSystemSettings(settingType, intezmenyAzonosito, tanevId, settingObject, kovTanevId);
}
/// <summary>
/// Visszaállítja az alapértékeket a db-ben majd frissiti a cachet
/// </summary>
/// <returns></returns>
public static bool ResetSystemSettings(string intezmenyAzonosito, int? intezmenyID, int? tanevID, List<int> exceptSystemSettings)
{
return SDAServer.Instance.CacheManager.AquireCache<SystemSettingsCache>().ResetSystemSettings(intezmenyAzonosito, intezmenyID, tanevID, exceptSystemSettings);
}
/// <summary>
/// Visszaadja az összes rednszerbeállítás leíró objektumot.
/// </summary>
/// <returns></returns>
public static List<SystemSettingsCache.SystemSettingsData> GetSystemSettings(string intezmenyAzonosito, int tanevId)
{
return SDAServer.Instance.CacheManager.AquireCache<SystemSettingsCache>().GetSystemSettings(intezmenyAzonosito, tanevId);
}
/// <summary>
/// Visszaadja a rendszerbeállítás osztály. Tartalmazza a rendszerbeállítás tipusát, json stringet és a json object tipusát
/// </summary>
/// <param name="beallitasTipus"></param>
/// <returns></returns>
public static SystemSettingsCache.SystemSettingsData GetSystemSetting(RendszerBeallitasTipusEnum beallitasTipus, string intezmenyAzonosito, int tanevId)
{
return SDAServer.Instance.CacheManager.AquireCache<SystemSettingsCache>().GetSystemSetting(beallitasTipus, intezmenyAzonosito, tanevId);
}
}
}