Package gfit: Return immediately when no activities are set.
[kraftakt.git] / gfitsync.go
index 4ff1bab..61e9107 100644 (file)
@@ -229,32 +229,51 @@ func handleNotification(ctx context.Context, s *fitbit.Subscription) error {
                return err
        }
 
-       profile, err := fitbitClient.Profile(ctx)
-       if err != nil {
-               return err
+       var (
+               wg      = &sync.WaitGroup{}
+               errs    appengine.MultiError
+               summary *fitbit.ActivitySummary
+               profile *fitbit.Profile
+       )
+
+       wg.Add(1)
+       go func() {
+               var err error
+               summary, err = fitbitClient.ActivitySummary(ctx, s.Date)
+               if err != nil {
+                       errs = append(errs, fmt.Errorf("fitbitClient.ActivitySummary(%q) = %v", s.Date, err))
+               }
+               wg.Done()
+       }()
+
+       wg.Add(1)
+       go func() {
+               var err error
+               profile, err = fitbitClient.Profile(ctx)
+               if err != nil {
+                       errs = append(errs, fmt.Errorf("fitbitClient.Profile(%q) = %v", s.Date, err))
+               }
+               wg.Done()
+       }()
+
+       wg.Wait()
+       if len(errs) != 0 {
+               return errs
        }
-       log.Debugf(ctx, "profile = %+v", profile)
 
        tm, err := time.ParseInLocation("2006-01-02", s.Date, profile.Timezone)
        if err != nil {
                return err
        }
 
-       summary, err := fitbitClient.ActivitySummary(tm)
-       if err != nil {
-               return err
-       }
        log.Debugf(ctx, "%s (%s) took %d steps on %s",
-               profile.Name, u.Email, summary.Summary.Steps, s.Date)
+               profile.Name, u.Email, summary.Summary.Steps, tm)
 
        gfitClient, err := gfit.NewClient(ctx, u)
        if err != nil {
                return err
        }
 
-       var errs appengine.MultiError
-       wg := &sync.WaitGroup{}
-
        wg.Add(1)
        go func() {
                if err := gfitClient.SetSteps(ctx, summary.Summary.Steps, tm); err != nil {
@@ -273,6 +292,8 @@ func handleNotification(ctx context.Context, s *fitbit.Subscription) error {
 
        wg.Add(1)
        go func() {
+               defer wg.Done()
+
                var distanceMeters float64
                for _, d := range summary.Summary.Distances {
                        if d.Activity != "total" {
@@ -283,8 +304,8 @@ func handleNotification(ctx context.Context, s *fitbit.Subscription) error {
                }
                if err := gfitClient.SetDistance(ctx, distanceMeters, tm); err != nil {
                        errs = append(errs, fmt.Errorf("gfitClient.SetDistance(%d) = %v", distanceMeters, err))
+                       return
                }
-               wg.Done()
        }()
 
        wg.Add(1)
@@ -295,6 +316,39 @@ func handleNotification(ctx context.Context, s *fitbit.Subscription) error {
                wg.Done()
        }()
 
+       wg.Add(1)
+       go func() {
+               defer wg.Done()
+
+               var activities []gfit.Activity
+               for _, a := range summary.Activities {
+                       if !a.HasStartTime {
+                               continue
+                       }
+
+                       startTime, err := time.ParseInLocation("2006-01-02T15:04:05", a.StartDate+"T"+a.StartTime, profile.Timezone)
+                       if err != nil {
+                               errs = append(errs, fmt.Errorf("gfitClient.SetActivities() = %v", err))
+                               return
+                       }
+                       endTime := startTime.Add(time.Duration(a.Duration) * time.Millisecond)
+
+                       activities = append(activities, gfit.Activity{
+                               Start: startTime,
+                               End:   endTime,
+                               Type:  gfit.ParseFitbitActivity(a.Name),
+                       })
+               }
+               if err := gfitClient.SetActivities(ctx, activities, tm); err != nil {
+                       errs = append(errs, fmt.Errorf("gfitClient.SetActivities() = %v", err))
+                       return
+               }
+       }()
+
        wg.Wait()
-       return errs
+
+       if len(errs) != 0 {
+               return errs
+       }
+       return nil
 }