"fmt"
"io/ioutil"
"net/http"
+ "sync"
"time"
"github.com/octo/gfitsync/app"
}
haveGoogleToken := err == nil
- fmt.Fprintln(w, "<html><body><h1>Fitbit to Google Fit sync</h1>")
+ fmt.Fprintln(w, "<html><head><title>Kraftakt</title></head>")
+ fmt.Fprintln(w, "<body><h1>Kraftakt</h1>")
+
+ fmt.Fprintln(w, "<p><strong>Kraftakt</strong> copies your <em>Fitbit</em> data to <em>Google Fit</em>, seconds after you sync.</p>")
+
fmt.Fprintf(w, "<p>Hello %s</p>\n", user.Current(ctx).Email)
fmt.Fprintln(w, "<ul>")
}
fmt.Fprintln(w, "</li>")
- fmt.Fprint(w, "<li>Google: ")
+ fmt.Fprint(w, "<li>Google Fit: ")
if haveGoogleToken {
fmt.Fprint(w, `<strong style="color: DarkGreen;">Authorized</strong>`)
} else {
if err != nil {
return err
}
- c, err := fitbit.NewClient(ctx, s.OwnerID, u)
+
+ fitbitClient, err := fitbit.NewClient(ctx, s.OwnerID, u)
if err != nil {
return err
}
- tm, err := time.Parse("2006-01-02", s.Date)
+ profile, err := fitbitClient.Profile(ctx)
if err != nil {
return err
}
+ log.Debugf(ctx, "profile = %+v", profile)
- summary, err := c.ActivitySummary(tm)
+ tm, err := time.ParseInLocation("2006-01-02", s.Date, profile.Timezone)
if err != nil {
return err
}
- log.Debugf(ctx, "ActivitySummary for %s = %+v", u.Email, summary)
- return nil
+ 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)
+
+ 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 {
+ errs = append(errs, fmt.Errorf("gfitClient.SetSteps(%d) = %v", summary.Summary.Steps, err))
+ }
+ wg.Done()
+ }()
+
+ wg.Add(1)
+ go func() {
+ if err := gfitClient.SetCalories(ctx, summary.Summary.CaloriesOut, tm); err != nil {
+ errs = append(errs, fmt.Errorf("gfitClient.SetCalories(%d) = %v", summary.Summary.CaloriesOut, err))
+ }
+ wg.Done()
+ }()
+
+ wg.Add(1)
+ go func() {
+ var distanceMeters float64
+ for _, d := range summary.Summary.Distances {
+ if d.Activity != "total" {
+ continue
+ }
+ distanceMeters = 1000.0 * d.Distance
+ break
+ }
+ if err := gfitClient.SetDistance(ctx, distanceMeters, tm); err != nil {
+ errs = append(errs, fmt.Errorf("gfitClient.SetDistance(%d) = %v", distanceMeters, err))
+ }
+ wg.Done()
+ }()
+
+ wg.Add(1)
+ go func() {
+ if err := gfitClient.SetHeartRate(ctx, summary.Summary.HeartRateZones, summary.Summary.RestingHeartRate, tm); err != nil {
+ errs = append(errs, fmt.Errorf("gfitClient.SetHeartRate() = %v", err))
+ }
+ wg.Done()
+ }()
+
+ wg.Wait()
+ return errs
}