summaryrefslogtreecommitdiff
path: root/rides/rides.go
diff options
context:
space:
mode:
Diffstat (limited to 'rides/rides.go')
-rw-r--r--rides/rides.go33
1 files changed, 32 insertions, 1 deletions
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)