Skip to content

Commit 609004e

Browse files
committed
optimization-mobile
1 parent 1ddbb03 commit 609004e

2 files changed

Lines changed: 71 additions & 8 deletions

File tree

internal/api/handlers/dashboard.go

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,40 @@ import (
1919
"github.com/gin-gonic/gin"
2020
)
2121

22+
func parsePaginationParams(c *gin.Context, defaultLimit, maxLimit int) (int, int) {
23+
limit := defaultLimit
24+
if raw := c.Query("limit"); raw != "" {
25+
if parsed, err := strconv.Atoi(raw); err == nil {
26+
limit = parsed
27+
}
28+
}
29+
if limit <= 0 || limit > maxLimit {
30+
limit = maxLimit
31+
}
32+
33+
offset := 0
34+
if raw := c.Query("offset"); raw != "" {
35+
if parsed, err := strconv.Atoi(raw); err == nil && parsed > 0 {
36+
offset = parsed
37+
}
38+
}
39+
40+
return limit, offset
41+
}
42+
43+
func paginateDecisions(decisions []models.Decision, limit, offset int) []models.Decision {
44+
if offset >= len(decisions) {
45+
return []models.Decision{}
46+
}
47+
48+
end := offset + limit
49+
if end > len(decisions) {
50+
end = len(decisions)
51+
}
52+
53+
return decisions[offset:end]
54+
}
55+
2256
// =============================================================================
2357
// DASHBOARD & METRICS
2458
// =============================================================================
@@ -46,8 +80,14 @@ func GetDecisions(dockerClient *docker.Client, cfg *config.Config, ttlCache ...*
4680

4781
logger.Info("Getting CrowdSec decisions via cscli")
4882

49-
limit := config.EffectiveLimit(cfg.DecisionListLimit, constants.MaxListLimit)
50-
cmd := []string{"cscli", "decisions", "list", "-o", "json", "--limit", strconv.Itoa(limit)}
83+
defaultLimit := config.EffectiveLimit(cfg.DecisionListLimit, constants.MaxListLimit)
84+
limit, offset := parsePaginationParams(c, defaultLimit, constants.MaxListLimit)
85+
fetchLimit := defaultLimit
86+
if c.Query("limit") != "" || c.Query("offset") != "" {
87+
fetchLimit = constants.MaxListLimit
88+
}
89+
90+
cmd := []string{"cscli", "decisions", "list", "-o", "json", "--limit", strconv.Itoa(fetchLimit)}
5191
output, err := dockerClient.ExecCommand(cfg.CrowdsecContainerName, cmd)
5292
if err != nil {
5393
c.JSON(http.StatusInternalServerError, models.Response{
@@ -61,7 +101,7 @@ func GetDecisions(dockerClient *docker.Client, cfg *config.Config, ttlCache ...*
61101
if output == "null" || output == "" || output == "[]" {
62102
c.JSON(http.StatusOK, models.Response{
63103
Success: true,
64-
Data: gin.H{"decisions": []models.Decision{}, "count": 0},
104+
Data: gin.H{"decisions": []models.Decision{}, "count": 0, "total": 0, "limit": limit, "offset": offset},
65105
})
66106
return
67107
}
@@ -106,7 +146,15 @@ func GetDecisions(dockerClient *docker.Client, cfg *config.Config, ttlCache ...*
106146
return
107147
}
108148

109-
result := gin.H{"decisions": decisions, "count": len(decisions)}
149+
total := len(decisions)
150+
pagedDecisions := paginateDecisions(decisions, limit, offset)
151+
result := gin.H{
152+
"decisions": pagedDecisions,
153+
"count": len(pagedDecisions),
154+
"total": total,
155+
"limit": limit,
156+
"offset": offset,
157+
}
110158
if len(ttlCache) > 0 && ttlCache[0] != nil {
111159
ttlCache[0].Set(cacheKey, result, 15*time.Second)
112160
}

internal/api/handlers/dashboard_analysis.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,14 @@ func GetDecisionsAnalysis(dockerClient *docker.Client, cfg *config.Config) gin.H
2424
dockerClient = resolveDockerClient(c, dockerClient)
2525
logger.Info("Getting CrowdSec decisions analysis via cscli")
2626

27-
limit := config.EffectiveLimit(cfg.DecisionListLimit, constants.MaxListLimit)
28-
cmd := []string{"cscli", "decisions", "list", "-o", "json", "--limit", strconv.Itoa(limit)}
27+
defaultLimit := config.EffectiveLimit(cfg.DecisionListLimit, constants.MaxListLimit)
28+
limit, offset := parsePaginationParams(c, defaultLimit, constants.MaxListLimit)
29+
fetchLimit := defaultLimit
30+
if c.Query("limit") != "" || c.Query("offset") != "" {
31+
fetchLimit = constants.MaxListLimit
32+
}
33+
34+
cmd := []string{"cscli", "decisions", "list", "-o", "json", "--limit", strconv.Itoa(fetchLimit)}
2935

3036
// Add filters based on query parameters
3137
if v := c.Query("ip"); v != "" {
@@ -69,7 +75,7 @@ func GetDecisionsAnalysis(dockerClient *docker.Client, cfg *config.Config) gin.H
6975
if output == "null" || output == "" || output == "[]" {
7076
c.JSON(http.StatusOK, models.Response{
7177
Success: true,
72-
Data: gin.H{"decisions": []models.Decision{}, "count": 0},
78+
Data: gin.H{"decisions": []models.Decision{}, "count": 0, "total": 0, "limit": limit, "offset": offset},
7379
})
7480
return
7581
}
@@ -138,9 +144,18 @@ func GetDecisionsAnalysis(dockerClient *docker.Client, cfg *config.Config) gin.H
138144
"count", len(decisions),
139145
"cmd", cmd)
140146

147+
total := len(decisions)
148+
pagedDecisions := paginateDecisions(decisions, limit, offset)
149+
141150
c.JSON(http.StatusOK, models.Response{
142151
Success: true,
143-
Data: gin.H{"decisions": decisions, "count": len(decisions)},
152+
Data: gin.H{
153+
"decisions": pagedDecisions,
154+
"count": len(pagedDecisions),
155+
"total": total,
156+
"limit": limit,
157+
"offset": offset,
158+
},
144159
})
145160
}
146161
}

0 commit comments

Comments
 (0)