From 8b921624666141c09cf20e2e0ee3cbe260a6412d Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Mon, 24 Aug 2026 09:27:29 +0200 Subject: Add type filtering, drop hard-coded filters and route filter, tune backtest --- web/ride-filters.go | 86 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 30 deletions(-) (limited to 'web/ride-filters.go') diff --git a/web/ride-filters.go b/web/ride-filters.go index 64bade9..de8e242 100644 --- a/web/ride-filters.go +++ b/web/ride-filters.go @@ -29,13 +29,8 @@ const ( rideFilterDateToParam = "date_to" rideFilterCotacolMinParam = "cotacol_min" rideFilterCotacolMaxParam = "cotacol_max" - rideFilterRouteParam = "route" -) - -const ( - rideRouteFilterAny = "" - rideRouteFilterAvailable = "available" - rideRouteFilterMissing = "missing" + rideFilterBikeTypeParam = "bike_type" + rideFilterRideTypeParam = "ride_type" ) type RideFilters struct { @@ -47,7 +42,8 @@ type RideFilters struct { DateToExclusive *time.Time CotacolMinPoints *int CotacolMaxPoints *int - Route string + BikeType *ride.BikeType + RideType *ride.RideType } type RideFilterView struct { @@ -60,7 +56,8 @@ type RideFilterView struct { DateTo string CotacolMinPoints int CotacolMaxPoints int - Route string + BikeType string + RideType string ResetURL string } @@ -142,7 +139,8 @@ func parseRideFilters(query url.Values) RideFilters { DurationMaxMinutes: parseRideFilterInt(query.Get(rideFilterDurationMaxParam), rideFilterDurationMinMinutes, rideFilterDurationMaxMinutes, rideFilterDurationStepMinutes), CotacolMinPoints: parseRideFilterInt(query.Get(rideFilterCotacolMinParam), rideFilterCotacolMinPoints, rideFilterCotacolMaxPoints, rideFilterCotacolStepPoints), CotacolMaxPoints: parseRideFilterInt(query.Get(rideFilterCotacolMaxParam), rideFilterCotacolMinPoints, rideFilterCotacolMaxPoints, rideFilterCotacolStepPoints), - Route: parseRideRouteFilter(query.Get(rideFilterRouteParam)), + BikeType: parseRideBikeTypeFilter(query.Get(rideFilterBikeTypeParam)), + RideType: parseRideRideTypeFilter(query.Get(rideFilterRideTypeParam)), DateFrom: parseRideFilterDate(query.Get(rideFilterDateFromParam), false), DateToExclusive: parseRideFilterDate(query.Get(rideFilterDateToParam), true)} @@ -203,11 +201,26 @@ func parseRideFilterDate(value string, end bool) *time.Time { return &parsed } -func parseRideRouteFilter(value string) string { - if value == rideRouteFilterAvailable || value == rideRouteFilterMissing { - return value +func parseRideBikeTypeFilter(value string) *ride.BikeType { + if value == "" { + return nil + } + if !ride.IsValidBikeType(value) { + return nil + } + bikeType := ride.BikeType(value) + return &bikeType +} + +func parseRideRideTypeFilter(value string) *ride.RideType { + if value == "" { + return nil + } + if !ride.IsValidRideType(value) { + return nil } - return rideRouteFilterAny + rideType := ride.RideType(value) + return &rideType } func buildRideFilterView(filters RideFilters, sort RideSort) RideFilterView { @@ -219,6 +232,14 @@ func buildRideFilterView(filters RideFilters, sort RideSort) RideFilterView { if filters.DateToExclusive != nil { dateTo = filters.DateToExclusive.AddDate(0, 0, -1).Format(dateFormat) } + bikeType := "" + if filters.BikeType != nil { + bikeType = string(*filters.BikeType) + } + rideType := "" + if filters.RideType != nil { + rideType = string(*filters.RideType) + } return RideFilterView{ Active: filters.Active(), DistanceMinKm: rideFilterValue(filters.DistanceMinKm, rideFilterDistanceMinKm), @@ -229,7 +250,8 @@ func buildRideFilterView(filters RideFilters, sort RideSort) RideFilterView { DateTo: dateTo, CotacolMinPoints: rideFilterValue(filters.CotacolMinPoints, rideFilterCotacolMinPoints), CotacolMaxPoints: rideFilterValue(filters.CotacolMaxPoints, rideFilterCotacolMaxPoints), - Route: filters.Route, + BikeType: bikeType, + RideType: rideType, ResetURL: rideFiltersResetURL(sort), } } @@ -292,8 +314,11 @@ func rideFilterQuery(filters RideFilters) url.Values { if filters.CotacolMaxPoints != nil { query.Set(rideFilterCotacolMaxParam, formatRideFilterInt(*filters.CotacolMaxPoints)) } - if filters.Route != rideRouteFilterAny { - query.Set(rideFilterRouteParam, filters.Route) + if filters.BikeType != nil { + query.Set(rideFilterBikeTypeParam, string(*filters.BikeType)) + } + if filters.RideType != nil { + query.Set(rideFilterRideTypeParam, string(*filters.RideType)) } return query } @@ -317,18 +342,20 @@ func (filters RideFilters) Active() bool { filters.DateToExclusive != nil || filters.CotacolMinPoints != nil || filters.CotacolMaxPoints != nil || - filters.Route != rideRouteFilterAny + filters.BikeType != nil || + filters.RideType != nil } func filterRides(items []ride.StoredRide, filters RideFilters) []ride.StoredRide { - if !filters.Active() { - return items - } filtered := make([]ride.StoredRide, 0, len(items)) for _, item := range items { - if rideMatchesFilters(item, filters) { - filtered = append(filtered, item) + if !item.IsCategorised() { + continue + } + if filters.Active() && !rideMatchesFilters(item, filters) { + continue } + filtered = append(filtered, item) } return filtered } @@ -365,12 +392,11 @@ func rideMatchesFilters(item ride.StoredRide, filters RideFilters) bool { return false } } - switch filters.Route { - case rideRouteFilterAvailable: - return item.GPXPath != "" - case rideRouteFilterMissing: - return item.GPXPath == "" - default: - return true + if filters.BikeType != nil && item.BikeType != *filters.BikeType { + return false + } + if filters.RideType != nil && item.RideType != *filters.RideType { + return false } + return true } -- cgit v1.3