[优化] 添加访问日志汇总功能,更新相关数据结构和测试用例

This commit is contained in:
ryan
2026-03-15 14:19:21 +08:00
parent 25004fefae
commit 5bb25d2203
5 changed files with 149 additions and 24 deletions
+20 -10
View File
@@ -23,25 +23,33 @@ type AccessLogView struct {
}
type AccessLogList struct {
Items []AccessLogView `json:"items"`
Page int `json:"page"`
PageSize int `json:"page_size"`
HasMore bool `json:"has_more"`
Items []AccessLogView `json:"items"`
Page int `json:"page"`
PageSize int `json:"page_size"`
HasMore bool `json:"has_more"`
TotalRecord int64 `json:"total_record"`
TotalIP int64 `json:"total_ip"`
}
func ListAccessLogs(nodeID string, page int, pageSize int) (*AccessLogList, error) {
normalizedPage := normalizeAccessLogPage(page)
normalizedPageSize := normalizeAccessLogPageSize(pageSize)
offset := normalizedPage * normalizedPageSize
trimmedNodeID := strings.TrimSpace(nodeID)
since := time.Now().Add(-nodeAccessLogRetentionWindow)
logs, err := model.ListNodeAccessLogs(
strings.TrimSpace(nodeID),
time.Now().Add(-nodeAccessLogRetentionWindow),
trimmedNodeID,
since,
offset,
normalizedPageSize+1,
)
if err != nil {
return nil, err
}
totalRecords, totalIPs, err := model.CountNodeAccessLogs(trimmedNodeID, since)
if err != nil {
return nil, err
}
nodes, err := model.ListNodes()
if err != nil {
return nil, err
@@ -74,10 +82,12 @@ func ListAccessLogs(nodeID string, page int, pageSize int) (*AccessLogList, erro
})
}
return &AccessLogList{
Items: views,
Page: normalizedPage,
PageSize: normalizedPageSize,
HasMore: hasMore,
Items: views,
Page: normalizedPage,
PageSize: normalizedPageSize,
HasMore: hasMore,
TotalRecord: totalRecords,
TotalIP: totalIPs,
}, nil
}
+94
View File
@@ -0,0 +1,94 @@
package service
import (
"atsflare/model"
"testing"
"time"
)
func TestListAccessLogsIncludesSummaryTotals(t *testing.T) {
setupServiceTestDB(t)
now := time.Now()
if err := model.DB.Create(&model.Node{
NodeID: "node-a",
Name: "edge-a",
}).Error; err != nil {
t.Fatalf("failed to seed node-a: %v", err)
}
if err := model.DB.Create(&model.Node{
NodeID: "node-b",
Name: "edge-b",
}).Error; err != nil {
t.Fatalf("failed to seed node-b: %v", err)
}
logs := []*model.NodeAccessLog{
{
NodeID: "node-a",
LoggedAt: now.Add(-5 * time.Minute),
RemoteAddr: "1.1.1.1",
Host: "a.example.com",
Path: "/alpha",
StatusCode: 200,
},
{
NodeID: "node-a",
LoggedAt: now.Add(-4 * time.Minute),
RemoteAddr: "2.2.2.2",
Host: "a.example.com",
Path: "/beta",
StatusCode: 404,
},
{
NodeID: "node-b",
LoggedAt: now.Add(-3 * time.Minute),
RemoteAddr: "1.1.1.1",
Host: "b.example.com",
Path: "/gamma",
StatusCode: 502,
},
{
NodeID: "node-b",
LoggedAt: now.Add(-2 * time.Minute),
RemoteAddr: "",
Host: "b.example.com",
Path: "/delta",
StatusCode: 200,
},
}
if err := model.DB.Create(&logs).Error; err != nil {
t.Fatalf("failed to seed access logs: %v", err)
}
result, err := ListAccessLogs("", 0, 2)
if err != nil {
t.Fatalf("ListAccessLogs failed: %v", err)
}
if result.TotalRecord != 4 {
t.Fatalf("expected total_record=4, got %d", result.TotalRecord)
}
if result.TotalIP != 2 {
t.Fatalf("expected total_ip=2, got %d", result.TotalIP)
}
if len(result.Items) != 2 {
t.Fatalf("expected current page items=2, got %d", len(result.Items))
}
if !result.HasMore {
t.Fatal("expected has_more to be true")
}
filtered, err := ListAccessLogs("node-a", 0, 50)
if err != nil {
t.Fatalf("ListAccessLogs filtered failed: %v", err)
}
if filtered.TotalRecord != 2 {
t.Fatalf("expected filtered total_record=2, got %d", filtered.TotalRecord)
}
if filtered.TotalIP != 2 {
t.Fatalf("expected filtered total_ip=2, got %d", filtered.TotalIP)
}
if len(filtered.Items) != 2 {
t.Fatalf("expected filtered items=2, got %d", len(filtered.Items))
}
}