summaryrefslogtreecommitdiff
path: root/web/server.go
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2026-08-11 14:19:01 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2026-08-11 14:19:01 +0200
commit7d13374eec8c33c4e14cc5b0c3de36e4f620ce0e (patch)
tree98a20ee73f34863ddb5938aa5eb29346e4a5db56 /web/server.go
parent1da94931188c35c06dd032aadce2799fc13db1dd (diff)
fix: Continue Strava import after invalid activities
Diffstat (limited to 'web/server.go')
-rw-r--r--web/server.go33
1 files changed, 28 insertions, 5 deletions
diff --git a/web/server.go b/web/server.go
index 53374ce..6f222ef 100644
--- a/web/server.go
+++ b/web/server.go
@@ -37,6 +37,11 @@ type Server struct {
syncActive bool
}
+type syncClient interface {
+ List(from, to time.Time) ([]strava.Activity, error)
+ Get(id int64) (strava.Activity, []byte, error)
+}
+
func NewServer(db *sql.DB, configPath string) *Server {
return &Server{db: db, configPath: configPath}
}
@@ -263,7 +268,7 @@ func (s *Server) handleStravaCallback(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, returnTo, http.StatusSeeOther)
}
-func (s *Server) syncRides(client *strava.Client, gpxDir string, from, to time.Time, report func(SyncProgress) error) (SyncProgress, error) {
+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 {
return SyncProgress{}, err
@@ -292,11 +297,18 @@ func (s *Server) syncRides(client *strava.Client, gpxDir string, from, to time.T
}
activity, gpxData, err := client.Get(summary.ID)
if err != nil {
- return progress, err
+ if err := skipSyncActivity(&progress, report, summary, err); err != nil {
+ return progress, err
+ }
+ continue
}
gpxPath := filepath.Join(gpxDir, fmt.Sprintf("activity_%d.gpx", activity.ID))
if err := os.WriteFile(gpxPath, gpxData, 0o644); err != nil {
- return progress, fmt.Errorf("write GPX for activity %d: %w", activity.ID, err)
+ _ = os.Remove(gpxPath)
+ if reportErr := skipSyncActivity(&progress, report, summary, fmt.Errorf("write GPX: %w", err)); reportErr != nil {
+ return progress, reportErr
+ }
+ continue
}
activityType := activity.SportType
if activityType == "" {
@@ -314,7 +326,11 @@ func (s *Server) syncRides(client *strava.Client, gpxDir string, from, to time.T
TotalElevationGainM: activity.TotalElevationGainM,
AverageSpeedMps: activity.AverageSpeedMps,
}); err != nil {
- return progress, fmt.Errorf("save activity %d: %w", activity.ID, err)
+ _ = os.Remove(gpxPath)
+ if reportErr := skipSyncActivity(&progress, report, summary, fmt.Errorf("save activity: %w", err)); reportErr != nil {
+ return progress, reportErr
+ }
+ continue
}
progress.Imported++
progress.Completed++
@@ -326,6 +342,13 @@ func (s *Server) syncRides(client *strava.Client, gpxDir string, from, to time.T
return progress, nil
}
+func skipSyncActivity(progress *SyncProgress, report func(SyncProgress) error, activity strava.Activity, err error) error {
+ progress.Skipped++
+ progress.Completed++
+ slog.Warn("Skipped Strava activity", "activity", activity.ID, "name", activity.Name, "error", err)
+ return reportSyncProgress(report, *progress)
+}
+
func reportSyncProgress(report func(SyncProgress) error, progress SyncProgress) error {
if report == nil {
return nil
@@ -469,7 +492,7 @@ func syncNotice(r *http.Request) string {
if imported == "" {
return ""
}
- return fmt.Sprintf("Sync complete: %s imported, %s already stored.", imported, r.URL.Query().Get("skipped"))
+ return fmt.Sprintf("Sync complete: %s imported, %s skipped.", imported, r.URL.Query().Get("skipped"))
}
func safeReturnTo(value string) string {