kra/internal/initialize/initialize.go

194 lines
3.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}