aboutsummaryrefslogtreecommitdiff
path: root/web/ride-filters.go
diff options
context:
space:
mode:
Diffstat (limited to 'web/ride-filters.go')
-rw-r--r--web/ride-filters.go86
1 files changed, 56 insertions, 30 deletions
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
}