package database import ( "fmt" "os" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/clause" ) var DB *gorm.DB func Connect() error { var err error var db *gorm.DB dbUser := os.Getenv("DB_USER") dbPassword := os.Getenv("DB_PASSWORD") dbHost := os.Getenv("DB_HOST") dbPort := os.Getenv("DB_PORT") dbName := os.Getenv("DB_NAME") dsn := fmt.Sprintf( "%s:%s@tcp(%s:%s)/%s?parseTime=true", dbUser, dbPassword, dbHost, dbPort, dbName, ) db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { return fmt.Errorf("failed to connect to database: %w", err) } DB = db return nil } var allModels []any func RegisterModel(model any) { allModels = append(allModels, model) } type JoinTable struct { model any field string joinTable any } var allJoinTables []JoinTable func RegisterJoinTable(model any, field string, joinTable any) { newJoin := JoinTable{ model: model, field: field, joinTable: joinTable, } allJoinTables = append(allJoinTables, newJoin) } func Migrate() error { // Run migrations if err := DB.AutoMigrate(allModels...); err != nil { return fmt.Errorf("auto migration failed: %w", err) } for _, table := range allJoinTables { if err := DB.SetupJoinTable(table.model, table.field, table.joinTable); err != nil { return fmt.Errorf("creating custom join tables failed: %w", err) } } return nil } func Preload() *gorm.DB { return DB.Preload(clause.Associations) }