diff --git a/ChaosBot/WebServer/App/ApiControllers/BaseApiController.cs b/ChaosBot/WebServer/App/ApiControllers/BaseApiController.cs index cd9b039..5e6d513 100644 --- a/ChaosBot/WebServer/App/ApiControllers/BaseApiController.cs +++ b/ChaosBot/WebServer/App/ApiControllers/BaseApiController.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; @@ -64,14 +65,23 @@ namespace ChaosBot.WebServer.App.ApiControllers await using ChaosbotContext dbContext = new ChaosbotContext(); - T databaseObject = new T(); + T databaseObject = SetDefaultFieldsForUpsert(new T(), guildId); foreach (string key in GetValidationRules().Keys) { + Type type = databaseObject?.GetType()?.GetProperty(key)?.PropertyType; + if (type == null) continue; + + dynamic value; + if (type.IsEnum) + value = Convert.ChangeType(Enum.ToObject(type, JsonElementHelper.GetValueFromRequest(requestBody, key)), type); + else + value = Convert.ChangeType(JsonElementHelper.GetValueFromRequest(requestBody, key), type); + databaseObject .GetType() .GetProperty(key) - ?.SetValue(databaseObject, requestBody.GetType().GetProperty(key)?.GetValue(requestBody, null)); + ?.SetValue(databaseObject, value); } await ApplyFilterForUpsert(GetBasicQuery(dbContext).Upsert(databaseObject)).RunAsync(); @@ -110,6 +120,7 @@ namespace ChaosBot.WebServer.App.ApiControllers protected abstract UpsertCommandBuilder ApplyFilterForUpsert(UpsertCommandBuilder builder); protected abstract T FilterQueryForDeletion(IQueryable query, ulong guildId, TDeleteParameter deleteParameter); protected abstract List FilterQueryMultipleForDeletion(IQueryable query, ulong guildId, TDeleteParameter deleteParameter); + protected abstract T SetDefaultFieldsForUpsert(T obj, ulong guildId); private class DynamicResponse : DynamicObject { diff --git a/ChaosBot/WebServer/App/ApiControllers/CustomCommandController.cs b/ChaosBot/WebServer/App/ApiControllers/CustomCommandController.cs index f631bd0..9546cad 100644 --- a/ChaosBot/WebServer/App/ApiControllers/CustomCommandController.cs +++ b/ChaosBot/WebServer/App/ApiControllers/CustomCommandController.cs @@ -93,5 +93,11 @@ namespace ChaosBot.WebServer.App.ApiControllers { return new List(); } + + protected override CustomCommand SetDefaultFieldsForUpsert(CustomCommand obj, ulong guildId) + { + obj.DiscordGuildId = guildId; + return obj; + } } } diff --git a/ChaosBot/WebServer/Services/JsonElementHelper.cs b/ChaosBot/WebServer/Services/JsonElementHelper.cs new file mode 100644 index 0000000..01a805b --- /dev/null +++ b/ChaosBot/WebServer/Services/JsonElementHelper.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Text.Json; + +namespace ChaosBot.WebServer.Services +{ + public static class JsonElementHelper + { + public static dynamic GetValueFromRequest(JsonElement requestBody, string key) + { + JsonElement prop; + try + { + prop = requestBody.GetProperty(key); + } + catch (KeyNotFoundException) + { + return null; + } + + return prop.ValueKind switch + { + JsonValueKind.String => prop.GetString(), + JsonValueKind.Number => prop.GetInt64(), + JsonValueKind.True => prop.GetBoolean(), + JsonValueKind.False => prop.GetBoolean(), + _ => null + }; + } + } +} diff --git a/ChaosBot/WebServer/Services/ValidationService.cs b/ChaosBot/WebServer/Services/ValidationService.cs index 696e66e..c90f040 100644 --- a/ChaosBot/WebServer/Services/ValidationService.cs +++ b/ChaosBot/WebServer/Services/ValidationService.cs @@ -15,7 +15,7 @@ namespace ChaosBot.WebServer.Services foreach (KeyValuePair> validationRule in getValidationRules) { string key = validationRule.Key; - dynamic value = GetValueFromRequest(requestBody, key); + dynamic value = JsonElementHelper.GetValueFromRequest(requestBody, key); List rules = validationRule.Value; @@ -48,28 +48,6 @@ namespace ChaosBot.WebServer.Services return error.Length == 0; } - private static dynamic GetValueFromRequest(JsonElement requestBody, string key) - { - JsonElement prop; - try - { - prop = requestBody.GetProperty(key); - } - catch (KeyNotFoundException) - { - return null; - } - - return prop.ValueKind switch - { - JsonValueKind.String => prop.GetString(), - JsonValueKind.Number => prop.GetInt64(), - JsonValueKind.True => prop.GetBoolean(), - JsonValueKind.False => prop.GetBoolean(), - _ => null - }; - } - private ValidationResult CheckRequired(string key, dynamic value) { if (value != null)