aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-12-06 11:14:32 +0800
committercrupest <crupest@outlook.com>2022-12-20 20:32:52 +0800
commit58d109a1cde88ee9614852ef301f2a8be359cc1c (patch)
treeb33df5481aa9ea36e9236976725e64d00e05327f
parent3d55a8a37e0e56e56a0bdad4fbb7a69a5d36d54b (diff)
downloadcrupest-58d109a1cde88ee9614852ef301f2a8be359cc1c.tar.gz
crupest-58d109a1cde88ee9614852ef301f2a8be359cc1c.tar.bz2
crupest-58d109a1cde88ee9614852ef301f2a8be359cc1c.zip
Develop secret api. v11
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs8
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs30
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/UpdateClause.cs70
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs2
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);