11using Juggle . Application . Models . Response ;
2+ using Juggle . Application . Services ;
3+ using Juggle . Domain . Entities ;
24using Juggle . Infrastructure . Persistence ;
35using Microsoft . AspNetCore . Authorization ;
46using Microsoft . AspNetCore . Mvc ;
79
810namespace Juggle . Api . Controllers . Api ;
911
10- /// <summary>Redis 配置:流程 REDIS_GET/REDIS_SET 节点与缓存能力使用。</summary>
12+ /// <summary>
13+ /// Redis 实例配置:支持多个实例(一个默认),流程 REDIS_GET/REDIS_SET 节点按实例选择(0=默认)。
14+ /// </summary>
1115[ ApiController ]
1216[ Route ( "api/system/redis" ) ]
1317[ Authorize ]
1418public class RedisConfigController : ControllerBase
1519{
1620 private readonly JuggleDbContext _db ;
21+ private readonly ITenantAccessor _tenant ;
1722
18- public RedisConfigController ( JuggleDbContext db ) => _db = db ;
23+ public RedisConfigController ( JuggleDbContext db , ITenantAccessor tenant )
24+ {
25+ _db = db ;
26+ _tenant = tenant ;
27+ }
28+
29+ /// <summary>实例列表(含是否默认)</summary>
30+ [ HttpGet ( "configs" ) ]
31+ public async Task < ApiResult > List ( )
32+ => ApiResult . Success ( await _db . RedisConfigs . Where ( r => r . Deleted == 0 ) . OrderByDescending ( r => r . Id ) . ToListAsync ( ) ) ;
1933
20- [ HttpGet ( "config" ) ]
21- public async Task < ApiResult > GetConfig ( )
34+ /// <summary>保存(新增/更新)实例</summary>
35+ [ HttpPost ( "config/save" ) ]
36+ public async Task < ApiResult > Save ( [ FromBody ] RedisConfigSaveRequest req )
2237 {
23- var configs = await _db . SystemConfigs
24- . Where ( c => c . Deleted == 0 && c . ConfigKey ! . StartsWith ( "redis." ) )
25- . ToListAsync ( ) ;
26- string ? Get ( string key ) => configs . FirstOrDefault ( c => c . ConfigKey == key ) ? . ConfigValue ;
27- return ApiResult . Success ( new
38+ RedisConfigEntity entity ;
39+ if ( req . Id > 0 )
40+ {
41+ entity = await _db . RedisConfigs . FindAsync ( req . Id ) ?? throw new Exception ( "实例不存在" ) ;
42+ }
43+ else
44+ {
45+ entity = new RedisConfigEntity { CreatedAt = DateTime . Now . ToString ( "o" ) , TenantId = _tenant . TenantId } ;
46+ _db . RedisConfigs . Add ( entity ) ;
47+ }
48+ entity . ConfigName = req . ConfigName ;
49+ entity . Host = req . Host ;
50+ entity . Port = req . Port ;
51+ entity . Password = req . Password ;
52+ entity . Db = req . Db ;
53+ entity . IsDefault = req . IsDefault ? 1 : 0 ;
54+ entity . UpdatedAt = DateTime . Now . ToString ( "o" ) ;
55+ await _db . SaveChangesAsync ( ) ;
56+
57+ // 默认实例唯一
58+ if ( entity . IsDefault == 1 )
2859 {
29- host = Get ( "redis.host" ) ?? "" ,
30- port = Get ( "redis.port" ) ?? "6379" ,
31- password = Get ( "redis.password" ) ?? "" ,
32- db = Get ( "redis.db" ) ?? "0"
33- } ) ;
60+ var others = await _db . RedisConfigs . Where ( r => r . Deleted == 0 && r . Id != entity . Id && r . IsDefault == 1 ) . ToListAsync ( ) ;
61+ foreach ( var o in others ) o . IsDefault = 0 ;
62+ if ( others . Count > 0 ) await _db . SaveChangesAsync ( ) ;
63+ }
64+ return ApiResult . Success ( entity . Id ) ;
3465 }
3566
36- [ HttpPost ( "config" ) ]
37- public async Task < ApiResult > SaveConfig ( [ FromBody ] RedisConfigRequest req )
67+ /// <summary>删除实例</summary>
68+ [ HttpDelete ( "config/{id}" ) ]
69+ public async Task < ApiResult > Delete ( long id )
3870 {
39- await UpsertAsync ( "redis.host" , req . Host ? . Trim ( ) ?? "" , "Redis地址" ) ;
40- await UpsertAsync ( "redis.port" , req . Port ? . Trim ( ) ?? "6379" , "Redis端口 ") ;
41- await UpsertAsync ( "redis.password" , req . Password ? . Trim ( ) ?? "" , "Redis密码" ) ;
42- await UpsertAsync ( "redis.db" , req . Db ? . Trim ( ) ?? "0" , "Redis数据库" ) ;
71+ var entity = await _db . RedisConfigs . FindAsync ( id ) ;
72+ if ( entity == null ) return ApiResult . Fail ( "实例不存在 ") ;
73+ entity . Deleted = 1 ;
74+ await _db . SaveChangesAsync ( ) ;
4375 return ApiResult . Success ( ) ;
4476 }
4577
46- /// <summary>测试 Redis 连接 </summary>
47- [ HttpPost ( "test" ) ]
48- public async Task < ApiResult > Test ( [ FromBody ] RedisConfigRequest req )
78+ /// <summary>测试连接 </summary>
79+ [ HttpPost ( "config/ test" ) ]
80+ public async Task < ApiResult > Test ( [ FromBody ] RedisConfigSaveRequest req )
4981 {
5082 try
5183 {
52- var connStr = $ " { req . Host ? . Trim ( ) } : { req . Port ? . Trim ( ) ?? "6379" } ,password= { req . Password ? . Trim ( ) } ,defaultDatabase= { req . Db ? . Trim ( ) ?? "0" } ,abortConnect=false,connectTimeout=5000" ;
84+ var connStr = BuildConnStr ( req . Host , req . Port , req . Password , req . Db ) ;
5385 var conn = await ConnectionMultiplexer . ConnectAsync ( connStr ) ;
5486 var pong = await conn . GetDatabase ( ) . PingAsync ( ) ;
5587 await conn . CloseAsync ( ) ;
@@ -61,30 +93,18 @@ public async Task<ApiResult> Test([FromBody] RedisConfigRequest req)
6193 }
6294 }
6395
64- private async Task UpsertAsync ( string key , string value , string name )
65- {
66- var entity = await _db . SystemConfigs . FirstOrDefaultAsync ( c => c . ConfigKey == key ) ;
67- if ( entity == null )
68- {
69- _db . SystemConfigs . Add ( new Domain . Entities . SystemConfigEntity
70- {
71- ConfigKey = key , ConfigValue = value , ConfigName = name , ConfigGroup = "Redis" ,
72- CreatedAt = DateTime . Now . ToString ( "o" )
73- } ) ;
74- }
75- else
76- {
77- entity . ConfigValue = value ;
78- entity . UpdatedAt = DateTime . Now . ToString ( "o" ) ;
79- }
80- await _db . SaveChangesAsync ( ) ;
81- }
96+ /// <summary>组装连接串(供节点执行与测试共用)</summary>
97+ public static string BuildConnStr ( string ? host , string ? port , string ? password , string ? db )
98+ => $ "{ host ? . Trim ( ) } :{ port ? . Trim ( ) ?? "6379" } ,password={ password ? . Trim ( ) } ,defaultDatabase={ db ? . Trim ( ) ?? "0" } ,abortConnect=false,connectTimeout=5000";
8299}
83100
84- public class RedisConfigRequest
101+ public class RedisConfigSaveRequest
85102{
103+ public long Id { get ; set ; }
104+ public string ConfigName { get ; set ; } = "" ;
86105 public string Host { get ; set ; } = "" ;
87106 public string Port { get ; set ; } = "6379" ;
88107 public string Password { get ; set ; } = "" ;
89108 public string Db { get ; set ; } = "0" ;
109+ public bool IsDefault { get ; set ; }
90110}
0 commit comments