后端与全仓代码质量清理(golangci 扩展集 · 测试质量 · 并发安全 · 文档同步)

代码质量全量清理,零行为变化:golangci 扩展集 13 类 linter(gosec/modernize/perfsprint/canonicalheader/usestdlibvars/wastedassign/intrange/errorlint/forcetypeassert/recvcheck/exhaustive/unparam)全量修复,测试代码质量(testifylint/thelper/usetesting)25→0,frpc 进程生命周期真 bug(进程组击杀)、全仓 go test -race 6 类数据竞争(含 1 个生产竞争)、SPDX license 头补齐 131 文件、前端测试套件 next-intl 迁移后 44 失败→全绿、过期 swagger 文档重新生成、pnpm-workspace 构建审批。

Experiments: #2-#17, #18, #20, #21, #23
Metric: total_issues 108 → 8 (-92.6%)
This commit is contained in:
ryan
2026-08-16 21:23:37 +08:00
parent 5a8722ff07
commit 2f60329886
292 changed files with 1362 additions and 793 deletions
+7 -7
View File
@@ -10,6 +10,7 @@ import (
"fmt"
"io"
"log/slog"
"maps"
"net/http"
"strconv"
"strings"
@@ -88,7 +89,7 @@ func NewSocketIOClient(baseURL string) *SocketIOClient {
// Connect performs the Engine.IO handshake and starts the polling loop.
func (c *SocketIOClient) Connect() error {
slog.Debug("Uptime Kuma client starting handshake", "baseURL", c.baseURL)
u := fmt.Sprintf("%s/socket.io/?EIO=4&transport=polling", c.baseURL)
u := c.baseURL + "/socket.io/?EIO=4&transport=polling"
reqHandshake, err := http.NewRequestWithContext(c.ctx, http.MethodGet, u, nil)
if err != nil {
return fmt.Errorf("create handshake request failed: %w", err)
@@ -180,8 +181,8 @@ func (c *SocketIOClient) pollLoop() {
}
slog.Debug("Received polling payload from Uptime Kuma", "length", len(bodyStr))
packets := strings.Split(bodyStr, "\x1e")
for _, pkt := range packets {
packets := strings.SplitSeq(bodyStr, "\x1e")
for pkt := range packets {
if len(pkt) == 0 {
continue
}
@@ -280,7 +281,8 @@ func (c *SocketIOClient) Emit(event string, args ...any) (string, error) {
c.ackChanMap[id] = ch
c.ackMutex.Unlock()
payloadArr := []any{event}
payloadArr := make([]any, 1, 1+len(args))
payloadArr[0] = event
payloadArr = append(payloadArr, args...)
bs, err := json.Marshal(payloadArr)
if err != nil {
@@ -352,9 +354,7 @@ func (c *SocketIOClient) GetMonitorList() map[string]Monitor {
defer c.monitorListMutex.RUnlock()
m := make(map[string]Monitor, len(c.monitorList))
for k, v := range c.monitorList {
m[k] = v
}
maps.Copy(m, c.monitorList)
return m
}
+11 -16
View File
@@ -5,6 +5,7 @@ package uptimekuma
import (
"context"
"errors"
"fmt"
"log/slog"
"strings"
@@ -32,7 +33,7 @@ type kumaConfig struct {
}
// loadKumaConfig 从 SystemConfig 加载 UptimeKuma 配置
func loadKumaConfig(ctx context.Context) (*kumaConfig, error) {
func loadKumaConfig(ctx context.Context) *kumaConfig {
url, _ := repository.GetSystemConfigByKey(ctx, model.ConfigKeyUptimeKumaURL)
username, _ := repository.GetSystemConfigByKey(ctx, model.ConfigKeyUptimeKumaUsername)
password, _ := repository.GetSystemConfigByKey(ctx, model.ConfigKeyUptimeKumaPassword)
@@ -67,7 +68,7 @@ func loadKumaConfig(ctx context.Context) (*kumaConfig, error) {
Retry: retry,
RetryInterval: retryInterval,
Timeout: timeout,
}, nil
}
}
// SyncToUptimeKuma synchronizes enabled proxy routes to Uptime Kuma monitors.
@@ -75,19 +76,16 @@ func SyncToUptimeKuma(ctx context.Context) error {
// 检查是否启用
enabled, _ := repository.GetBoolByKey(ctx, model.ConfigKeyUptimeKumaEnabled)
if !enabled {
return fmt.Errorf("uptime Kuma integration is disabled")
return errors.New("uptime Kuma integration is disabled")
}
if !isSyncing.CompareAndSwap(false, true) {
return fmt.Errorf("sync task is already in progress, please try again later")
return errors.New("sync task is already in progress, please try again later")
}
defer isSyncing.Store(false)
// 加载配置
config, err := loadKumaConfig(ctx)
if err != nil {
return err
}
config := loadKumaConfig(ctx)
// 验证配置
if err := validateKumaConfig(config); err != nil {
@@ -105,10 +103,7 @@ func SyncToUptimeKuma(ctx context.Context) error {
return fmt.Errorf("failed to list local proxy routes: %w", err)
}
expectedRoutes, err := filterExpectedRoutes(allRoutes, config)
if err != nil {
return err
}
expectedRoutes := filterExpectedRoutes(allRoutes, config)
client, err := connectAndLoginUptimeKuma(config.URL, config.Username, config.Password)
if err != nil {
@@ -128,7 +123,7 @@ func SyncToUptimeKuma(ctx context.Context) error {
return nil
}
func filterExpectedRoutes(allRoutes []*model.ProxyRoute, config *kumaConfig) ([]*model.ProxyRoute, error) {
func filterExpectedRoutes(allRoutes []*model.ProxyRoute, config *kumaConfig) []*model.ProxyRoute {
scope := config.MonitorScope
if scope == "selected" {
selectedList := strings.Split(config.SelectedSites, ",")
@@ -145,7 +140,7 @@ func filterExpectedRoutes(allRoutes []*model.ProxyRoute, config *kumaConfig) ([]
expectedRoutes = append(expectedRoutes, route)
}
}
return expectedRoutes, nil
return expectedRoutes
}
var expectedRoutes []*model.ProxyRoute
@@ -154,7 +149,7 @@ func filterExpectedRoutes(allRoutes []*model.ProxyRoute, config *kumaConfig) ([]
expectedRoutes = append(expectedRoutes, route)
}
}
return expectedRoutes, nil
return expectedRoutes
}
func ensureOpenFlareTag(client *SocketIOClient) (int, error) {
@@ -225,7 +220,7 @@ func filterOpenFlareMonitors(monitors map[string]Monitor, openFlareTagID int) ma
func routeMonitorURL(ctx context.Context, route *model.ProxyRoute) (string, error) {
if route == nil {
return "", fmt.Errorf("proxy route is nil")
return "", errors.New("proxy route is nil")
}
domains, err := repository.ListZoneDomainsByRouteID(ctx, route.ID)
if err != nil {
@@ -5,6 +5,7 @@ package uptimekuma
import (
"context"
"errors"
"fmt"
"log/slog"
"strings"
@@ -18,13 +19,13 @@ const monitorListWaitTimeout = 5 * time.Second
// validateKumaConfig 验证 kumaConfig 配置完整性
func validateKumaConfig(config *kumaConfig) error {
if strings.TrimSpace(config.URL) == "" {
return fmt.Errorf("uptime Kuma URL is not configured")
return errors.New("uptime Kuma URL is not configured")
}
if strings.TrimSpace(config.Username) == "" {
return fmt.Errorf("uptime Kuma username is not configured")
return errors.New("uptime Kuma username is not configured")
}
if strings.TrimSpace(config.Password) == "" {
return fmt.Errorf("uptime Kuma password is not configured")
return errors.New("uptime Kuma password is not configured")
}
return nil
}
@@ -65,7 +66,7 @@ func connectAndLoginUptimeKuma(kumaURL, kumaUsername, kumaPassword string) (*Soc
case <-time.After(monitorListWaitTimeout):
client.Close()
slog.Error("Timeout waiting for Uptime Kuma monitorList push event")
return nil, fmt.Errorf("timeout waiting for monitorList event from Uptime Kuma")
return nil, errors.New("timeout waiting for monitorList event from Uptime Kuma")
}
return client, nil
}