package db import ( "log" "time" "spin/internal/models" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" ) // Connect opens a GORM connection, retrying a few times to tolerate // docker-compose startup ordering, then runs AutoMigrate over models.All(). func Connect(dsn string) (*gorm.DB, error) { var gdb *gorm.DB var err error for i := 0; i < 15; i++ { gdb, err = gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Warn), // Skip relationship handling during migration to avoid GORM v1.25 // ReorderModels panics; runtime associations (Preload/Append) are // unaffected. spin uses explicit join models (e.g. ProjectMember) // rather than many2many, so no manual join table is required. IgnoreRelationshipsWhenMigrating: true, }) if err == nil { var sqlDB, e = gdb.DB() if e == nil { if e = sqlDB.Ping(); e == nil { break } err = e } else { err = e } } log.Printf("db: waiting for database (attempt %d): %v", i+1, err) time.Sleep(2 * time.Second) } if err != nil { return nil, err } if err := gdb.AutoMigrate(models.All()...); err != nil { return nil, err } return gdb, nil }