package database import ( "go.uber.org/zap" "api_bb/internal/models" "api_bb/pkg/logger" ) // Migrate выполняет автоматические миграции для всех моделей func (d *Database) Migrate() error { zapLogger := logger.Get() zapLogger.Info("starting database migration") // Список всех моделей для миграции models := []interface{}{ &models.User{}, &models.News{}, &models.Comment{}, &models.Review{}, &models.UserStats{}, &models.Workout{}, &models.Achievement{}, &models.Event{}, &models.EventRegistration{}, &models.PersonalBest{}, // Добавьте другие модели здесь } for _, model := range models { modelName := getModelName(model) zapLogger.Debug("migrating model", zap.String("model", modelName)) if err := d.DB.AutoMigrate(model); err != nil { zapLogger.Error("failed to migrate model", zap.String("model", modelName), zap.Error(err), ) return err } } zapLogger.Info("database migration completed successfully") return nil } // MigrateModels выполняет миграции для конкретных моделей func (d *Database) MigrateModels(models ...interface{}) error { zapLogger := logger.Get() zapLogger.Info("starting migration for specific models", zap.Int("model_count", len(models)), ) for _, model := range models { modelName := getModelName(model) zapLogger.Debug("migrating model", zap.String("model", modelName)) if err := d.DB.AutoMigrate(model); err != nil { zapLogger.Error("failed to migrate model", zap.String("model", modelName), zap.Error(err), ) return err } } zapLogger.Info("models migration completed successfully") return nil } // getModelName возвращает имя модели для логирования func getModelName(model interface{}) string { switch model.(type) { case *models.User: return "User" case *models.News: return "News" case *models.Comment: return "Comment" case *models.Review: return "Reviews" case *models.UserStats: return "Статистика Пользователя" case *models.Workout: return "Тренировки пользователя" case *models.Achievement: return "Достижения пользователя" case *models.Event: return "Событие" case *models.EventRegistration: return "Администрирование события" case *models.PersonalBest: return "Персональные достижения" default: return "Unknown" } }