package api import ( "context" "encoding/json" "u-desk/internal/service" "time" "github.com/wailsapp/wails/v2/pkg/runtime" ) // UpdateAPI 版本更新 API type UpdateAPI struct { updateService *service.UpdateService ctx context.Context } // NewUpdateAPI 创建版本更新 API func NewUpdateAPI(checkURL string) (*UpdateAPI, error) { return &UpdateAPI{ updateService: service.NewUpdateService(checkURL), }, nil } // SetContext 设置上下文(用于事件推送) func (api *UpdateAPI) SetContext(ctx context.Context) { api.ctx = ctx } // successResponse 构造成功响应 func successResponse(data interface{}) map[string]interface{} { return map[string]interface{}{"success": true, "data": data} } // errorResponse 构造错误响应 func errorResponse(message string) map[string]interface{} { return map[string]interface{}{"success": false, "message": message} } // CheckUpdate 检查更新 func (api *UpdateAPI) CheckUpdate() (map[string]interface{}, error) { result, err := api.updateService.CheckUpdate() if err != nil { return errorResponse(err.Error()), nil } return successResponse(result), nil } // GetCurrentVersion 获取当前版本号 func (api *UpdateAPI) GetCurrentVersion() (map[string]interface{}, error) { version := service.GetCurrentVersion() // 同步配置中的版本号 if config, err := service.LoadUpdateConfig(); err == nil && config.CurrentVersion != version { config.CurrentVersion = version service.SaveUpdateConfig(config) } return successResponse(map[string]interface{}{ "version": version, }), nil } // GetUpdateConfig 获取更新配置 func (api *UpdateAPI) GetUpdateConfig() (map[string]interface{}, error) { config, err := service.LoadUpdateConfig() if err != nil { return errorResponse(err.Error()), nil } // 同步最新版本号 latestVersion := service.GetCurrentVersion() if config.CurrentVersion != latestVersion { config.CurrentVersion = latestVersion service.SaveUpdateConfig(config) } return successResponse(map[string]interface{}{ "current_version": config.CurrentVersion, "last_check_time": config.LastCheckTime.Format("2006-01-02 15:04:05"), "auto_check_enabled": config.AutoCheckEnabled, "check_interval_minutes": config.CheckIntervalMinutes, "check_url": config.CheckURL, }), nil } // SetUpdateConfig 设置更新配置 func (api *UpdateAPI) SetUpdateConfig(autoCheckEnabled bool, checkIntervalMinutes int, checkURL string) (map[string]interface{}, error) { config, err := service.LoadUpdateConfig() if err != nil { return errorResponse(err.Error()), nil } config.AutoCheckEnabled = autoCheckEnabled config.CheckIntervalMinutes = checkIntervalMinutes if checkURL != "" { config.CheckURL = checkURL api.updateService = service.NewUpdateService(checkURL) } if err := service.SaveUpdateConfig(config); err != nil { return errorResponse(err.Error()), nil } return successResponse(map[string]interface{}{ "message": "配置保存成功", }), nil } // DownloadUpdate 下载更新包(异步,通过事件推送进度) func (api *UpdateAPI) DownloadUpdate(downloadURL string) (map[string]interface{}, error) { if downloadURL == "" { return errorResponse("下载地址不能为空"), nil } go func() { progressCallback := func(progress float64, speed float64, downloaded int64, total int64) { progressInfo := map[string]interface{}{ "progress": progress, "speed": speed, "downloaded": downloaded, "total": total, } progressJSON, _ := json.Marshal(progressInfo) runtime.EventsEmit(api.ctx, "download-progress", string(progressJSON)) } time.Sleep(100 * time.Millisecond) result, err := service.DownloadUpdate(downloadURL, progressCallback) if err != nil { errorInfo := map[string]interface{}{"error": err.Error()} errorJSON, _ := json.Marshal(errorInfo) runtime.EventsEmit(api.ctx, "download-complete", string(errorJSON)) } else { resultInfo := map[string]interface{}{ "success": true, "file_path": result.FilePath, "file_size": result.FileSize, } resultJSON, _ := json.Marshal(resultInfo) runtime.EventsEmit(api.ctx, "download-complete", string(resultJSON)) } }() return successResponse(map[string]interface{}{ "message": "下载已开始", }), nil } // InstallUpdate 安装更新包 func (api *UpdateAPI) InstallUpdate(installerPath string, autoRestart bool) (map[string]interface{}, error) { return api.InstallUpdateWithHash(installerPath, autoRestart, "", "") } // InstallUpdateWithHash 安装更新包(带哈希验证) func (api *UpdateAPI) InstallUpdateWithHash(installerPath string, autoRestart bool, expectedHash string, hashType string) (map[string]interface{}, error) { if installerPath == "" { return errorResponse("安装文件路径不能为空"), nil } result, err := service.InstallUpdateWithHash(installerPath, autoRestart, expectedHash, hashType) if err != nil { return errorResponse(err.Error()), nil } return successResponse(result), nil } // VerifyUpdateFile 验证更新文件哈希值 func (api *UpdateAPI) VerifyUpdateFile(filePath string, expectedHash string, hashType string) (map[string]interface{}, error) { if filePath == "" { return errorResponse("文件路径不能为空"), nil } valid, err := service.VerifyFileHash(filePath, expectedHash, hashType) if err != nil { return errorResponse(err.Error()), nil } return successResponse(map[string]interface{}{ "valid": valid, }), nil }