diff options
Diffstat (limited to 'dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/EntityJsonHelper.cs')
| -rw-r--r-- | dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/EntityJsonHelper.cs | 206 | 
1 files changed, 0 insertions, 206 deletions
| diff --git a/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/EntityJsonHelper.cs b/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/EntityJsonHelper.cs deleted file mode 100644 index cf3f178..0000000 --- a/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/EntityJsonHelper.cs +++ /dev/null @@ -1,206 +0,0 @@ -using System.Globalization; -using System.Text.Json; -using Microsoft.Extensions.Options; - -namespace CrupestApi.Commons.Crud; - -/// <summary> -/// Contains all you need to do with json. -/// </summary> -public class EntityJsonHelper<TEntity> where TEntity : class -{ -    private readonly TableInfo _table; -    private readonly IOptionsMonitor<JsonSerializerOptions> _jsonSerializerOptions; - -    public EntityJsonHelper(ITableInfoFactory tableInfoFactory, IOptionsMonitor<JsonSerializerOptions> jsonSerializerOptions) -    { -        _table = tableInfoFactory.Get(typeof(TEntity)); -        _jsonSerializerOptions = jsonSerializerOptions; -    } - -    public Dictionary<string, object?> ConvertEntityToDictionary(TEntity entity, bool includeNonColumnProperties = false) -    { -        var result = new Dictionary<string, object?>(); - -        foreach (var column in _table.PropertyColumns) -        { -            var value = column.PropertyInfo!.GetValue(entity); -            var realValue = column.ColumnType.ConvertToDatabase(value); -            result[column.ColumnName] = realValue; -        } - -        if (includeNonColumnProperties) -        { -            foreach (var propertyInfo in _table.NonColumnProperties) -            { -                var value = propertyInfo.GetValue(entity); -                result[propertyInfo.Name] = value; -            } -        } - -        return result; -    } - -    public string ConvertEntityToJson(TEntity entity, bool includeNonColumnProperties = false) -    { -        var dictionary = ConvertEntityToDictionary(entity, includeNonColumnProperties); -        return JsonSerializer.Serialize(dictionary, _jsonSerializerOptions.CurrentValue); -    } - -    private object? ConvertJsonValue(JsonElement? optionalJsonElement, Type type, string propertyName) -    { -        if (optionalJsonElement is null) -        { -            return null; -        } - -        var jsonElement = optionalJsonElement.Value; - -        if (jsonElement.ValueKind is JsonValueKind.Null or JsonValueKind.Undefined) -        { -            return null; -        } - -        if (jsonElement.ValueKind is JsonValueKind.String) -        { -            if (type != typeof(string)) -            { -                throw new UserException($"Property {propertyName} must be a string."); -            } -            return jsonElement.GetString()!; -        } - -        if (jsonElement.ValueKind is JsonValueKind.True or JsonValueKind.False) -        { -            if (type != typeof(bool)) -            { -                throw new UserException($"Property {propertyName} must be a boolean."); -            } -            return jsonElement.GetBoolean(); -        } - -        if (jsonElement.ValueKind is JsonValueKind.Number) -        { -            try -            { -                return Convert.ChangeType(jsonElement.GetRawText(), type, CultureInfo.InvariantCulture); -            } -            catch (Exception) -            { -                throw new UserException($"Property {propertyName} must be a valid number."); -            } -        } - -        throw new UserException($"Property {propertyName} is of wrong type."); -    } - -    public Dictionary<string, JsonElement> ConvertJsonObjectToDictionary(JsonElement jsonElement) -    { -        var result = new Dictionary<string, JsonElement>(); - -        foreach (var property in jsonElement.EnumerateObject()) -        { -            result[property.Name.ToLower()] = property.Value; -        } - -        return result; -    } - -    public TEntity ConvertJsonToEntityForInsert(JsonElement jsonElement) -    { -        if (jsonElement.ValueKind is not JsonValueKind.Object) -            throw new ArgumentException("The jsonElement must be an object."); - -        var result = Activator.CreateInstance<TEntity>(); - -        Dictionary<string, JsonElement> jsonProperties = ConvertJsonObjectToDictionary(jsonElement); - -        foreach (var column in _table.PropertyColumns) -        { -            var jsonPropertyValue = jsonProperties.GetValueOrDefault(column.ColumnName.ToLower()); -            var value = ConvertJsonValue(jsonPropertyValue, column.ColumnType.DatabaseClrType, column.ColumnName); -            if (column.IsOnlyGenerated && value is not null) -            { -                throw new UserException($"Property {column.ColumnName} is auto generated, you cannot set it."); -            } -            if (!column.CanBeGenerated && value is null && column.IsNotNull) -            { -                throw new UserException($"Property {column.ColumnName} can NOT be generated, you must set it."); -            } -            var realValue = column.ColumnType.ConvertFromDatabase(value); -            column.PropertyInfo!.SetValue(result, realValue); -        } - -        return result; -    } - -    public TEntity ConvertJsonToEntityForInsert(string json) -    { -        var jsonElement = JsonSerializer.Deserialize<JsonElement>(json, _jsonSerializerOptions.CurrentValue); -        return ConvertJsonToEntityForInsert(jsonElement!); -    } - -    public TEntity ConvertJsonToEntityForUpdate(JsonElement jsonElement, out UpdateBehavior updateBehavior) -    { -        if (jsonElement.ValueKind is not JsonValueKind.Object) -            throw new UserException("The jsonElement must be an object."); - -        updateBehavior = UpdateBehavior.None; - -        Dictionary<string, JsonElement> jsonProperties = ConvertJsonObjectToDictionary(jsonElement); - -        bool saveNull = false; -        if (jsonProperties.TryGetValue("$saveNull".ToLower(), out var saveNullValue)) -        { -            if (saveNullValue.ValueKind is JsonValueKind.True) -            { -                updateBehavior |= UpdateBehavior.SaveNull; -                saveNull = true; -            } -            else if (saveNullValue.ValueKind is JsonValueKind.False) -            { - -            } -            else -            { -                throw new UserException("The $saveNull must be a boolean."); -            } -        } - -        var result = Activator.CreateInstance<TEntity>(); -        foreach (var column in _table.PropertyColumns) -        { -            if (jsonProperties.TryGetValue(column.ColumnName.ToLower(), out var jsonPropertyValue)) -            { -                if (jsonPropertyValue.ValueKind is JsonValueKind.Null or JsonValueKind.Undefined) -                { -                    if ((column.IsOnlyGenerated || column.IsNoUpdate) && saveNull) -                    { -                        throw new UserException($"Property {column.ColumnName} is auto generated or not updatable, you cannot set it."); -                    } - -                    column.PropertyInfo!.SetValue(result, null); -                } -                else -                { -                    if (column.IsOnlyGenerated || column.IsNoUpdate) -                    { -                        throw new UserException($"Property {column.ColumnName} is auto generated or not updatable, you cannot set it."); -                    } - -                    var value = ConvertJsonValue(jsonPropertyValue, column.ColumnType.DatabaseClrType, column.ColumnName); -                    var realValue = column.ColumnType.ConvertFromDatabase(value); -                    column.PropertyInfo!.SetValue(result, realValue); -                } -            } -        } - -        return result; -    } - -    public TEntity ConvertJsonToEntityForUpdate(string json, out UpdateBehavior updateBehavior) -    { -        var jsonElement = JsonSerializer.Deserialize<JsonElement>(json, _jsonSerializerOptions.CurrentValue); -        return ConvertJsonToEntityForUpdate(jsonElement!, out updateBehavior); -    } -} | 
