From 6858ae8d4c9767246b0780dcbcb67f69f4d31354 Mon Sep 17 00:00:00 2001 From: Jason Kulatunga Date: Tue, 17 Oct 2023 11:46:08 -0700 Subject: [PATCH] added database migration framework. --- backend/pkg/database/gorm_common.go | 14 ------ .../database/gorm_repository_migrations.go | 48 +++++++++++++++++++ backend/pkg/database/postgres_repository.go | 7 --- backend/pkg/database/sqlite_repository.go | 8 ---- go.mod | 3 +- go.sum | 6 ++- 6 files changed, 54 insertions(+), 32 deletions(-) create mode 100644 backend/pkg/database/gorm_repository_migrations.go diff --git a/backend/pkg/database/gorm_common.go b/backend/pkg/database/gorm_common.go index 65d0acf2..4b006b66 100644 --- a/backend/pkg/database/gorm_common.go +++ b/backend/pkg/database/gorm_common.go @@ -32,20 +32,6 @@ type GormRepository struct { EventBus event_bus.Interface } -func (gr *GormRepository) Migrate() error { - err := gr.GormClient.AutoMigrate( - &models.User{}, - &models.SourceCredential{}, - &models.BackgroundJob{}, - &models.Glossary{}, - &models.UserSettingEntry{}, - ) - if err != nil { - return fmt.Errorf("Failed to automigrate! - %v", err) - } - return nil -} - func (gr *GormRepository) Close() error { return nil } diff --git a/backend/pkg/database/gorm_repository_migrations.go b/backend/pkg/database/gorm_repository_migrations.go new file mode 100644 index 00000000..8f9700ec --- /dev/null +++ b/backend/pkg/database/gorm_repository_migrations.go @@ -0,0 +1,48 @@ +package database + +import ( + "github.com/fastenhealth/fasten-onprem/backend/pkg/models" + databaseModel "github.com/fastenhealth/fasten-onprem/backend/pkg/models/database" + "github.com/go-gormigrate/gormigrate/v2" + "gorm.io/gorm" +) + +func (gr *GormRepository) Migrate() error { + + gr.Logger.Infoln("Database migration starting. Please wait, this process may take a long time....") + + gormMigrateOptions := gormigrate.DefaultOptions + gormMigrateOptions.UseTransaction = true + + //use echo $(date '+%Y%m%d%H%M%S') to generate new ID's + m := gormigrate.New(gr.GormClient, gormMigrateOptions, []*gormigrate.Migration{ + { + ID: "20231017112246", // base database models //TODO: figure out how to version these correctly (SourceCredential is complicated) + Migrate: func(tx *gorm.DB) error { + + return tx.AutoMigrate( + &models.BackgroundJob{}, + &models.Glossary{}, + &models.SourceCredential{}, + &models.UserSettingEntry{}, + &models.User{}, + ) + }, + }, + { + ID: "20231017113858", // FHIR Resource Database models. + Migrate: func(tx *gorm.DB) error { + + //automigrate Fhir Resource Tables + return databaseModel.Migrate(tx) + }, + }, + }) + + if err := m.Migrate(); err != nil { + gr.Logger.Errorf("Database migration failed with error. \n Please open a github issue at https://github.com/fastenhealth/fasten-onprem and attach a copy of your fasten.db file. \n %v", err) + return err + } + gr.Logger.Infoln("Database migration completed successfully") + return nil +} diff --git a/backend/pkg/database/postgres_repository.go b/backend/pkg/database/postgres_repository.go index e440850e..09ac5580 100644 --- a/backend/pkg/database/postgres_repository.go +++ b/backend/pkg/database/postgres_repository.go @@ -7,7 +7,6 @@ import ( "github.com/fastenhealth/fasten-onprem/backend/pkg/config" "github.com/fastenhealth/fasten-onprem/backend/pkg/event_bus" "github.com/fastenhealth/fasten-onprem/backend/pkg/models" - databaseModel "github.com/fastenhealth/fasten-onprem/backend/pkg/models/database" "github.com/sirupsen/logrus" "gorm.io/driver/postgres" "gorm.io/gorm" @@ -50,12 +49,6 @@ func newPostgresRepository(appConfig config.Interface, globalLogger logrus.Field return nil, err } - //automigrate Fhir Resource Tables - err = databaseModel.Migrate(fastenRepo.GormClient) - if err != nil { - return nil, err - } - // create/update admin user //TODO: determine if this admin user is ncessary //SECURITY: validate this user is necessary diff --git a/backend/pkg/database/sqlite_repository.go b/backend/pkg/database/sqlite_repository.go index 45949bc7..b71be1f7 100644 --- a/backend/pkg/database/sqlite_repository.go +++ b/backend/pkg/database/sqlite_repository.go @@ -7,7 +7,6 @@ import ( "github.com/fastenhealth/fasten-onprem/backend/pkg/config" "github.com/fastenhealth/fasten-onprem/backend/pkg/event_bus" "github.com/fastenhealth/fasten-onprem/backend/pkg/models" - databaseModel "github.com/fastenhealth/fasten-onprem/backend/pkg/models/database" "github.com/glebarez/sqlite" "github.com/sirupsen/logrus" "gorm.io/gorm" @@ -75,18 +74,11 @@ func newSqliteRepository(appConfig config.Interface, globalLogger logrus.FieldLo EventBus: eventBus, } - //TODO: automigrate for now, this should be replaced with a migration tool once the DB has stabilized. err = fastenRepo.Migrate() if err != nil { return nil, err } - //automigrate Fhir Resource Tables - err = databaseModel.Migrate(fastenRepo.GormClient) - if err != nil { - return nil, err - } - // create/update admin user //TODO: determine if this admin user is ncessary //SECURITY: validate this user is necessary diff --git a/go.mod b/go.mod index 240ad0c9..d94c1b8e 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/fastenhealth/gofhir-models v0.0.6 github.com/gin-gonic/gin v1.9.0 github.com/glebarez/sqlite v1.5.0 + github.com/go-gormigrate/gormigrate/v2 v2.1.1 github.com/golang-jwt/jwt/v4 v4.4.2 github.com/golang/mock v1.6.0 github.com/google/go-github/v54 v54.0.0 @@ -27,7 +28,7 @@ require ( golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 golang.org/x/net v0.14.0 gorm.io/datatypes v1.0.7 - gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55 + gorm.io/gorm v1.25.4 ) require ( diff --git a/go.sum b/go.sum index 3ab31ff9..e99263a5 100644 --- a/go.sum +++ b/go.sum @@ -224,6 +224,8 @@ github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gormigrate/gormigrate/v2 v2.1.1 h1:eGS0WTFRV30r103lU8JNXY27KbviRnqqIDobW3EV3iY= +github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kRCk+E3UbV2f5gv+1ndLc= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -1289,8 +1291,8 @@ gorm.io/driver/sqlserver v1.3.1/go.mod h1:w25Vrx2BG+CJNUu/xKbFhaKlGxT/nzRkhWCCop gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55 h1:sC1Xj4TYrLqg1n3AN10w871An7wJM0gzgcm8jkIkECQ= -gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw= +gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=