|
|
|
// internal/core/manager.go
|
|
|
|
package core
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"gofaster/internal/shared/config"
|
|
|
|
"gofaster/internal/shared/database"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ModuleManager 模块管理器
|
|
|
|
type ModuleManager struct {
|
|
|
|
modules map[string]Module
|
|
|
|
mutex sync.RWMutex
|
|
|
|
logger *zap.Logger
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewModuleManager 创建新的模块管理器
|
|
|
|
func NewModuleManager(logger *zap.Logger) *ModuleManager {
|
|
|
|
return &ModuleManager{
|
|
|
|
modules: make(map[string]Module),
|
|
|
|
logger: logger,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// RegisterModule 注册模块
|
|
|
|
func (m *ModuleManager) RegisterModule(module Module) {
|
|
|
|
m.mutex.Lock()
|
|
|
|
defer m.mutex.Unlock()
|
|
|
|
m.modules[module.Name()] = module
|
|
|
|
log.Printf("✅ 模块 %s 注册成功", module.Name())
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetModule 获取模块
|
|
|
|
func (m *ModuleManager) GetModule(name string) (Module, bool) {
|
|
|
|
m.mutex.RLock()
|
|
|
|
defer m.mutex.RUnlock()
|
|
|
|
module, exists := m.modules[name]
|
|
|
|
return module, exists
|
|
|
|
}
|
|
|
|
|
|
|
|
// InitModules 初始化所有模块
|
|
|
|
func (m *ModuleManager) InitModules(cfg *config.Config, db *gorm.DB, redis *database.RedisClient) error {
|
|
|
|
m.mutex.Lock()
|
|
|
|
defer m.mutex.Unlock()
|
|
|
|
|
|
|
|
for name, module := range m.modules {
|
|
|
|
m.logger.Info("初始化模块", zap.String("module", name))
|
|
|
|
if err := module.Init(cfg, m.logger, db, redis); err != nil {
|
|
|
|
return fmt.Errorf("初始化模块 %s 失败: %w", name, err)
|
|
|
|
}
|
|
|
|
m.logger.Info("模块初始化成功", zap.String("module", name))
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// RegisterRoutes 注册所有模块的路由
|
|
|
|
func (m *ModuleManager) RegisterRoutes(router *gin.RouterGroup) {
|
|
|
|
m.mutex.RLock()
|
|
|
|
defer m.mutex.RUnlock()
|
|
|
|
|
|
|
|
for name, module := range m.modules {
|
|
|
|
m.logger.Info("注册模块路由", zap.String("module", name))
|
|
|
|
module.RegisterRoutes(router)
|
|
|
|
m.logger.Info("模块路由注册完成", zap.String("module", name))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start 启动所有模块
|
|
|
|
func (m *ModuleManager) Start() error {
|
|
|
|
// 加载配置
|
|
|
|
cfg, err := config.LoadConfig()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("加载配置失败: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 初始化数据库
|
|
|
|
db, err := database.NewDB(&cfg.DB)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("初始化数据库失败: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 启动所有模块
|
|
|
|
for name, module := range m.modules {
|
|
|
|
if err := module.Start(cfg, db); err != nil {
|
|
|
|
return fmt.Errorf("启动模块 %s 失败: %w", name, err)
|
|
|
|
}
|
|
|
|
log.Printf("✅ 模块 %s 启动成功", name)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Stop 停止所有模块
|
|
|
|
func (m *ModuleManager) Stop() error {
|
|
|
|
for name, module := range m.modules {
|
|
|
|
if err := module.Stop(); err != nil {
|
|
|
|
m.logger.Error("停止模块失败", zap.String("module", name), zap.Error(err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|