You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.3 KiB
60 lines
1.3 KiB
1 month ago
|
// internal/core/manager.go
|
||
|
package core
|
||
|
|
||
|
import (
|
||
|
"gofaster/internal/shared/config"
|
||
|
"gofaster/internal/shared/database"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/gin-gonic/gin"
|
||
|
"go.uber.org/zap"
|
||
|
"gorm.io/gorm"
|
||
|
)
|
||
|
|
||
|
type ModuleManager struct {
|
||
|
modules []Module
|
||
|
logger *zap.Logger
|
||
|
mu sync.Mutex
|
||
|
}
|
||
|
|
||
|
func NewModuleManager(logger *zap.Logger) *ModuleManager {
|
||
|
return &ModuleManager{
|
||
|
logger: logger,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (m *ModuleManager) RegisterModule(module Module) {
|
||
|
m.mu.Lock()
|
||
|
defer m.mu.Unlock()
|
||
|
m.modules = append(m.modules, module)
|
||
|
}
|
||
|
|
||
|
func (m *ModuleManager) InitModules(config *config.Config, db *gorm.DB, redis *database.RedisClient) error {
|
||
|
for _, module := range m.modules {
|
||
|
m.logger.Info("Initializing module", zap.String("module", module.Name()))
|
||
|
if err := module.Init(config, m.logger, db, redis); err != nil {
|
||
|
m.logger.Error("Failed to initialize module",
|
||
|
zap.String("module", module.Name()),
|
||
|
zap.Error(err))
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (m *ModuleManager) RegisterRoutes(router *gin.RouterGroup) {
|
||
|
for _, module := range m.modules {
|
||
|
m.logger.Info("Registering routes for module",
|
||
|
zap.String("module", module.Name()))
|
||
|
module.RegisterRoutes(router)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (m *ModuleManager) Cleanup() {
|
||
|
for _, module := range m.modules {
|
||
|
m.logger.Info("Cleaning up module",
|
||
|
zap.String("module", module.Name()))
|
||
|
module.Cleanup()
|
||
|
}
|
||
|
}
|