using System.Diagnostics.CodeAnalysis; using Tiobon.Core.Common; using Tiobon.Core.Common.DB; using Tiobon.Core.Controllers; using Tiobon.Core.Model; using Tiobon.Core.Model.Models; using Tiobon.Core.Model.Systems.DataBase; using Tiobon.Core.Model.Tenants; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SqlSugar; namespace Tiobon.Core.Api.Controllers.Systems; /// /// 数据库管理 /// [Route("api/Systems/[controller]/[action]")] [ApiController] [Authorize(Permissions.Name)] public class DataBaseController : BaseApiController { private readonly ISqlSugarClient _db; public DataBaseController(ISqlSugarClient db) { _db = db; } [return: NotNull] private ISqlSugarClient GetTenantDb(string configId) { if (!_db.AsTenant().IsAnyConnection(configId)) { var tenant = _db.Queryable().WithCache() .Where(s => s.TenantType == TenantTypeEnum.Db) .Where(s => s.ConfigId == configId) .First(); if (tenant != null) { _db.AsTenant().AddConnection(tenant.GetConnectionConfig()); } } var db = _db.AsTenant().GetConnectionScope(configId); if (db is null) { throw new ApplicationException("无效的数据库配置"); } return db; } /// /// 获取库配置 /// /// [HttpGet] public async Task>> GetAllConfig() { //增加多租户的连接 var allConfigs = new List(BaseDBConfig.AllConfigs); var tenants = await _db.Queryable().WithCache() .Where(s => s.TenantType == TenantTypeEnum.Db) .ToListAsync(); if (tenants.Any()) { allConfigs.AddRange(tenants.Select(tenant => tenant.GetConnectionConfig())); } var configs = await Task.FromResult(allConfigs); return Success(configs.Adapt>()); } /// /// 获取表信息 /// /// 配置Id /// 读取类型 /// [HttpGet] public MessageModel> GetTableInfoList(string configId, DataBaseReadType readType = DataBaseReadType.Db) { if (configId.IsNullOrEmpty()) { configId = MainDb.CurrentDbConnId; } configId = configId.ToLower(); var provider = GetTenantDb(configId); List data = null; switch (readType) { case DataBaseReadType.Db: data = provider.DbMaintenance.GetTableInfoList(false); break; case DataBaseReadType.Entity: if (EntityUtility.TenantEntitys.TryGetValue(configId, out var types)) { data = types.Select(s => provider.EntityMaintenance.GetEntityInfo(s)) .Select(s => new {Name = s.DbTableName, Description = s.TableDescription}) .Adapt>(); } break; } return Success(data); } /// /// 获取表字段 /// /// 表名 /// ConfigId /// 读取类型 /// [HttpGet] public MessageModel> GetColumnInfosByTableName(string tableName, string configId = null, DataBaseReadType readType = DataBaseReadType.Db) { if (string.IsNullOrWhiteSpace(tableName)) return Failed>("表名不能为空"); if (configId.IsNullOrEmpty()) { configId = MainDb.CurrentDbConnId; } configId = configId.ToLower(); List data = null; var provider = GetTenantDb(configId); switch (readType) { case DataBaseReadType.Db: data = provider.DbMaintenance.GetColumnInfosByTableName(tableName, false) .Adapt>(); break; case DataBaseReadType.Entity: if (EntityUtility.TenantEntitys.TryGetValue(configId, out var types)) { var type = types.FirstOrDefault(s => s.Name == tableName); data = provider.EntityMaintenance.GetEntityInfo(type).Columns.Adapt>(); } break; } return Success(data); } /// /// 编辑表备注 /// /// [HttpPut] public MessageModel PutTableEditRemark([FromBody] EditTableInput input) { var provider = GetTenantDb(input.ConfigId); if (provider.DbMaintenance.IsAnyTableRemark(input.TableName)) { provider.DbMaintenance.DeleteTableRemark(input.TableName); } provider.DbMaintenance.AddTableRemark(input.TableName, input.Description); return Success(); } /// /// 编辑列备注 /// /// [HttpPut] public MessageModel PutColumnEditRemark([FromBody] EditColumnInput input) { var provider = GetTenantDb(input.ConfigId); if (provider.DbMaintenance.IsAnyColumnRemark(input.DbColumnName, input.TableName)) { provider.DbMaintenance.DeleteColumnRemark(input.DbColumnName, input.TableName); } provider.DbMaintenance.AddColumnRemark(input.DbColumnName, input.TableName, input.ColumnDescription); return Success(); } }