aboutsummaryrefslogtreecommitdiff
path: root/docker/crupest-api
diff options
context:
space:
mode:
Diffstat (limited to 'docker/crupest-api')
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs8
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs88
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs27
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.");
}
}