hi-server/initialize/version.go
2025-10-10 07:13:36 -07:00

128 lines
3.3 KiB
Go

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 < 3002 {
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,
}
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,
3002: patch.Migrate03002,
}
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
}