package initialize import ( "fmt" "github.com/perfect-panel/ppanel-server/pkg/logger" "gorm.io/gorm" "github.com/perfect-panel/ppanel-server/initialize/migrate/patch" "github.com/perfect-panel/ppanel-server/internal/model/system" "github.com/perfect-panel/ppanel-server/internal/svc" "github.com/perfect-panel/ppanel-server/pkg/constant" "github.com/perfect-panel/ppanel-server/pkg/tool" ) func VerifyVersion(ctx *svc.ServiceContext) { var configVersion system.System err := ctx.DB.Transaction(func(db *gorm.DB) error { db.Model(&system.System{}).Where("`category` = 'system' AND `key` = 'Version'").First(&configVersion) if configVersion.Value != constant.Version { // Version eg: 1.0.0(10000) current := tool.ExtractVersionNumber(constant.Version) sqlVersion := tool.ExtractVersionNumber(configVersion.Value) logger.Infof("Verify System Version, current version: %d, datebase version: %d", current, sqlVersion) if current > sqlVersion { // Migrate to Milestone Version // // Migrate SQL to 0.1.7(01703) if sqlVersion < 1705 { if err := migrate01701(db, sqlVersion); err != nil { return err } } // 重新执行2000版本的迁移 if sqlVersion == 2002 { sqlVersion = 2000 } // Migrate SQL to 0.2.0(02000) if sqlVersion < 2009 { if err := migrate02000(db, sqlVersion); err != nil { return err } } // Migrate SQL to 0.3.0(03000) if sqlVersion < 3001 { if err := migrate03000(db, sqlVersion); err != nil { return err } } } } return nil }) if err != nil { panic("update system version error:" + err.Error()) } } func migrate01701(db *gorm.DB, sqlVersion int) error { migrations := map[int]func(*gorm.DB) error{ 1200: patch.Migrate01200, 1201: patch.Migrate01201, 1202: patch.Migrate01202, 1203: patch.Migrate01203, 1204: patch.Migrate01204, 1205: patch.Migrate01205, 1301: patch.Migrate01301, 1602: patch.Migrate01602, 1701: patch.Migrate01701, 1702: patch.Migrate01702, 1703: patch.Migrate01703, 1704: patch.Migrate01704, 1705: patch.Migrate01705, } for v, migrate := range migrations { if sqlVersion < v { if err := migrate(db); err != nil { return fmt.Errorf("migrator %d version error: %w", v, err) } logger.Infof(fmt.Sprintf("Migrate %d version success", v)) } } return nil } func migrate02000(db *gorm.DB, sqlVersion int) error { migrations := map[int]func(*gorm.DB) error{ 2000: patch.Migrate02000, 2001: patch.Migrate02001, 2002: patch.Migrate02002, 2003: patch.Migrate02003, 2007: patch.Migrate02007, 2008: patch.Migrate02008, 2009: patch.Migrate02009, 2010: patch.Migrate02010, 2011: patch.Migrate02011, 3001: patch.Migrate03001, } for v, migrate := range migrations { if sqlVersion < v { if err := migrate(db); err != nil { return fmt.Errorf("migrator %d version error: %w", v, err) } logger.Infof(fmt.Sprintf("Migrate %d version success", v)) } } return nil } func migrate03000(db *gorm.DB, sqlVersion int) error { migrations := map[int]func(*gorm.DB) error{ 3001: patch.Migrate03001, } for v, migrate := range migrations { if sqlVersion < v { if err := migrate(db); err != nil { return fmt.Errorf("migrator %d version error: %w", v, err) } logger.Infof(fmt.Sprintf("Migrate %d version success", v)) } } return nil }