package initialize import ( "kra/internal/conf" "github.com/gin-gonic/gin" "github.com/redis/go-redis/v9" "gorm.io/gorm" ) // Initializer 初始化器 type Initializer struct { config *conf.Bootstrap db *gorm.DB dbList *DBList redis *RedisClient redisList *RedisList timerManager *TimerManager pluginManager *PluginManager mcpServer *MCPServer } // NewInitializer 创建初始化器 func NewInitializer(config *conf.Bootstrap) *Initializer { return &Initializer{ config: config, } } // InitDB 初始化主数据库 func (i *Initializer) InitDB() (*gorm.DB, error) { dbType := "mysql" if i.config.System != nil && i.config.System.DbType != "" { dbType = i.config.System.DbType } db, err := NewDBByType(dbType, i.config) if err != nil { return nil, err } i.db = db return db, nil } // InitDBList 初始化多数据库 func (i *Initializer) InitDBList() (*DBList, error) { dbList, err := InitDBList(i.config.DbList) if err != nil { return nil, err } // 如果有system数据库,设置为主数据库 if sysDB := dbList.GetSystem(); sysDB != nil { i.db = sysDB } i.dbList = dbList return dbList, nil } // InitRedis 初始化主Redis func (i *Initializer) InitRedis() (*RedisClient, error) { if i.config.Redis == nil { return nil, nil } client, err := NewRedisClient(i.config.Redis) if err != nil { return nil, err } i.redis = client return client, nil } // InitRedisList 初始化多Redis func (i *Initializer) InitRedisList() (*RedisList, error) { redisList, err := InitRedisList(i.config.RedisList) if err != nil { return nil, err } i.redisList = redisList return redisList, nil } // InitTimer 初始化定时任务 func (i *Initializer) InitTimer() *TimerManager { manager := NewTimerManager(i.db) manager.Start() i.timerManager = manager return manager } // InitPlugin 初始化插件管理器 func (i *Initializer) InitPlugin() *PluginManager { manager := NewPluginManager(i.db) i.pluginManager = manager return manager } // InitMCP 初始化MCP服务器 func (i *Initializer) InitMCP() *MCPServer { server := NewMCPServer(i.config.Mcp) i.mcpServer = server return server } // DB 获取主数据库 func (i *Initializer) DB() *gorm.DB { return i.db } // DBList 获取数据库列表 func (i *Initializer) DBList() *DBList { return i.dbList } // Redis 获取主Redis客户端 func (i *Initializer) Redis() redis.UniversalClient { if i.redis == nil { return nil } return i.redis.Client() } // RedisList 获取Redis列表 func (i *Initializer) RedisList() *RedisList { return i.redisList } // TimerManager 获取定时任务管理器 func (i *Initializer) TimerManager() *TimerManager { return i.timerManager } // PluginManager 获取插件管理器 func (i *Initializer) PluginManager() *PluginManager { return i.pluginManager } // MCPServer 获取MCP服务器 func (i *Initializer) MCPServer() *MCPServer { return i.mcpServer } // InstallPlugins 安装插件 func (i *Initializer) InstallPlugins(privateGroup *gin.RouterGroup, publicGroup *gin.RouterGroup, engine *gin.Engine) { if i.pluginManager != nil { i.pluginManager.InstallPlugins(privateGroup, publicGroup, engine) } } // RegisterMCPRoutes 注册MCP路由 func (i *Initializer) RegisterMCPRoutes(engine *gin.Engine) { if i.mcpServer != nil { i.mcpServer.RegisterRoutes(engine) } } // Close 关闭所有资源 func (i *Initializer) Close() error { // 关闭定时任务 if i.timerManager != nil { i.timerManager.Stop() } // 关闭数据库连接 if i.db != nil { sqlDB, err := i.db.DB() if err == nil { sqlDB.Close() } } // 关闭数据库列表 if i.dbList != nil { i.dbList.Close() } // 关闭Redis连接 if i.redis != nil { i.redis.Close() } // 关闭Redis列表 if i.redisList != nil { i.redisList.Close() } return nil }