90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
package services
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/google/go-github/v63/github"
|
|
"github.com/wailsapp/wails/v3/pkg/services/log"
|
|
)
|
|
|
|
// UpdateCheckResult 更新检查结果
|
|
type UpdateCheckResult struct {
|
|
HasUpdate bool `json:"hasUpdate"` // 是否有更新
|
|
CurrentVer string `json:"currentVer"` // 当前版本
|
|
LatestVer string `json:"latestVer"` // 最新版本
|
|
ReleaseNotes string `json:"releaseNotes"` // 发布说明
|
|
ReleaseURL string `json:"releaseURL"` // 发布页面URL
|
|
Error string `json:"error"` // 错误信息
|
|
}
|
|
|
|
// UpdateService 更新服务
|
|
type UpdateService struct {
|
|
logger *log.LoggerService
|
|
configService *ConfigService
|
|
githubClient *github.Client
|
|
currentVersion string
|
|
}
|
|
|
|
// NewUpdateService 创建更新服务实例
|
|
func NewUpdateService(configService *ConfigService, logger *log.LoggerService) *UpdateService {
|
|
config, err := configService.GetConfig()
|
|
if err != nil {
|
|
logger.Error("Failed to get config", "error", err)
|
|
return nil
|
|
}
|
|
|
|
currentVersion := config.Updates.Version
|
|
if currentVersion == "" {
|
|
currentVersion = "1.0.0"
|
|
}
|
|
|
|
httpClient := &http.Client{Timeout: 30 * time.Second}
|
|
githubClient := github.NewClient(httpClient)
|
|
|
|
return &UpdateService{
|
|
logger: logger,
|
|
configService: configService,
|
|
githubClient: githubClient,
|
|
currentVersion: currentVersion,
|
|
}
|
|
}
|
|
|
|
// CheckForUpdates 检查更新
|
|
func (us *UpdateService) CheckForUpdates() UpdateCheckResult {
|
|
result := UpdateCheckResult{
|
|
CurrentVer: us.currentVersion,
|
|
HasUpdate: false,
|
|
}
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
release, _, err := us.githubClient.Repositories.GetLatestRelease(ctx, "landaiqing", "voidraft")
|
|
if err != nil {
|
|
result.Error = fmt.Sprintf("Failed to check for updates: %v", err)
|
|
return result
|
|
}
|
|
|
|
if release.GetDraft() || release.GetPrerelease() {
|
|
result.Error = "Latest release is draft or prerelease"
|
|
return result
|
|
}
|
|
|
|
latestVer := strings.TrimPrefix(release.GetTagName(), "v")
|
|
currentVer := strings.TrimPrefix(us.currentVersion, "v")
|
|
|
|
result.LatestVer = latestVer
|
|
result.ReleaseNotes = release.GetBody()
|
|
result.ReleaseURL = release.GetHTMLURL()
|
|
|
|
if latestVer != currentVer && latestVer > currentVer {
|
|
result.HasUpdate = true
|
|
}
|
|
|
|
return result
|
|
}
|