@@ -3,6 +3,7 @@ package handlers
33import (
44 "net/http"
55 "sort"
6+ "strings"
67 "time"
78
89 "github.com/ethpandaops/dugtrio/frontend"
@@ -60,7 +61,11 @@ func (fh *FrontendHandler) Health(w http.ResponseWriter, r *http.Request) {
6061
6162 var pageError error
6263
63- data .Data , pageError = fh .getHealthPageData ()
64+ // Parse sorting parameters
65+ sortBy := r .URL .Query ().Get ("sort" )
66+ sortOrder := r .URL .Query ().Get ("order" )
67+
68+ data .Data , pageError = fh .getHealthPageData (sortBy , sortOrder )
6469 if pageError != nil {
6570 frontend .HandlePageError (w , r , pageError )
6671 return
@@ -73,7 +78,7 @@ func (fh *FrontendHandler) Health(w http.ResponseWriter, r *http.Request) {
7378 }
7479}
7580
76- func (fh * FrontendHandler ) getHealthPageData () (* HealthPage , error ) {
81+ func (fh * FrontendHandler ) getHealthPageData (sortBy , sortOrder string ) (* HealthPage , error ) {
7782 pageData := & HealthPage {
7883 Clients : []* HealthPageClient {},
7984 }
@@ -84,6 +89,9 @@ func (fh *FrontendHandler) getHealthPageData() (*HealthPage, error) {
8489 pageData .Clients = append (pageData .Clients , clientData )
8590 }
8691
92+ // Sort clients based on parameters
93+ fh .sortClients (pageData .Clients , sortBy , sortOrder )
94+
8795 pageData .ClientCount = uint64 (len (pageData .Clients ))
8896
8997 // get blocks
@@ -168,3 +176,44 @@ func (fh *FrontendHandler) getHealthPageClientData(client *pool.Client) *HealthP
168176
169177 return clientData
170178}
179+
180+ // sortClients sorts the client slice based on the provided sort field and order
181+ func (fh * FrontendHandler ) sortClients (clients []* HealthPageClient , sortBy , sortOrder string ) {
182+ if sortBy == "" {
183+ return
184+ }
185+
186+ ascending := sortOrder != "desc"
187+
188+ sort .Slice (clients , func (i , j int ) bool {
189+ var less bool
190+
191+ switch strings .ToLower (sortBy ) {
192+ case "index" , "#" :
193+ less = clients [i ].Index < clients [j ].Index
194+ case "name" :
195+ less = strings .ToLower (clients [i ].Name ) < strings .ToLower (clients [j ].Name )
196+ case "headslot" , "head_slot" :
197+ less = clients [i ].HeadSlot < clients [j ].HeadSlot
198+ case "headroot" , "head_root" :
199+ less = string (clients [i ].HeadRoot ) < string (clients [j ].HeadRoot )
200+ case "status" :
201+ less = strings .ToLower (clients [i ].Status ) < strings .ToLower (clients [j ].Status )
202+ case "useable" , "ready" :
203+ less = ! clients [i ].IsReady && clients [j ].IsReady
204+ case "type" :
205+ less = clients [i ].Type < clients [j ].Type
206+ case "version" :
207+ less = strings .ToLower (clients [i ].Version ) < strings .ToLower (clients [j ].Version )
208+ default :
209+ // Default to index sorting
210+ less = clients [i ].Index < clients [j ].Index
211+ }
212+
213+ if ascending {
214+ return less
215+ }
216+
217+ return ! less
218+ })
219+ }
0 commit comments