migrate.go raw

   1  package migrations
   2  
   3  import (
   4  	"fmt"
   5  	"strings"
   6  	"text/template"
   7  
   8  	"github.com/go-gormigrate/gormigrate/v2"
   9  	"gorm.io/gorm"
  10  )
  11  
  12  func Migrate(gormDB *gorm.DB) error {
  13  
  14  	m := gormigrate.New(gormDB, gormigrate.DefaultOptions, []*gormigrate.Migration{
  15  		_202401191539_initial_migration,
  16  		_202403171120_delete_ldk_payments,
  17  		_202404021909_nullable_expires_at,
  18  		_202405302121_store_decrypted_request,
  19  		_202406061259_delete_content,
  20  		_202406071726_vacuum,
  21  		_202406301207_rename_request_methods,
  22  		_202407012100_transactions,
  23  		_202407151352_autoincrement,
  24  		_202407201604_transactions_indexes,
  25  		_202407262257_remove_invalid_scopes,
  26  		_202408061737_add_boostagrams_and_use_json,
  27  		_202408191242_transaction_failure_reason,
  28  		_202408291715_app_metadata,
  29  		_202410141503_add_wallet_pubkey,
  30  		_202412212345_fix_types,
  31  		_202504231037_add_indexes,
  32  		_202505091314_hold_invoices,
  33  		_202506170342_swaps,
  34  		_202508041712_delete_non_cascade_deleted_records,
  35  		_202508041737_postgres_amount_bigint,
  36  		_202508041738_app_last_used,
  37  		_202508041739_response_events_index,
  38  		_202508151405_swap_xpub,
  39  		_202508192137_forwards,
  40  		_202509031250_transactions_updated_at_index,
  41  		_202604081200_app_last_settled_transaction,
  42  	})
  43  
  44  	return m.Migrate()
  45  }
  46  
  47  type sqlDialectDef struct {
  48  	Timestamp               string
  49  	AutoincrementPrimaryKey string
  50  	DropTableCascade        string
  51  }
  52  
  53  var sqlDialectSqlite = sqlDialectDef{
  54  	Timestamp:               "datetime",
  55  	AutoincrementPrimaryKey: "INTEGER PRIMARY KEY AUTOINCREMENT",
  56  	DropTableCascade:        "",
  57  }
  58  
  59  var sqlDialectPostgres = sqlDialectDef{
  60  	Timestamp:               "timestamptz",
  61  	AutoincrementPrimaryKey: "SERIAL PRIMARY KEY",
  62  	DropTableCascade:        "CASCADE",
  63  }
  64  
  65  func getDialect(tx *gorm.DB) *sqlDialectDef {
  66  	switch tx.Dialector.Name() {
  67  	case "postgres":
  68  		return &sqlDialectPostgres
  69  	default:
  70  		return &sqlDialectSqlite
  71  	}
  72  }
  73  
  74  func exec(tx *gorm.DB, templ *template.Template) error {
  75  	dialect := getDialect(tx)
  76  	var buf strings.Builder
  77  	err := templ.Execute(&buf, dialect)
  78  	if err != nil {
  79  		panic(fmt.Sprintf("failed to render SQL template: %v", err))
  80  	}
  81  
  82  	return tx.Exec(buf.String()).Error
  83  }
  84