EasyAudioEncode/domain/version/core.go
2025-12-25 17:01:46 +08:00

73 lines
1.4 KiB
Go

package version
import (
"fmt"
"strings"
)
// Storer ...
type Storer interface {
First(*Version) error
Add(*Version) error
}
// Core 控制程序启动时是否执行表迁移
// 每次都执行启动太慢了
type Core struct {
store Storer
IsMigrate *bool
}
// NewCore ...
func NewCore(store Storer) Core {
var isMigrate bool
return Core{
store: store,
IsMigrate: &isMigrate,
}
}
// IsAutoMigrate 是否需要进行表迁移?
func (c Core) IsAutoMigrate(currentVer string) bool {
var ver Version
if err := c.store.First(&ver); err != nil {
isMigrate := true
*c.IsMigrate = isMigrate
return isMigrate
}
isMigrate := compareVersionFunc(currentVer, ver.Version, func(a, b string) bool {
return a > b
})
*c.IsMigrate = isMigrate
return isMigrate
}
// RecordVersion 记录当前版本号
func (c Core) RecordVersion(currentVer, remark string) error {
var ver Version
ver.Version = currentVer
ver.Remark = remark
return c.store.Add(&ver)
}
func compareVersionFunc(a, b string, f func(a, b string) bool) bool {
s1 := versionToStr(a)
s2 := versionToStr(b)
if len(s1) != len(s2) {
return true
}
return f(s1, s2)
}
func versionToStr(str string) string {
var result strings.Builder
arr := strings.Split(strings.TrimPrefix(str, "v"), ".")
for _, item := range arr {
if idx := strings.Index(item, "-"); idx != -1 {
item = item[0:idx]
}
result.WriteString(fmt.Sprintf("%03s", item))
}
return result.String()
}