diff --git a/ChaosBot/Database/Repository/ConfigurationRepository.cs b/ChaosBot/Database/Repository/ConfigurationRepository.cs index 85e475c..70b5c6b 100644 --- a/ChaosBot/Database/Repository/ConfigurationRepository.cs +++ b/ChaosBot/Database/Repository/ConfigurationRepository.cs @@ -34,17 +34,25 @@ namespace ChaosBot.Database.Repository public static T GetValue(string configurationFlag, ulong guildId) { if (Program._logger == null) return AppSettingsHandler.GetValue($"Servers:{guildId}:{configurationFlag}"); - - Program._logger.Info($"===> called for {configurationFlag} in {guildId}"); + + string valueSerialized = GetValueRaw(configurationFlag, Convert.ToInt64(guildId)); + if (valueSerialized != null) + return ServerConfigurationFlag.Deserialize(valueSerialized); + return AppSettingsHandler.GetValue($"Servers:{guildId}:{configurationFlag}"); + } + + public static string GetValueRaw(string configurationFlag, long guildId) + { Dictionary filterColumns = new Dictionary(); filterColumns.Add("key", configurationFlag); - filterColumns.Add("guildId", Convert.ToInt64(guildId)); + filterColumns.Add("guildId", guildId); DataTable valueTable = Controller.SelectQuery(ServersTable, filterColumns: filterColumns); if (valueTable.Rows.Count == 1) { - return ServerConfigurationFlag.Deserialize(valueTable.Rows[0]["serializedValue"].ToString()); + return valueTable.Rows[0]["serializedValue"].ToString(); } - return AppSettingsHandler.GetValue($"Servers:{guildId}:{configurationFlag}"); + + return null; } /// @@ -56,5 +64,45 @@ namespace ChaosBot.Database.Repository { return AppSettingsHandler.GetSection(configurationFlag); } + + /// + /// Get guild specific configuration option + /// + /// + /// + /// + /// + public static void SetValue(string configurationFlag, ulong guildId, T value) + { + SetValueRaw(configurationFlag, Convert.ToInt64(guildId), ServerConfigurationFlag.Serialize(value)); + } + + public static void SetValueRaw(string configurationFlag, long guildId, string serializedValue) + { + try + { + Dictionary filterColumns = new Dictionary(); + filterColumns.Add("key", configurationFlag); + filterColumns.Add("guildId", guildId); + + Dictionary newValue = new Dictionary(); + newValue.Add("key", configurationFlag); + newValue.Add("guildId", guildId); + newValue.Add("serializedValue", serializedValue); + + DataTable valueTable = Controller.SelectQuery(ServersTable, "COUNT(*)", filterColumns); + if ((long) valueTable.Rows[0]["COUNT(*)"] == 1) + { + Controller.UpdateQuery(ServersTable, newValue, filterColumns); + return; + } + + Controller.InsertQuery(ServersTable, newValue); + } + catch (Exception ex) + { + Program._logger.Fatal($"ConfigurationRepository.SetValueRaw: Exception [{ex}] thrown, <[{ex.Message}]>."); + } + } } } \ No newline at end of file diff --git a/ChaosBot/WebServer/App/Controller/ConfigurationController.cs b/ChaosBot/WebServer/App/Controller/ConfigurationController.cs new file mode 100644 index 0000000..a499e30 --- /dev/null +++ b/ChaosBot/WebServer/App/Controller/ConfigurationController.cs @@ -0,0 +1,26 @@ +using System; +using ChaosBot.Database.Repository; +using Microsoft.AspNetCore.Mvc; +using NLog; + +namespace ChaosBot.WebServer.App.Controller +{ + [ApiController] + [Route("/config/{guildId}/{flag}")] + public class ConfigurationController + { + private readonly Logger _logger = Program._logger; + + [HttpGet] + public string GetConfigurationFlag(long guildId, string flag) + { + return ConfigurationRepository.GetValueRaw(flag, guildId); + } + + [HttpPost] + public void SetConfigurationFlag(long guildId, string flag, [FromBody] string serializedValue) + { + ConfigurationRepository.SetValueRaw(flag, guildId, serializedValue); + } + } +} \ No newline at end of file