128 lines
3.3 KiB
Go
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
|
|
}
|