init: 初始化项目
This commit is contained in:
84
internal/updater/service.go
Normal file
84
internal/updater/service.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package updater
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"nebula/internal/asset"
|
||||
"nebula/internal/release"
|
||||
"nebula/pkg/util"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type CheckRequest struct {
|
||||
App string
|
||||
Version string
|
||||
Platform string
|
||||
Arch string
|
||||
}
|
||||
|
||||
type CheckResponse struct {
|
||||
Update bool `json:"update"`
|
||||
Version string `json:"version,omitempty"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
URL string `json:"url,omitempty"`
|
||||
Checksum string `json:"checksum,omitempty"`
|
||||
}
|
||||
|
||||
func CheckUpdate(db *gorm.DB, req CheckRequest) (*CheckResponse, error) {
|
||||
// 参数验证
|
||||
if req.App == "" {
|
||||
return nil, errors.New("app is required")
|
||||
}
|
||||
if req.Version == "" {
|
||||
return nil, errors.New("version is required")
|
||||
}
|
||||
if req.Platform == "" {
|
||||
return nil, errors.New("platform is required")
|
||||
}
|
||||
if req.Arch == "" {
|
||||
return nil, errors.New("arch is required")
|
||||
}
|
||||
|
||||
// 查找最新版本(按发布日期排序)
|
||||
var latest release.Release
|
||||
err := db.Where("app_id = ?", req.App).
|
||||
Order("pub_date DESC").
|
||||
First(&latest).Error
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, errors.New("no release found for this app")
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 比较版本号
|
||||
if !util.IsNewerVersion(req.Version, latest.Version) {
|
||||
return &CheckResponse{Update: false}, nil
|
||||
}
|
||||
|
||||
// 查找对应平台和架构的资源
|
||||
var ast asset.Asset
|
||||
err = db.Where("release_id = ? AND platform = ? AND arch = ?",
|
||||
latest.ID, req.Platform, req.Arch).First(&ast).Error
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, errors.New("no asset found for this platform and architecture")
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 验证资源 URL 是否存在
|
||||
if ast.URL == "" {
|
||||
return nil, errors.New("asset URL is empty")
|
||||
}
|
||||
|
||||
return &CheckResponse{
|
||||
Update: true,
|
||||
Version: latest.Version,
|
||||
Notes: latest.Notes,
|
||||
URL: ast.URL,
|
||||
Checksum: ast.Checksum,
|
||||
}, nil
|
||||
}
|
||||
Reference in New Issue
Block a user