From 7aa64b0917130fcc1dc9f3da30d8f825136fe541 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Fri, 7 Aug 2026 19:10:30 +0200 Subject: feat: Add ride table sorting --- rides/rides.go | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'rides/rides.go') diff --git a/rides/rides.go b/rides/rides.go index 1958d20..f9d33da 100644 --- a/rides/rides.go +++ b/rides/rides.go @@ -2,6 +2,7 @@ package rides import ( "database/sql" + "fmt" "time" "github.com/martinlehoux/kagamigo/kcore" @@ -23,6 +24,16 @@ type Ride struct { UpdatedAt time.Time } +type SortColumn string + +const ( + SortName SortColumn = "name" + SortStartDate SortColumn = "started" + SortDistance SortColumn = "distance" + SortMovingTime SortColumn = "moving_time" + SortElevation SortColumn = "elevation" +) + const columns = "id, external_id, gpx_path, name, type, start_date, distance_m, moving_time_s, elapsed_time_s, total_elevation_gain_m, average_speed_mps, created_at, updated_at" func Save(db *sql.DB, r Ride) error { @@ -45,7 +56,19 @@ func Save(db *sql.DB, r Ride) error { } func List(db *sql.DB) ([]Ride, error) { - rows, err := db.Query("SELECT " + columns + " FROM rides ORDER BY start_date DESC") + return ListSorted(db, SortStartDate, true) +} + +func ListSorted(db *sql.DB, column SortColumn, descending bool) ([]Ride, error) { + expression, ok := sortExpressions[column] + if !ok { + return nil, fmt.Errorf("invalid ride sort column %q", column) + } + direction := "ASC" + if descending { + direction = "DESC" + } + rows, err := db.Query("SELECT " + columns + " FROM rides ORDER BY " + expression + " " + direction + ", id DESC") if err != nil { return nil, err } @@ -61,6 +84,14 @@ func List(db *sql.DB) ([]Ride, error) { return rides, rows.Err() } +var sortExpressions = map[SortColumn]string{ + SortName: "name COLLATE NOCASE", + SortStartDate: "start_date", + SortDistance: "distance_m", + SortMovingTime: "moving_time_s", + SortElevation: "total_elevation_gain_m", +} + func GetByExternalID(db *sql.DB, externalID string) (Ride, bool, error) { row := db.QueryRow("SELECT "+columns+" FROM rides WHERE external_id = ?", externalID) ride, err := scanRide(row) -- cgit v1.2.3