From 2e88eaf793fa47f089da5d8c297e0b03cd54b329 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 13 Aug 2025 14:23:51 +0700 Subject: [PATCH] pre-dev: add migration --- cmd/migration/config.yml-example | 47 ++++++++++++ cmd/migration/migration.go | 9 +++ go.mod | 7 +- go.sum | 2 + internal/interface/migration/migration.go | 93 +++++++++++++++++++++++ 5 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 cmd/migration/config.yml-example create mode 100644 cmd/migration/migration.go create mode 100644 internal/interface/migration/migration.go diff --git a/cmd/migration/config.yml-example b/cmd/migration/config.yml-example new file mode 100644 index 00000000..19893fd7 --- /dev/null +++ b/cmd/migration/config.yml-example @@ -0,0 +1,47 @@ +appCfg: + fullName: BPJS Bridge + codeName: simrs-vx + version: 0.1.0 + env: development + lang: en + +httpCfg: + host: + port: + +dbCfg: + dsn: + maxOpenConns: 5 + maxIdleConns: 5 + maxIdleTime: 100 + +loggerCfg: + hideTime: + hideLevel: + +msCfg: + dsn: + +langCfg: + active: + path: + fileName: + +minioCfg: + endpoint: + region: + accessKey: + secretKey: + useSsl: + bucketName: + - patient + +corsCfg: + allowedOrigin: + allowedMethod: + +satuSehatCfg: + host: localhsot:8200 + +bpjsCfg: + host: localhsot:8200 diff --git a/cmd/migration/migration.go b/cmd/migration/migration.go new file mode 100644 index 00000000..c225edf1 --- /dev/null +++ b/cmd/migration/migration.go @@ -0,0 +1,9 @@ +package main + +import ( + m "simrs-vx/internal/interface/migration" +) + +func main() { + m.Migrate() +} diff --git a/go.mod b/go.mod index ba9efe29..3d7e86f5 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,11 @@ toolchain go1.23.11 require ( github.com/karincake/apem v0.0.16-g github.com/karincake/dodol v0.0.1 + github.com/karincake/getuk v0.1.0 github.com/karincake/lepet v0.0.1 + golang.org/x/crypto v0.40.0 + gopkg.in/yaml.v3 v3.0.1 + gorm.io/driver/postgres v1.5.7 gorm.io/gorm v1.25.10 ) @@ -24,11 +28,8 @@ require ( github.com/mattn/go-isatty v0.0.19 // indirect github.com/nxadm/tail v1.4.11 // indirect github.com/rs/zerolog v1.33.0 // indirect - golang.org/x/crypto v0.40.0 // indirect golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect golang.org/x/net v0.42.0 // indirect golang.org/x/sys v0.34.0 // indirect golang.org/x/text v0.27.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - gorm.io/driver/postgres v1.5.7 // indirect ) diff --git a/go.sum b/go.sum index cd5f268c..1550a098 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,8 @@ github.com/karincake/apem v0.0.16-g h1:jPIr/YiaJhVSftdA1PyB2tlDiQtFeTVZohO1qf0qp github.com/karincake/apem v0.0.16-g/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM= github.com/karincake/dodol v0.0.1 h1:jUXmJh1r0Ei4fmHPZ6IUkoplW/V9d27L63JEl6zudL0= github.com/karincake/dodol v0.0.1/go.mod h1:2f1NcvkvY0J3GMUkwILNDYVvRUpz0W3lpPp/Ha/Ld24= +github.com/karincake/getuk v0.1.0 h1:jcIsASrr0UDE528GN7Ua6n9UFyRgUypsWh8Or8wzCO0= +github.com/karincake/getuk v0.1.0/go.mod h1:NVnvxSGAkQ/xuq99FzWACvY5efyKPLFla1cKB8czm7c= github.com/karincake/lepet v0.0.1 h1:eq/cwn5BBg0jWZ1c/MmvhFIBma0zBpVs2LwkfDOncy4= github.com/karincake/lepet v0.0.1/go.mod h1:U84w7olXO3BPJw2Hu6MBonFmJmPKaFjtyAj1HTu3z1A= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= diff --git a/internal/interface/migration/migration.go b/internal/interface/migration/migration.go new file mode 100644 index 00000000..13abe812 --- /dev/null +++ b/internal/interface/migration/migration.go @@ -0,0 +1,93 @@ +package migration + +import ( + "flag" + "fmt" + "log" + "os" + "reflect" + + "gopkg.in/yaml.v3" + "gorm.io/driver/postgres" + "gorm.io/gorm" + "gorm.io/gorm/schema" +) + +type DbConf struct { + Dsn string + Dialect string +} + +// Migrate all tables at once, one time only for exam purpose +func Migrate() { + // use default config file location or use flat + cfgFile := "./config.yml" + flag.StringVar(&cfgFile, "config-file", "./config.yml", "Configuration path (default=./config.yaml)") + flag.Parse() + + // read the config file + yamlFile, err := os.ReadFile(cfgFile) + if err != nil { + log.Fatalf("%v", err) + } + + // parse into config struct + var dbConf DbConf + err = yaml.Unmarshal(yamlFile, &dbConf) + if err != nil { + log.Fatal(err) + } + log.Print("config is loaded successfully") + + // create database connection + db, err := gorm.Open(postgres.Open(dbConf.Dsn), &gorm.Config{ + NamingStrategy: schema.NamingStrategy{ + SingularTable: true, + NoLowerCase: true, + }, + }) + if err != nil { + log.Fatal(err) + } + log.Print("database-connection is established successfully") + + // migrate all the tables + modelList := []any{ + // &single.Single{}}, // example + + } + + argsWithProg := os.Args + if len(argsWithProg) > 1 { + if argsWithProg[1] == "gradually" { + for _, v := range modelList { + name := "" + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + name = "*" + t.Elem().Name() + } else { + name = t.Name() + } + fmt.Println("Migrating ", name) + db.AutoMigrate(v) + } + } else { + for _, v := range modelList { + name := "" + if t := reflect.TypeOf(v); t.Kind() == reflect.Ptr { + name = "*" + t.Elem().Name() + } else { + name = t.Name() + } + if name == argsWithProg[1] { + fmt.Println("Migrating ", name) + db.AutoMigrate(v) + } + } + } + } else { + fmt.Println("Migrating all tables") + db.AutoMigrate(modelList...) + } + + log.Printf("migration is complete") +}