aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-08-23 13:13:30 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-08-23 13:13:30 +0200
commit1125e0b7086dd2b71e0558aaf641c23dea02f200 (patch)
tree9113903e7d722dd2b5ea0f419f33d7705978e2c9
parent2a6189bda8dd9f39d9177ffca2330101e914d8f0 (diff)
Apply go fix modernizations and refresh TODO list
-rw-r--r--README.md4
-rw-r--r--strava/strava.go5
-rw-r--r--web/sync.go14
3 files changed, 7 insertions, 16 deletions
diff --git a/README.md b/README.md
index f7633cc..d49e761 100644
--- a/README.md
+++ b/README.md
@@ -108,9 +108,8 @@ TypeScript checks can also be run directly with `npm run check`, covering format
## TODO
-- http://localhost:8080/rides/6: Cat 4 inside Chemin des Lauriers (embrassé)
- Compute estimated power, speed
-- Categorised rides like to-dos
+- Categorised rides like to-dos, also vtt
- Compact binary or vectorized storage for root
- For a ride, scatter, one point per 100m segment. Slope vs speed
- Plot speed and slope per segment, colored by heart rate
@@ -128,6 +127,7 @@ TypeScript checks can also be run directly with `npm run check`, covering format
- progress bar cli
- processing takes components as input, not entities
- issue: many passes are pedestriant (cf Marseille Calanques, http://localhost:8080/rides/397)
+- analytics: color split (by year, type, etc)
## Resources
diff --git a/strava/strava.go b/strava/strava.go
index 309d0ee..a619e0a 100644
--- a/strava/strava.go
+++ b/strava/strava.go
@@ -150,10 +150,7 @@ type RateLimitError struct {
func (e *RateLimitError) Error() string {
if !e.RetryAfter.IsZero() {
- until := time.Until(e.RetryAfter).Truncate(time.Second)
- if until < 0 {
- until = 0
- }
+ until := max(time.Until(e.RetryAfter).Truncate(time.Second), 0)
scope := "15-minute"
if e.IsDaily {
scope = "daily"
diff --git a/web/sync.go b/web/sync.go
index fdb3c4e..0b95b93 100644
--- a/web/sync.go
+++ b/web/sync.go
@@ -83,8 +83,7 @@ func (s *Server) handleSync(w http.ResponseWriter, r *http.Request) {
return writeSyncEvent(w, flusher, "progress", progress)
})
if err != nil {
- var rateErr *strava.RateLimitError
- if errors.As(err, &rateErr) {
+ if rateErr, ok := errors.AsType[*strava.RateLimitError](err); ok {
slog.Warn("Strava sync rate limited", "total", progress.Total, "imported", progress.Imported, "retryAfter", rateErr.RetryAfter, "isDaily", rateErr.IsDaily, "readDaily", fmt.Sprintf("%d/%d", rateErr.State.Read.UsageDaily, rateErr.State.Read.LimitDaily), "overallDaily", fmt.Sprintf("%d/%d", rateErr.State.Overall.UsageDaily, rateErr.State.Overall.LimitDaily))
enrichProgressWithState(&progress, rateErr.State)
_ = writeSyncEvent(w, flusher, "error", syncErrorEvent{
@@ -108,8 +107,7 @@ func (s *Server) handleSync(w http.ResponseWriter, r *http.Request) {
func (s *Server) syncRides(client syncClient, gpxDir string, from, to time.Time, report func(SyncProgress) error) (SyncProgress, error) {
activities, err := client.List(from, to)
if err != nil {
- var rateErr *strava.RateLimitError
- if errors.As(err, &rateErr) {
+ if rateErr, ok := errors.AsType[*strava.RateLimitError](err); ok {
slog.Warn("Strava sync rate limited while listing activities", "retryAfter", rateErr.RetryAfter, "isDaily", rateErr.IsDaily, "error", err)
}
return SyncProgress{}, err
@@ -138,8 +136,7 @@ func (s *Server) syncRides(client syncClient, gpxDir string, from, to time.Time,
}
activity, gpxData, err := client.Get(summary.ID)
if err != nil {
- var rateErr *strava.RateLimitError
- if errors.As(err, &rateErr) {
+ if rateErr, ok := errors.AsType[*strava.RateLimitError](err); ok {
slog.Warn("Strava sync rate limited", "activity", summary.ID, "name", summary.Name, "retryAfter", rateErr.RetryAfter, "isDaily", rateErr.IsDaily, "completed", progress.Completed, "total", progress.Total)
return progress, err
}
@@ -287,10 +284,7 @@ func rateLimitMessage(rateErr *strava.RateLimitError, progress SyncProgress) str
}
retryText := ""
if !rateErr.RetryAfter.IsZero() {
- until := time.Until(rateErr.RetryAfter).Truncate(time.Second)
- if until < 0 {
- until = 0
- }
+ until := max(time.Until(rateErr.RetryAfter).Truncate(time.Second), 0)
retryText = fmt.Sprintf(" Retry after %s (in %s).", rateErr.RetryAfter.UTC().Format(time.RFC3339), until)
if rateErr.IsDaily {
retryText = fmt.Sprintf(" Daily limit resets at %s (in %s).", rateErr.RetryAfter.UTC().Format(time.RFC3339), until)