package models import ( "log/slog" "strings" "gorm.io/gorm" ) // AllModels returns all models for auto-migration func AllModels() []interface{} { return []interface{}{ &Category{}, &LotMetadata{}, &Project{}, &Configuration{}, &PriceOverride{}, &PricingAlert{}, &ComponentUsageStats{}, &Pricelist{}, &PricelistItem{}, } } // Migrate runs auto-migration for all QuoteForge tables // Handles MySQL constraint errors gracefully for existing tables func Migrate(db *gorm.DB) error { for _, model := range AllModels() { if err := db.AutoMigrate(model); err != nil { // Skip known MySQL constraint errors for existing tables errStr := err.Error() if strings.Contains(errStr, "Can't DROP") || strings.Contains(errStr, "Duplicate key name") || strings.Contains(errStr, "check that it exists") { slog.Warn("migration warning (skipped)", "model", model, "error", errStr) continue } return err } } return nil } // SeedCategories inserts default categories if not exist func SeedCategories(db *gorm.DB) error { for _, cat := range DefaultCategories { result := db.Where("code = ?", cat.Code).FirstOrCreate(&cat) if result.Error != nil { return result.Error } } return nil }