From bdc96f6d8e4c595248d8a760f7af0b48b83a3597 Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 4 Jun 2026 10:28:12 +0800 Subject: [PATCH] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../goose_202606030004_add_pages_api_proxy.go | 35 ---------- ...606040001_add_pages_deployment_root_dir.go | 26 -------- ...202606040002_add_pages_project_root_dir.go | 43 ------------- ...003_drop_pages_deployment_unused_fields.go | 36 ----------- ...06040004_add_pages_features_and_cleanup.go | 64 +++++++++++++++++++ openflare_server/model/goose/migrations.go | 5 +- openflare_server/model/main_test.go | 2 +- 7 files changed, 66 insertions(+), 145 deletions(-) delete mode 100644 openflare_server/model/goose/goose_202606030004_add_pages_api_proxy.go delete mode 100644 openflare_server/model/goose/goose_202606040001_add_pages_deployment_root_dir.go delete mode 100644 openflare_server/model/goose/goose_202606040002_add_pages_project_root_dir.go delete mode 100644 openflare_server/model/goose/goose_202606040003_drop_pages_deployment_unused_fields.go create mode 100644 openflare_server/model/goose/goose_202606040004_add_pages_features_and_cleanup.go diff --git a/openflare_server/model/goose/goose_202606030004_add_pages_api_proxy.go b/openflare_server/model/goose/goose_202606030004_add_pages_api_proxy.go deleted file mode 100644 index fc0eb9ee..00000000 --- a/openflare_server/model/goose/goose_202606030004_add_pages_api_proxy.go +++ /dev/null @@ -1,35 +0,0 @@ -package goose - -import ( - "fmt" - - presslygoose "github.com/pressly/goose/v3" - "gorm.io/gorm" -) - -const versionPagesAPIProxy int64 = 202606030004 - -// migration202606030004 adds API proxying fields (enabled, path, pass, rewrite) -// to Pages projects. -func migration202606030004(backend string, ctx Context) *presslygoose.Migration { - return newGORMMigration( - versionPagesAPIProxy, - "202606030004_add_pages_api_proxy.go", - backend, - ctx, - migratePagesAPIProxy, - ) -} - -func migratePagesAPIProxy(ctx Context, db *gorm.DB, backend string) error { - if err := ctx.ApplyCurrentSchema(db, backend); err != nil { - return err - } - // Verify that the columns exist - for _, col := range []string{"api_proxy_enabled", "api_proxy_path", "api_proxy_pass", "api_proxy_rewrite"} { - if !db.Migrator().HasColumn("pages_projects", col) { - return fmt.Errorf("column pages_projects.%s is missing", col) - } - } - return nil -} diff --git a/openflare_server/model/goose/goose_202606040001_add_pages_deployment_root_dir.go b/openflare_server/model/goose/goose_202606040001_add_pages_deployment_root_dir.go deleted file mode 100644 index 18c6c6d2..00000000 --- a/openflare_server/model/goose/goose_202606040001_add_pages_deployment_root_dir.go +++ /dev/null @@ -1,26 +0,0 @@ -package goose - -import ( - presslygoose "github.com/pressly/goose/v3" - "gorm.io/gorm" -) - -const versionPagesDeploymentRootDir int64 = 202606040001 - -// migration202606040001 adds RootDir field to Pages deployments. -func migration202606040001(backend string, ctx Context) *presslygoose.Migration { - return newGORMMigration( - versionPagesDeploymentRootDir, - "202606040001_add_pages_deployment_root_dir.go", - backend, - ctx, - migratePagesDeploymentRootDir, - ) -} - -func migratePagesDeploymentRootDir(ctx Context, db *gorm.DB, backend string) error { - if err := ctx.ApplyCurrentSchema(db, backend); err != nil { - return err - } - return nil -} diff --git a/openflare_server/model/goose/goose_202606040002_add_pages_project_root_dir.go b/openflare_server/model/goose/goose_202606040002_add_pages_project_root_dir.go deleted file mode 100644 index dd63df3b..00000000 --- a/openflare_server/model/goose/goose_202606040002_add_pages_project_root_dir.go +++ /dev/null @@ -1,43 +0,0 @@ -package goose - -import ( - "fmt" - - presslygoose "github.com/pressly/goose/v3" - "gorm.io/gorm" -) - -const versionPagesProjectRootDir int64 = 202606040002 - -// migration202606040002 adds RootDir and EntryFile fields to Pages projects. -func migration202606040002(backend string, ctx Context) *presslygoose.Migration { - return newGORMMigration( - versionPagesProjectRootDir, - "202606040002_add_pages_project_root_dir.go", - backend, - ctx, - migratePagesProjectRootDir, - ) -} - -func migratePagesProjectRootDir(ctx Context, db *gorm.DB, backend string) error { - if err := ctx.ApplyCurrentSchema(db, backend); err != nil { - return err - } - // Verify that the columns exist - if !db.Migrator().HasColumn("pages_projects", "root_dir") { - return fmt.Errorf("column pages_projects.root_dir is missing") - } - if !db.Migrator().HasColumn("pages_projects", "entry_file") { - return fmt.Errorf("column pages_projects.entry_file is missing") - } - // Backfill existing rows: if entry_file is empty, set to 'index.html' - type PagesProject struct { - ID uint `gorm:"primaryKey"` - EntryFile string `gorm:"size:512;not null;default:'index.html'"` - } - if err := db.Model(&PagesProject{}).Where("entry_file = '' OR entry_file IS NULL").Update("entry_file", "index.html").Error; err != nil { - return fmt.Errorf("failed to backfill pages_projects.entry_file: %w", err) - } - return nil -} diff --git a/openflare_server/model/goose/goose_202606040003_drop_pages_deployment_unused_fields.go b/openflare_server/model/goose/goose_202606040003_drop_pages_deployment_unused_fields.go deleted file mode 100644 index a86e4963..00000000 --- a/openflare_server/model/goose/goose_202606040003_drop_pages_deployment_unused_fields.go +++ /dev/null @@ -1,36 +0,0 @@ -package goose - -import ( - "fmt" - - presslygoose "github.com/pressly/goose/v3" - "gorm.io/gorm" -) - -const versionPagesDeploymentDropUnusedFields int64 = 202606040003 - -// migration202606040003 drops RootDir and EntryFile fields from Pages deployments. -func migration202606040003(backend string, ctx Context) *presslygoose.Migration { - return newGORMMigration( - versionPagesDeploymentDropUnusedFields, - "202606040003_drop_pages_deployment_unused_fields.go", - backend, - ctx, - migratePagesDeploymentDropUnusedFields, - ) -} - -func migratePagesDeploymentDropUnusedFields(ctx Context, db *gorm.DB, backend string) error { - // Drop columns root_dir and entry_file from pages_deployments - if db.Migrator().HasColumn("pages_deployments", "root_dir") { - if err := db.Exec("ALTER TABLE pages_deployments DROP COLUMN root_dir").Error; err != nil { - return fmt.Errorf("failed to drop pages_deployments.root_dir: %w", err) - } - } - if db.Migrator().HasColumn("pages_deployments", "entry_file") { - if err := db.Exec("ALTER TABLE pages_deployments DROP COLUMN entry_file").Error; err != nil { - return fmt.Errorf("failed to drop pages_deployments.entry_file: %w", err) - } - } - return nil -} diff --git a/openflare_server/model/goose/goose_202606040004_add_pages_features_and_cleanup.go b/openflare_server/model/goose/goose_202606040004_add_pages_features_and_cleanup.go new file mode 100644 index 00000000..1711ce07 --- /dev/null +++ b/openflare_server/model/goose/goose_202606040004_add_pages_features_and_cleanup.go @@ -0,0 +1,64 @@ +package goose + +import ( + "fmt" + + presslygoose "github.com/pressly/goose/v3" + "gorm.io/gorm" +) + +const versionPagesFeaturesAndCleanup int64 = 202606040004 + +// migration202606040004 merges migrations 202606030004, 202606040001, 202606040002, and 202606040003. +// It adds Pages API proxying fields and RootDir/EntryFile to Pages projects, +// backfills default entry_file to 'index.html', and ensures unused fields (root_dir, entry_file) +// are dropped from Pages deployments. +func migration202606040004(backend string, ctx Context) *presslygoose.Migration { + return newGORMMigration( + versionPagesFeaturesAndCleanup, + "202606040004_add_pages_features_and_cleanup.go", + backend, + ctx, + migratePagesFeaturesAndCleanup, + ) +} + +func migratePagesFeaturesAndCleanup(ctx Context, db *gorm.DB, backend string) error { + if err := ctx.ApplyCurrentSchema(db, backend); err != nil { + return err + } + + // 1. Verify Pages projects columns + cols := []string{ + "api_proxy_enabled", "api_proxy_path", "api_proxy_pass", "api_proxy_rewrite", + "root_dir", "entry_file", + } + for _, col := range cols { + if !db.Migrator().HasColumn("pages_projects", col) { + return fmt.Errorf("column pages_projects.%s is missing", col) + } + } + + // 2. Backfill pages_projects.entry_file to 'index.html' if empty + type PagesProject struct { + ID uint `gorm:"primaryKey"` + EntryFile string `gorm:"size:512;not null;default:'index.html'"` + } + if err := db.Model(&PagesProject{}).Where("entry_file = '' OR entry_file IS NULL").Update("entry_file", "index.html").Error; err != nil { + return fmt.Errorf("failed to backfill pages_projects.entry_file: %w", err) + } + + // 3. Drop unused fields root_dir and entry_file from pages_deployments if they exist + if db.Migrator().HasColumn("pages_deployments", "root_dir") { + if err := db.Exec("ALTER TABLE pages_deployments DROP COLUMN root_dir").Error; err != nil { + return fmt.Errorf("failed to drop pages_deployments.root_dir: %w", err) + } + } + if db.Migrator().HasColumn("pages_deployments", "entry_file") { + if err := db.Exec("ALTER TABLE pages_deployments DROP COLUMN entry_file").Error; err != nil { + return fmt.Errorf("failed to drop pages_deployments.entry_file: %w", err) + } + } + + return nil +} diff --git a/openflare_server/model/goose/migrations.go b/openflare_server/model/goose/migrations.go index 1ae3c1a2..35d5410e 100644 --- a/openflare_server/model/goose/migrations.go +++ b/openflare_server/model/goose/migrations.go @@ -44,10 +44,7 @@ func registeredMigrations(backend string, ctx Context) []*presslygoose.Migration migration202606030001(backend, ctx), migration202606030002(backend, ctx), migration202606030003(backend, ctx), - migration202606030004(backend, ctx), - migration202606040001(backend, ctx), - migration202606040002(backend, ctx), - migration202606040003(backend, ctx), + migration202606040004(backend, ctx), } } diff --git a/openflare_server/model/main_test.go b/openflare_server/model/main_test.go index 584b4f10..9cc49793 100644 --- a/openflare_server/model/main_test.go +++ b/openflare_server/model/main_test.go @@ -866,7 +866,7 @@ func TestEnsureDatabaseSchemaUpToDateDropsPagesDeploymentUnusedFields(t *testing } // Remove the migration record from goose_db_version table - const versionToRerun = 202606040003 + const versionToRerun = 202606040004 if err := db.Exec("DELETE FROM goose_db_version WHERE version_id = ?", versionToRerun).Error; err != nil { t.Fatalf("failed to delete migration record: %v", err) }