Add update service

This commit is contained in:
2025-06-23 19:42:48 +08:00
parent 4f8272e290
commit ea025e3f5d
19 changed files with 639 additions and 270 deletions

View File

@@ -0,0 +1,89 @@
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
}