refactor: ♻️ seedDataInsertedEventAsync (#190)

Co-authored-by: tk <fiyne1a@dingtalk.com>
This commit is contained in:
nsnail 2024-11-08 14:55:35 +08:00 committed by GitHub
parent 8479f69bdc
commit 0848c8b7e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 78 additions and 14 deletions

View File

@ -15,6 +15,8 @@ XML注释文件不存在
时间表达式
用户名不能是手机号码
用户名长度4位以上
种子数据插入完成
记录已存在
请求对象不能为空
邀请码不正确
配置文件初始化完毕

View File

@ -0,0 +1,36 @@
namespace NetAdmin.Domain.Events;
/// <summary>
/// 种子数据插入完毕事件
/// </summary>
public sealed record SeedDataInsertedEvent : DataAbstraction, IEventSource
{
/// <summary>
/// Initializes a new instance of the <see cref="SeedDataInsertedEvent" /> class.
/// </summary>
public SeedDataInsertedEvent(int insertedCount)
{
InsertedCount = insertedCount;
EventId = nameof(SeedDataInsertedEvent);
}
/// <inheritdoc />
public CancellationToken CancellationToken { get; }
/// <inheritdoc />
public DateTime CreatedTime { get; }
/// <inheritdoc />
public string EventId { get; }
/// <inheritdoc />
public bool IsConsumOnce { get; }
/// <inheritdoc />
public object Payload { get; }
/// <summary>
/// 插入数量
/// </summary>
public int InsertedCount { get; set; }
}

View File

@ -23,8 +23,13 @@ public abstract class ApiResultHandler<T>
/// </summary>
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
{
var naException = context.Exception switch { NetAdminException ex => ex, _ => null };
var errorCode = naException?.Code ?? ErrorCodes.Unhandled;
var naException = context.Exception switch {
NetAdminException ex => ex
, _ => context.Exception.Message.Contains(Chars.FLG_DB_EXCEPTION_PRIMARY_KEY_CONFLICT)
? new NetAdminInvalidOperationException(Ln.)
: null
};
var errorCode = naException?.Code ?? ErrorCodes.Unhandled;
var result = RestfulResult(errorCode, metadata.Data
, naException is NetAdminValidateException vEx
? vEx.ValidateResults

View File

@ -29,6 +29,21 @@ public sealed class SqlProfiler(ILogger<SqlProfiler> logger) : IEventSubscriber
return Task.CompletedTask;
}
/// <summary>
/// 种子数据插入完毕
/// </summary>
[EventSubscribe(nameof(SeedDataInsertedEvent))]
public Task SeedDataInsertedEventAsync(EventHandlerExecutingContext context)
{
var source = context.Source as SeedDataInsertedEvent;
logger.Info(source);
if (App.WebHostEnvironment.IsDevelopment()) {
Environment.Exit(0);
}
return Task.CompletedTask;
}
/// <summary>
/// 同步数据库结构之后
/// </summary>

View File

@ -15,7 +15,7 @@ public static class Chars
public const string FLG_CONTEXT_USER_ID = nameof(FLG_CONTEXT_USER_ID);
public const string FLG_CONTEXT_USER_INFO = nameof(FLG_CONTEXT_USER_INFO);
public const string FLG_CRON_PER_SECS = "* * * * * *";
public const string FLG_DB_EXCEPTION_PRIVATE_KEY_CONFLICT = "PRIMARY KEY";
public const string FLG_DB_EXCEPTION_PRIMARY_KEY_CONFLICT = "PRIMARY KEY";
public const string FLG_DB_FIELD_TYPE_NVARCHAR = "nvarchar";
public const string FLG_DB_FIELD_TYPE_NVARCHAR_1022 = "nvarchar(1022)";
public const string FLG_DB_FIELD_TYPE_NVARCHAR_127 = "nvarchar(127)";

View File

@ -13,7 +13,7 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
/// <summary>
/// 构建freeSql对象
/// </summary>
public IFreeSql Build(FreeSqlInitMethods initMethods)
public IFreeSql Build(FreeSqlInitMethods initMethods, Func<int, Task> onSeedDataInserted = null)
{
var freeSql = new FreeSql.FreeSqlBuilder()
#if DBTYPE_SQLSERVER
@ -25,7 +25,7 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
.UseGenerateCommandParameterWithLambda(true)
.UseAutoSyncStructure(initMethods.HasFlag(FreeSqlInitMethods.SyncStructure))
.Build();
_ = InitDbAsync(freeSql, initMethods); // 初始化数据库 ,异步
_ = InitDbAsync(freeSql, initMethods, onSeedDataInserted); // 初始化数据库 ,异步
return freeSql;
}
@ -69,7 +69,7 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
/// <summary>
/// 初始化数据库
/// </summary>
private Task InitDbAsync(IFreeSql freeSql, FreeSqlInitMethods initMethods)
private Task InitDbAsync(IFreeSql freeSql, FreeSqlInitMethods initMethods, Func<int, Task> onSeedDataInserted)
{
return Task.Run(() => {
if (initMethods == FreeSqlInitMethods.None) {
@ -82,7 +82,8 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
}
if (initMethods.HasFlag(FreeSqlInitMethods.InsertSeedData)) {
InsertSeedData(freeSql, entityTypes);
var insertCount = InsertSeedData(freeSql, entityTypes);
_ = onSeedDataInserted?.Invoke(insertCount);
}
if (initMethods.HasFlag(FreeSqlInitMethods.CompareStructure)) {
@ -94,8 +95,9 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
/// <summary>
/// 插入种子数据
/// </summary>
private void InsertSeedData(IFreeSql freeSql, IEnumerable<Type> entityTypes)
private int InsertSeedData(IFreeSql freeSql, IEnumerable<Type> entityTypes)
{
var ret = 0;
foreach (var entityType in entityTypes) {
var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, databaseOptions.SeedDataRelativePath, $"{entityType.Name}.json");
if (!File.Exists(file)) {
@ -112,8 +114,8 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
};
_ = jsonSerializerOptions.Converters.AddDateTimeTypeConverters();
var jsonTypeInfo = JsonTypeInfo.CreateJsonTypeInfo(typeof(IEnumerable<>).MakeGenericType(entityType), jsonSerializerOptions);
var entities = JsonSerializer.Deserialize(fs, jsonTypeInfo);
var jsonTypeInfo = JsonTypeInfo.CreateJsonTypeInfo(typeof(IEnumerable<>).MakeGenericType(entityType), jsonSerializerOptions);
dynamic entities = JsonSerializer.Deserialize(fs, jsonTypeInfo);
// 如果表存在数据,跳过
var select = typeof(IFreeSql).GetMethod(nameof(freeSql.Select), 1, Type.EmptyTypes)?.MakeGenericMethod(entityType).Invoke(freeSql, null);
@ -129,8 +131,11 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
var insert = MakeInsertMethod(entityType);
_ = insert?.Invoke(rep, [entities]);
_ = insert?.Invoke(rep, [entities]);
ret += entities!.Count;
}
return ret;
}
/// <summary>

View File

@ -32,12 +32,13 @@ public static class ServiceCollectionExtensions
// #if !DEBUG
// initOptions = FreeSqlInitOptions.None;
// #endif
var dbOptions = App.GetOptions<DatabaseOptions>();
var fSql = new FreeSqlBuilder(dbOptions).Build(initMethods);
var dbOptions = App.GetOptions<DatabaseOptions>();
var eventPublisher = App.GetService<IEventPublisher>();
var fSql = new FreeSqlBuilder(dbOptions).Build(initMethods, count => eventPublisher.PublishAsync(new SeedDataInsertedEvent(count)));
_ = me.AddSingleton(fSql);
fSql.Aop.AuditValue += SqlAuditor.DataAuditHandler; // Insert/Update自动值处理
var eventPublisher = App.GetService<IEventPublisher>();
#pragma warning disable VSTHRD110