Files

63 lines
1.9 KiB
Go

package api
import (
"errors"
"io"
"net/http"
"strings"
"home-vue-go/internal/analytics"
"home-vue-go/internal/config"
"home-vue-go/internal/database"
"github.com/gin-gonic/gin"
)
func TestUmamiConnection(db *database.Database, appConfig *config.Config) gin.HandlerFunc {
return func(c *gin.Context) {
var req struct {
Mode *string `json:"mode"`
APIURL *string `json:"apiUrl"`
WebsiteID *string `json:"websiteId"`
Credential *string `json:"credential"`
}
if err := c.ShouldBindJSON(&req); err != nil && !errors.Is(err, io.EOF) {
c.JSON(http.StatusBadRequest, gin.H{"error": "测试参数格式错误"})
return
}
settings, err := db.LoadSiteSettings(c.Request.Context())
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "加载统计配置失败"})
return
}
credential := ""
if req.Credential != nil {
credential = strings.TrimSpace(*req.Credential)
} else if settings.UmamiCredential != "" && appConfig != nil {
credential, err = appConfig.DecryptSecret(settings.UmamiCredential)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "已保存的统计凭据无法解密"})
return
}
}
mode := settings.UmamiAPIMode
apiURL := settings.UmamiAPIURL
websiteID := settings.UmamiWebsiteID
if req.Mode != nil {
mode = strings.TrimSpace(*req.Mode)
}
if req.APIURL != nil {
apiURL = strings.TrimSpace(*req.APIURL)
}
if req.WebsiteID != nil {
websiteID = strings.TrimSpace(*req.WebsiteID)
}
clientConfig := analytics.Config{Mode: mode, APIURL: apiURL, Credential: credential, WebsiteID: websiteID}
if err := umamiClient.Test(c.Request.Context(), clientConfig); err != nil {
c.JSON(http.StatusBadGateway, gin.H{"error": "Umami连接失败,请检查地址、Website ID 和凭据"})
return
}
c.JSON(http.StatusOK, gin.H{"ok": true, "message": "Umami连接成功"})
}
}