summaryrefslogtreecommitdiff
path: root/web/server.go
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-08-08 22:29:49 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-08-08 22:29:49 +0200
commit31ce2a1d5ff5746249cd4de96762f5740aff907a (patch)
tree2a52c7c4b69f7b82836504bcac5344171581102e /web/server.go
parentd463633ecdc66cc4bedd6e5d1267f0eb69493f38 (diff)
perf: Load ride values from SQLite
Diffstat (limited to 'web/server.go')
-rw-r--r--web/server.go43
1 files changed, 4 insertions, 39 deletions
diff --git a/web/server.go b/web/server.go
index f8388b9..845c31c 100644
--- a/web/server.go
+++ b/web/server.go
@@ -11,7 +11,6 @@ import (
"net/url"
"os"
"path/filepath"
- "sort"
"strconv"
"strings"
"sync"
@@ -57,13 +56,11 @@ func (s *Server) handleRides(w http.ResponseWriter, r *http.Request) {
rideSort := parseRideSort(r.URL.Query())
items, err := s.listRides(rideSort)
if err != nil {
+ slog.Error("Failed to load rides", "sort", rideSort.Column, "descending", rideSort.Descending, "error", err)
http.Error(w, "failed to load rides", http.StatusInternalServerError)
return
}
views := buildRideViews(items)
- if _, databaseColumn := rideSort.databaseColumn(); !databaseColumn {
- sortRideViews(views, rideSort)
- }
kcore.RenderPage(r.Context(), RidesPage(views, rideSortHeaders(rideSort)), w)
}
@@ -78,54 +75,22 @@ func (s *Server) listRides(rideSort RideSort) ([]rides.Ride, error) {
const minimumDisplayedDistanceM = 10_000
func buildRideViews(items []rides.Ride) []RideView {
- parser := ride.GPXRideParser{}
views := make([]RideView, 0, len(items))
for _, item := range items {
if item.DistanceM < minimumDisplayedDistanceM {
continue
}
- view := RideView{Ride: item, Cotacol: "-"}
- parsed, err := ride.ParseFile(parser, item.GPXPath)
- if err != nil {
- slog.Warn("Failed to compute Cotacol", "ride", item.ExternalID, "file", item.GPXPath, "error", err)
- } else {
- score := ride.Cotacol(parsed)
+ view := RideView{Ride: item, Cotacol: "-", CotacolPer100Km: "-"}
+ score, ready := item.CotacolScore()
+ if ready && item.CotacolAlgorithmVersion() == ride.CotacolAlgorithmVersion && item.DistanceM > 0 {
view.Cotacol = formatCotacol(score)
view.CotacolPer100Km = formatCotacolPer100Km(score, item.DistanceM)
- view.cotacolScore = score
- view.cotacolPer100Km = score * 100 / (item.DistanceM / 1000)
- view.cotacolReady = true
}
views = append(views, view)
}
return views
}
-func sortRideViews(items []RideView, rideSort RideSort) {
- sort.SliceStable(items, func(i, j int) bool {
- left, right := items[i], items[j]
- if !left.cotacolReady || !right.cotacolReady {
- if left.cotacolReady != right.cotacolReady {
- return left.cotacolReady
- }
- return false
- }
- var leftValue, rightValue float64
- switch rideSort.Column {
- case rideSortCotacol:
- leftValue, rightValue = left.cotacolScore, right.cotacolScore
- case rideSortCotacolKm:
- leftValue, rightValue = left.cotacolPer100Km, right.cotacolPer100Km
- default:
- return false
- }
- if rideSort.Descending {
- return leftValue > rightValue
- }
- return leftValue < rightValue
- })
-}
-
func (s *Server) handleSyncForm(w http.ResponseWriter, r *http.Request) {
data := SyncPageData{
From: queryOrDefault(r, "from", time.Now().AddDate(0, 0, -30).Format(dateFormat)),