63 lines
1.9 KiB
Go
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连接成功"})
|
|
}
|
|
}
|