diff options
author | crupest <crupest@outlook.com> | 2022-12-06 11:14:32 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-12-20 20:32:52 +0800 |
commit | 58d109a1cde88ee9614852ef301f2a8be359cc1c (patch) | |
tree | b33df5481aa9ea36e9236976725e64d00e05327f | |
parent | 3d55a8a37e0e56e56a0bdad4fbb7a69a5d36d54b (diff) | |
download | crupest-58d109a1cde88ee9614852ef301f2a8be359cc1c.tar.gz crupest-58d109a1cde88ee9614852ef301f2a8be359cc1c.tar.bz2 crupest-58d109a1cde88ee9614852ef301f2a8be359cc1c.zip |
Develop secret api. v11
4 files changed, 109 insertions, 1 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs index f6bbb12..b7f74e6 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs @@ -62,4 +62,12 @@ public class CrudService<TEntity> var sql = _table.GenerateSelectSql(where, orderBy, skip, limit, out parameters); return await connection.QueryAsync<TEntity>(sql, parameters); } + + public virtual async Task<int> UpdateAsync(WhereClause? where, UpdateClause update) + { + var connection = await EnsureDatabase(); + DynamicParameters parameters; + var sql = _table.GenerateUpdateSql(where, update, out parameters); + return await connection.ExecuteAsync(sql, parameters); + } } diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index 04d7f40..bf62df2 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -189,4 +189,34 @@ CREATE TABLE {tableName}( return result.ToString(); } + + public string GenerateUpdateSql(WhereClause? whereClause, UpdateClause updateClause, out DynamicParameters parameters) + { + var relatedColumns = new HashSet<string>(); + if (whereClause is not null) + relatedColumns.UnionWith(((IWhereClause)whereClause).GetRelatedColumns() ?? Enumerable.Empty<string>()); + relatedColumns.UnionWith(updateClause.GetRelatedColumns()); + foreach (var column in relatedColumns) + { + if (!ColumnNameList.Contains(column)) + { + throw new ArgumentException($"Field {column} is not in the table."); + } + } + + parameters = new DynamicParameters(); + + StringBuilder sb = new StringBuilder("UPDATE "); + sb.Append(TableName); + sb.Append(" SET "); + sb.Append(updateClause.GenerateSql(parameters)); + if (whereClause is not null) + { + sb.Append(" WHERE "); + sb.Append(whereClause.GenerateSql(parameters)); + } + sb.Append(';'); + + return sb.ToString(); + } }
\ No newline at end of file diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/UpdateClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/UpdateClause.cs new file mode 100644 index 0000000..84267a3 --- /dev/null +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/UpdateClause.cs @@ -0,0 +1,70 @@ +using System.Text; +using Dapper; + +namespace CrupestApi.Commons.Crud; + +public class UpdateItem +{ + public UpdateItem(string columnName, object? value) + { + ColumnName = columnName; + Value = value; + } + + public UpdateItem(KeyValuePair<string, object?> pair) + { + ColumnName = pair.Key; + Value = pair.Value; + } + + public string ColumnName { get; set; } + public object? Value { get; set; } + + public static implicit operator KeyValuePair<string, object?>(UpdateItem item) + { + return new(item.ColumnName, item.Value); + } + + public static implicit operator UpdateItem(KeyValuePair<string, object?> pair) + { + return new(pair); + } +} + +public class UpdateClause +{ + public List<UpdateItem> Items { get; } = new List<UpdateItem>(); + + public UpdateClause(IEnumerable<UpdateItem> items) + { + Items.AddRange(items); + } + + public UpdateClause(params UpdateItem[] items) + { + Items.AddRange(items); + } + + public List<string> GetRelatedColumns() + { + return Items.Select(i => i.ColumnName).ToList(); + } + + public string GenerateSql(DynamicParameters parameters) + { + StringBuilder result = new StringBuilder(); + + foreach (var item in Items) + { + if (result.Length > 0) + { + result.Append(", "); + } + + var parameterName = parameters.AddRandomNameParameter(item.Value); + result.Append($"{item.ColumnName} = @{parameterName}"); + } + + return result.ToString(); + } +} diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs index a62aaec..674ac9d 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs @@ -53,7 +53,7 @@ public interface IWhereClause public static class DynamicParametersExtensions { - public static string AddRandomNameParameter(this DynamicParameters parameters, object value) + public static string AddRandomNameParameter(this DynamicParameters parameters, object? value) { var parameterName = IWhereClause.GenerateRandomParameterName(parameters); parameters.Add(parameterName, value); |