mirror of
https://github.com/ctwj/urldb.git
synced 2025-11-25 03:15:04 +08:00
140 lines
3.2 KiB
Go
140 lines
3.2 KiB
Go
package handlers
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"io"
|
||
"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(),
|
||
}
|
||
|
||
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(),
|
||
}
|
||
|
||
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(),
|
||
}
|
||
|
||
c.JSON(http.StatusOK, response)
|
||
}
|
||
|
||
// CheckUpdate 检查更新
|
||
func CheckUpdate(c *gin.Context) {
|
||
currentVersion := utils.GetVersionInfo().Version
|
||
|
||
// 从GitHub API获取最新版本信息
|
||
latestVersion, err := getLatestVersionFromGitHub()
|
||
if err != nil {
|
||
// 如果GitHub API失败,使用当前版本作为最新版本
|
||
latestVersion = currentVersion
|
||
}
|
||
|
||
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(),
|
||
}
|
||
|
||
c.JSON(http.StatusOK, response)
|
||
}
|
||
|
||
// getLatestVersionFromGitHub 从GitHub获取最新版本
|
||
func getLatestVersionFromGitHub() (string, error) {
|
||
// 首先尝试从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
|
||
url := "https://api.github.com/repos/ctwj/urldb/releases/latest"
|
||
|
||
resp, err = http.Get(url)
|
||
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
|
||
}
|