mirror of
https://github.com/nsnail/NetAdmin.git
synced 2025-04-23 14:42:51 +08:00
refactor: ♻️ seedDataInsertedEventAsync (#190)
Co-authored-by: tk <fiyne1a@dingtalk.com>
This commit is contained in:
parent
8479f69bdc
commit
0848c8b7e5
@ -15,6 +15,8 @@ XML注释文件不存在
|
|||||||
时间表达式
|
时间表达式
|
||||||
用户名不能是手机号码
|
用户名不能是手机号码
|
||||||
用户名长度4位以上
|
用户名长度4位以上
|
||||||
|
种子数据插入完成
|
||||||
|
记录已存在
|
||||||
请求对象不能为空
|
请求对象不能为空
|
||||||
邀请码不正确
|
邀请码不正确
|
||||||
配置文件初始化完毕
|
配置文件初始化完毕
|
||||||
|
36
src/backend/NetAdmin.Domain/Events/SeedDataInsertedEvent.cs
Normal file
36
src/backend/NetAdmin.Domain/Events/SeedDataInsertedEvent.cs
Normal 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; }
|
||||||
|
}
|
@ -23,7 +23,12 @@ public abstract class ApiResultHandler<T>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
|
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
|
||||||
{
|
{
|
||||||
var naException = context.Exception switch { NetAdminException ex => ex, _ => null };
|
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 errorCode = naException?.Code ?? ErrorCodes.Unhandled;
|
||||||
var result = RestfulResult(errorCode, metadata.Data
|
var result = RestfulResult(errorCode, metadata.Data
|
||||||
, naException is NetAdminValidateException vEx
|
, naException is NetAdminValidateException vEx
|
||||||
|
@ -29,6 +29,21 @@ public sealed class SqlProfiler(ILogger<SqlProfiler> logger) : IEventSubscriber
|
|||||||
return Task.CompletedTask;
|
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>
|
||||||
/// 同步数据库结构之后
|
/// 同步数据库结构之后
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -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_ID = nameof(FLG_CONTEXT_USER_ID);
|
||||||
public const string FLG_CONTEXT_USER_INFO = nameof(FLG_CONTEXT_USER_INFO);
|
public const string FLG_CONTEXT_USER_INFO = nameof(FLG_CONTEXT_USER_INFO);
|
||||||
public const string FLG_CRON_PER_SECS = "* * * * * *";
|
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 = "nvarchar";
|
||||||
public const string FLG_DB_FIELD_TYPE_NVARCHAR_1022 = "nvarchar(1022)";
|
public const string FLG_DB_FIELD_TYPE_NVARCHAR_1022 = "nvarchar(1022)";
|
||||||
public const string FLG_DB_FIELD_TYPE_NVARCHAR_127 = "nvarchar(127)";
|
public const string FLG_DB_FIELD_TYPE_NVARCHAR_127 = "nvarchar(127)";
|
||||||
|
@ -13,7 +13,7 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构建freeSql对象
|
/// 构建freeSql对象
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IFreeSql Build(FreeSqlInitMethods initMethods)
|
public IFreeSql Build(FreeSqlInitMethods initMethods, Func<int, Task> onSeedDataInserted = null)
|
||||||
{
|
{
|
||||||
var freeSql = new FreeSql.FreeSqlBuilder()
|
var freeSql = new FreeSql.FreeSqlBuilder()
|
||||||
#if DBTYPE_SQLSERVER
|
#if DBTYPE_SQLSERVER
|
||||||
@ -25,7 +25,7 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
|
|||||||
.UseGenerateCommandParameterWithLambda(true)
|
.UseGenerateCommandParameterWithLambda(true)
|
||||||
.UseAutoSyncStructure(initMethods.HasFlag(FreeSqlInitMethods.SyncStructure))
|
.UseAutoSyncStructure(initMethods.HasFlag(FreeSqlInitMethods.SyncStructure))
|
||||||
.Build();
|
.Build();
|
||||||
_ = InitDbAsync(freeSql, initMethods); // 初始化数据库 ,异步
|
_ = InitDbAsync(freeSql, initMethods, onSeedDataInserted); // 初始化数据库 ,异步
|
||||||
return freeSql;
|
return freeSql;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化数据库
|
/// 初始化数据库
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private Task InitDbAsync(IFreeSql freeSql, FreeSqlInitMethods initMethods)
|
private Task InitDbAsync(IFreeSql freeSql, FreeSqlInitMethods initMethods, Func<int, Task> onSeedDataInserted)
|
||||||
{
|
{
|
||||||
return Task.Run(() => {
|
return Task.Run(() => {
|
||||||
if (initMethods == FreeSqlInitMethods.None) {
|
if (initMethods == FreeSqlInitMethods.None) {
|
||||||
@ -82,7 +82,8 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (initMethods.HasFlag(FreeSqlInitMethods.InsertSeedData)) {
|
if (initMethods.HasFlag(FreeSqlInitMethods.InsertSeedData)) {
|
||||||
InsertSeedData(freeSql, entityTypes);
|
var insertCount = InsertSeedData(freeSql, entityTypes);
|
||||||
|
_ = onSeedDataInserted?.Invoke(insertCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (initMethods.HasFlag(FreeSqlInitMethods.CompareStructure)) {
|
if (initMethods.HasFlag(FreeSqlInitMethods.CompareStructure)) {
|
||||||
@ -94,8 +95,9 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 插入种子数据
|
/// 插入种子数据
|
||||||
/// </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) {
|
foreach (var entityType in entityTypes) {
|
||||||
var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, databaseOptions.SeedDataRelativePath, $"{entityType.Name}.json");
|
var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, databaseOptions.SeedDataRelativePath, $"{entityType.Name}.json");
|
||||||
if (!File.Exists(file)) {
|
if (!File.Exists(file)) {
|
||||||
@ -113,7 +115,7 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
|
|||||||
_ = jsonSerializerOptions.Converters.AddDateTimeTypeConverters();
|
_ = jsonSerializerOptions.Converters.AddDateTimeTypeConverters();
|
||||||
|
|
||||||
var jsonTypeInfo = JsonTypeInfo.CreateJsonTypeInfo(typeof(IEnumerable<>).MakeGenericType(entityType), jsonSerializerOptions);
|
var jsonTypeInfo = JsonTypeInfo.CreateJsonTypeInfo(typeof(IEnumerable<>).MakeGenericType(entityType), jsonSerializerOptions);
|
||||||
var entities = JsonSerializer.Deserialize(fs, jsonTypeInfo);
|
dynamic entities = JsonSerializer.Deserialize(fs, jsonTypeInfo);
|
||||||
|
|
||||||
// 如果表存在数据,跳过
|
// 如果表存在数据,跳过
|
||||||
var select = typeof(IFreeSql).GetMethod(nameof(freeSql.Select), 1, Type.EmptyTypes)?.MakeGenericMethod(entityType).Invoke(freeSql, null);
|
var select = typeof(IFreeSql).GetMethod(nameof(freeSql.Select), 1, Type.EmptyTypes)?.MakeGenericMethod(entityType).Invoke(freeSql, null);
|
||||||
@ -130,7 +132,10 @@ public sealed class FreeSqlBuilder(DatabaseOptions databaseOptions)
|
|||||||
var insert = MakeInsertMethod(entityType);
|
var insert = MakeInsertMethod(entityType);
|
||||||
|
|
||||||
_ = insert?.Invoke(rep, [entities]);
|
_ = insert?.Invoke(rep, [entities]);
|
||||||
|
ret += entities!.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -33,11 +33,12 @@ public static class ServiceCollectionExtensions
|
|||||||
// initOptions = FreeSqlInitOptions.None;
|
// initOptions = FreeSqlInitOptions.None;
|
||||||
// #endif
|
// #endif
|
||||||
var dbOptions = App.GetOptions<DatabaseOptions>();
|
var dbOptions = App.GetOptions<DatabaseOptions>();
|
||||||
var fSql = new FreeSqlBuilder(dbOptions).Build(initMethods);
|
var eventPublisher = App.GetService<IEventPublisher>();
|
||||||
|
|
||||||
|
var fSql = new FreeSqlBuilder(dbOptions).Build(initMethods, count => eventPublisher.PublishAsync(new SeedDataInsertedEvent(count)));
|
||||||
_ = me.AddSingleton(fSql);
|
_ = me.AddSingleton(fSql);
|
||||||
|
|
||||||
fSql.Aop.AuditValue += SqlAuditor.DataAuditHandler; // Insert/Update自动值处理
|
fSql.Aop.AuditValue += SqlAuditor.DataAuditHandler; // Insert/Update自动值处理
|
||||||
var eventPublisher = App.GetService<IEventPublisher>();
|
|
||||||
|
|
||||||
#pragma warning disable VSTHRD110
|
#pragma warning disable VSTHRD110
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user