using Microsoft.Extensions.DependencyInjection;
using System;
using StackExchange.Profiling;
using FreeSql;
using ZhonTai.Admin.Core.Auth;
using ZhonTai.Admin.Core.Configs;
using ZhonTai.Admin.Core.Dto;
using ZhonTai.Admin.Core.Entities;
using ZhonTai.Admin.Domain.Tenant;
using ZhonTai.Admin.Core.Consts;
namespace ZhonTai.Admin.Core.Db;
public static class FreeSqlCloudExtesions
{
///
/// 创建FreeSql实例
///
///
///
///
///
///
private static IFreeSql CreateFreeSql(IUser user, AppConfig appConfig, DbConfig dbConfig, CreateFreeSqlTenantDto tenant)
{
var freeSqlBuilder = new FreeSqlBuilder()
.UseConnectionString(tenant.DbType.Value, tenant.ConnectionString)
.UseAutoSyncStructure(false)
.UseLazyLoading(false)
.UseNoneCommandParameter(true);
#region 监听所有命令
if (dbConfig.MonitorCommand)
{
freeSqlBuilder.UseMonitorCommand(cmd => { }, (cmd, traceLog) =>
{
Console.WriteLine($"{cmd.CommandText}\r\n");
});
}
#endregion 监听所有命令
var fsql = freeSqlBuilder.Build();
fsql.GlobalFilter.ApplyOnly(FilterNames.Delete, a => a.IsDeleted == false);
//配置实体
DbHelper.ConfigEntity(fsql, appConfig);
#region 监听Curd操作
if (dbConfig.Curd)
{
fsql.Aop.CurdBefore += (s, e) =>
{
if (appConfig.MiniProfiler)
{
MiniProfiler.Current.CustomTiming("CurdBefore", e.Sql);
}
Console.WriteLine($"{e.Sql}\r\n");
};
fsql.Aop.CurdAfter += (s, e) =>
{
if (appConfig.MiniProfiler)
{
MiniProfiler.Current.CustomTiming("CurdAfter", $"{e.ElapsedMilliseconds}");
}
Console.WriteLine($"{e.Sql}\r\n");
};
}
#endregion 监听Curd操作
#region 审计数据
//计算服务器时间
var serverTime = fsql.Ado.QuerySingle(() => DateTime.UtcNow);
var timeOffset = DateTime.UtcNow.Subtract(serverTime);
fsql.Aop.AuditValue += (s, e) =>
{
DbHelper.AuditValue(e, timeOffset, user);
};
#endregion 审计数据
if (appConfig.Tenant)
{
fsql.GlobalFilter.ApplyOnly(FilterNames.Tenant, a => a.TenantId == user.TenantId);
}
return fsql;
}
///
/// 获得当前登录用户数据库
///
///
///
///
public static IFreeSql GetCurrentDb(this FreeSqlCloud cloud, IServiceProvider serviceProvider)
{
var user = serviceProvider.GetRequiredService();
var appConfig = serviceProvider.GetRequiredService();
var tenantId = user.TenantId;
if (appConfig.Tenant && tenantId.HasValue)
{
var dbKey = user.DbKey.NotNull() ? user.DbKey : (DbKeys.TenantDb + tenantId);
var exists = cloud.ExistsRegister(dbKey);
if (!exists)
{
var dbConfig = serviceProvider.GetRequiredService();
var tenantRepository = serviceProvider.GetRequiredService();
var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne();
cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant));
}
return cloud.Use(dbKey);
}
else
{
var masterDb = cloud.Use(DbKeys.MasterDb);
return masterDb;
}
}
///
/// 获得租户数据库
///
///
///
///
///
public static IFreeSql GetTenantDb(this FreeSqlCloud cloud, IServiceProvider serviceProvider, long? tenantId = null)
{
if (!tenantId.HasValue)
{
return null;
}
var tenantRepository = serviceProvider.GetRequiredService();
var tenant = tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(tenantId).ToOne();
var dbKey = tenant.DbKey.NotNull() ? tenant.DbKey : (DbKeys.TenantDb + tenantId);
var exists = cloud.ExistsRegister(dbKey);
if (!exists)
{
var user = serviceProvider.GetRequiredService();
var dbConfig = serviceProvider.GetRequiredService();
var appConfig = serviceProvider.GetRequiredService();
cloud.Register(dbKey, () => CreateFreeSql(user, appConfig, dbConfig, tenant));
}
return cloud.Use(dbKey);
}
}