From 6e75b7d7d520cca34c037856e2184003ef4c5713 Mon Sep 17 00:00:00 2001 From: CN-JS-HuiBai Date: Sat, 18 Apr 2026 02:32:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=89=8D=E7=AB=AF=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=9C=A8=E7=BA=BF=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/user_api.go | 46 +++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/internal/handler/user_api.go b/internal/handler/user_api.go index de88608..44b2495 100644 --- a/internal/handler/user_api.go +++ b/internal/handler/user_api.go @@ -213,7 +213,51 @@ func UserServerFetch(c *gin.Context) { Fail(c, 500, "failed to fetch servers") return } - Success(c, servers) + + // Fetch all servers for parent lookup + var allServers []model.Server + if err := database.DB.Find(&allServers).Error; err != nil { + Fail(c, 500, "failed to fetch all servers") + return + } + serverMap := make(map[int]model.Server, len(allServers)) + for _, s := range allServers { + serverMap[s.ID] = s + } + + now := time.Now().Unix() + result := make([]gin.H, 0, len(servers)) + for _, server := range servers { + lastCheckAt, _ := database.CacheGetJSON[int64](nodeLastCheckKey(&server)) + isOnline := 0 + if lastCheckAt > 0 && now-lastCheckAt <= 300 { + isOnline = 1 + } + + // Inherit online status from parent if current is offline + if isOnline == 0 && server.ParentID != nil { + if parent, ok := serverMap[*server.ParentID]; ok { + pLastCheckAt, _ := database.CacheGetJSON[int64](nodeLastCheckKey(&parent)) + if pLastCheckAt > 0 && now-pLastCheckAt <= 300 { + isOnline = 1 + lastCheckAt = pLastCheckAt + } + } + } + + result = append(result, gin.H{ + "id": server.ID, + "type": server.Type, + "name": server.Name, + "rate": server.Rate, + "tags": server.Tags, + "is_online": isOnline, + "last_check_at": lastCheckAt, + "cache_key": fmt.Sprintf("%s_%d_%d", server.Type, server.ID, server.UpdatedAt.Unix()), + }) + } + + Success(c, result) } func currentUser(c *gin.Context) (*model.User, bool) {