Files
urldb/handlers/version_handler.go

140 lines
3.2 KiB
Go
Raw Permalink Normal View History

2025-07-20 21:56:00 +08:00
package handlers
import (
"encoding/json"
"fmt"
2025-07-27 08:06:55 +08:00
"io"
2025-07-20 21:56:00 +08:00
"net/http"
"strings"
"time"
"github.com/ctwj/urldb/utils"
"github.com/gin-gonic/gin"
)
// VersionResponse 版本响应结构
type VersionResponse struct {
Success bool `json:"success"`
Data interface{} `json:"data"`
Message string `json:"message"`
Time time.Time `json:"time"`
}
// GetVersion 获取版本信息
func GetVersion(c *gin.Context) {
versionInfo := utils.GetVersionInfo()
response := VersionResponse{
Success: true,
Data: versionInfo,
Message: "版本信息获取成功",
Time: utils.GetCurrentTime(),
2025-07-20 21:56:00 +08:00
}
c.JSON(http.StatusOK, response)
}
// GetVersionString 获取版本字符串
func GetVersionString(c *gin.Context) {
versionString := utils.GetVersionString()
response := VersionResponse{
Success: true,
Data: map[string]string{
"version": versionString,
},
Message: "版本字符串获取成功",
Time: utils.GetCurrentTime(),
2025-07-20 21:56:00 +08:00
}
c.JSON(http.StatusOK, response)
}
// GetFullVersionInfo 获取完整版本信息
func GetFullVersionInfo(c *gin.Context) {
fullInfo := utils.GetFullVersionInfo()
response := VersionResponse{
Success: true,
Data: map[string]string{
"version_info": fullInfo,
},
Message: "完整版本信息获取成功",
Time: utils.GetCurrentTime(),
2025-07-20 21:56:00 +08:00
}
c.JSON(http.StatusOK, response)
}
// CheckUpdate 检查更新
func CheckUpdate(c *gin.Context) {
currentVersion := utils.GetVersionInfo().Version
// 从GitHub API获取最新版本信息
latestVersion, err := getLatestVersionFromGitHub()
if err != nil {
2025-07-27 08:06:55 +08:00
// 如果GitHub API失败使用当前版本作为最新版本
latestVersion = currentVersion
2025-07-20 21:56:00 +08:00
}
hasUpdate := utils.IsVersionNewer(latestVersion, currentVersion)
response := VersionResponse{
Success: true,
Data: map[string]interface{}{
"current_version": currentVersion,
"latest_version": latestVersion,
"has_update": hasUpdate,
"update_available": hasUpdate,
"update_url": "https://github.com/ctwj/urldb/releases/latest",
},
Message: "更新检查完成",
Time: utils.GetCurrentTime(),
2025-07-20 21:56:00 +08:00
}
c.JSON(http.StatusOK, response)
}
// getLatestVersionFromGitHub 从GitHub获取最新版本
func getLatestVersionFromGitHub() (string, error) {
2025-07-27 08:06:55 +08:00
// 首先尝试从VERSION文件URL获取最新版本
versionURL := "https://raw.githubusercontent.com/ctwj/urldb/refs/heads/main/VERSION"
resp, err := http.Get(versionURL)
if err == nil && resp.StatusCode == http.StatusOK {
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err == nil {
version := strings.TrimSpace(string(body))
if version != "" {
return version, nil
}
}
}
// 如果VERSION文件获取失败尝试GitHub API获取最新Release
2025-07-20 21:56:00 +08:00
url := "https://api.github.com/repos/ctwj/urldb/releases/latest"
2025-07-27 08:06:55 +08:00
resp, err = http.Get(url)
2025-07-20 21:56:00 +08:00
if err != nil {
return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("GitHub API返回状态码: %d", resp.StatusCode)
}
var release struct {
TagName string `json:"tag_name"`
}
if err := json.NewDecoder(resp.Body).Decode(&release); err != nil {
return "", err
}
// 移除版本号前的 'v' 前缀
version := strings.TrimPrefix(release.TagName, "v")
return version, nil
}