diff options
| author | crupest <crupest@outlook.com> | 2022-12-06 11:58:37 +0800 | 
|---|---|---|
| committer | crupest <crupest@outlook.com> | 2022-12-20 20:32:52 +0800 | 
| commit | 46ee538c2ffe3ea76c647524c74c2ce6add8a2d3 (patch) | |
| tree | 7c43ccfb134a2fc82bacb95d4b365419981632e6 | |
| parent | b0c4265a5f638447e1ec0bbf75db8a626bc8f94a (diff) | |
| download | crupest-46ee538c2ffe3ea76c647524c74c2ce6add8a2d3.tar.gz crupest-46ee538c2ffe3ea76c647524c74c2ce6add8a2d3.tar.bz2 crupest-46ee538c2ffe3ea76c647524c74c2ce6add8a2d3.zip  | |
Develop secret api. v13
3 files changed, 122 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 b7f74e6..bbd5e9a 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs @@ -63,6 +63,14 @@ public class CrudService<TEntity>          return await connection.QueryAsync<TEntity>(sql, parameters);      } +    public virtual async Task<int> InsertAsync(InsertClause insert) +    { +        var connection = await EnsureDatabase(); +        DynamicParameters parameters; +        var sql = _table.GenerateInsertSql(insert, out parameters); +        return await connection.ExecuteAsync(sql, parameters); +    } +      public virtual async Task<int> UpdateAsync(WhereClause? where, UpdateClause update)      {          var connection = await EnsureDatabase(); diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs new file mode 100644 index 0000000..35b7cc9 --- /dev/null +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs @@ -0,0 +1,88 @@ +using System.Text; +using Dapper; + +namespace CrupestApi.Commons.Crud; + +public class InsertItem +{ +    public InsertItem(string columnName, object? value) +    { +        ColumnName = columnName; +        Value = value; +    } + +    public InsertItem(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?>(InsertItem item) +    { +        return new(item.ColumnName, item.Value); +    } + +    public static implicit operator InsertItem(KeyValuePair<string, object?> pair) +    { +        return new(pair); +    } +} + +public class InsertClause +{ +    public List<InsertItem> Items { get; } = new List<InsertItem>(); + +    public InsertClause(IEnumerable<InsertItem> items) +    { +        Items.AddRange(items); +    } + +    public InsertClause(params InsertItem[] items) +    { +        Items.AddRange(items); +    } + +    public InsertClause Add(params InsertItem[] items) +    { +        Items.AddRange(items); +        return this; +    } + +    public InsertClause Add(string column, object? value) +    { +        return Add(new InsertItem(column, value)); +    } + +    public static InsertClause Create(params InsertItem[] items) +    { +        return new InsertClause(items); +    } + +    public List<string> GetRelatedColumns() +    { +        return Items.Select(i => i.ColumnName).ToList(); +    } + +    public string GenerateColumnListSql() +    { +        return string.Join(", ", Items.Select(i => i.ColumnName)); +    } + +    public string GenerateValueListSql(DynamicParameters parameters) +    { +        var sb = new StringBuilder(); +        for (var i = 0; i < Items.Count; i++) +        { +            var item = Items[i]; +            var parameterName = parameters.AddRandomNameParameter(item.Value); +            sb.Append($"@{parameterName}"); +            if (i != Items.Count - 1) +                sb.Append(", "); +        } + +        return sb.ToString(); +    } +} diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index bf62df2..9610e40 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -190,6 +190,31 @@ CREATE TABLE {tableName}(          return result.ToString();      } +    public string GenerateInsertSql(InsertClause insertClause, out DynamicParameters parameters) +    { +        var relatedColumns = insertClause.GetRelatedColumns(); +        foreach (var column in relatedColumns) +        { +            if (!ColumnNameList.Contains(column)) +            { +                throw new ArgumentException($"Column {column} is not in the table."); +            } +        } + +        parameters = new DynamicParameters(); + +        var result = new StringBuilder() +            .Append("INSERT INTO ") +            .Append(TableName) +            .Append(" (") +            .Append(insertClause.GenerateColumnListSql()) +            .Append(") VALUES (") +            .Append(insertClause.GenerateValueListSql(parameters)) +            .Append(");"); + +        return result.ToString(); +    } +      public string GenerateUpdateSql(WhereClause? whereClause, UpdateClause updateClause, out DynamicParameters parameters)      {          var relatedColumns = new HashSet<string>(); @@ -200,7 +225,7 @@ CREATE TABLE {tableName}(          {              if (!ColumnNameList.Contains(column))              { -                throw new ArgumentException($"Field {column} is not in the table."); +                throw new ArgumentException($"Column {column} is not in the table.");              }          }  | 
