X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=sidebyside;f=gfit%2Fgfit.go;h=a1d4e114530b0e668f6611f935fe597522489524;hb=a90c26dd6d2a0de773908d43e1eb3fe09b8c9a63;hp=36e5d5f4a7d53fcfb112044efebd714cb82240c0;hpb=428a91c3d1adc71f21d761bf9e96e7157b9d51c1;p=kraftakt.git diff --git a/gfit/gfit.go b/gfit/gfit.go index 36e5d5f..a1d4e11 100644 --- a/gfit/gfit.go +++ b/gfit/gfit.go @@ -3,7 +3,9 @@ package gfit import ( "context" "fmt" + "io/ioutil" "net/http" + "net/url" "strings" "time" @@ -16,6 +18,7 @@ import ( "google.golang.org/api/googleapi" "google.golang.org/appengine" "google.golang.org/appengine/log" + "google.golang.org/appengine/urlfetch" ) const ( @@ -89,7 +92,38 @@ func NewClient(ctx context.Context, u *app.User) (*Client, error) { }, nil } +func (c *Client) revokeToken(ctx context.Context) error { + tok, err := c.appUser.Token(ctx, "Google") + if err != nil { + return err + } + + httpClient := urlfetch.Client(ctx) + httpClient.Transport = retry.NewTransport(httpClient.Transport) + + url := "https://accounts.google.com/o/oauth2/revoke?token=" + url.QueryEscape(tok.AccessToken) + res, err := httpClient.Get(url) + if err != nil { + return fmt.Errorf("GET %s: %v", url, err) + } + defer res.Body.Close() + + if res.StatusCode != http.StatusOK { + if data, err := ioutil.ReadAll(res.Body); err == nil { + return fmt.Errorf("GET %s: %s", url, data) + } else { + return fmt.Errorf("GET %s: %s", url, res.Status) + } + } + + return nil +} + func (c *Client) DeleteToken(ctx context.Context) error { + if err := c.revokeToken(ctx); err != nil { + log.Warningf(ctx, "revokeToken() = %v", err) + } + return c.appUser.DeleteToken(ctx, "Google") } @@ -119,28 +153,8 @@ func DataStreamID(dataSource *fitness.DataSource) string { return strings.Join(fields, ":") } -func wrapGoogleError(err error) error { - if err == nil { - return nil - } - - if gerr, ok := err.(*googleapi.Error); ok && gerr.Code >= 400 && gerr.Code < 500 { - return retry.Abort(err) - } - - return err -} - func (c *Client) DataSourceCreate(ctx context.Context, dataSource *fitness.DataSource) (string, error) { - var dataStreamID string - err := retry.Do(ctx, func(ctx context.Context) error { - res, err := c.Service.Users.DataSources.Create(userID, dataSource).Context(ctx).Do() - if err != nil { - return wrapGoogleError(err) - } - dataStreamID = res.DataStreamId - return nil - }) + res, err := c.Service.Users.DataSources.Create(userID, dataSource).Context(ctx).Do() if err != nil { if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == http.StatusConflict { if dataSource.DataStreamId != "" { @@ -148,29 +162,20 @@ func (c *Client) DataSourceCreate(ctx context.Context, dataSource *fitness.DataS } return DataStreamID(dataSource), nil } - log.Errorf(ctx, "c.Service.Users.DataSources.Create(%q) = %v", DataStreamID(dataSource), err) - return "", err + return "", fmt.Errorf("DataSources.Create(%q) = %v", DataStreamID(dataSource), err) } - return dataStreamID, nil + + return res.DataStreamId, nil } -func (c *Client) DatasetGet(ctx context.Context, dataStreamID string, startTime, endTime time.Time) (*fitness.Dataset, error) { +func (c *Client) DatasetGet(ctx context.Context, dataSourceID string, startTime, endTime time.Time) (*fitness.Dataset, error) { datasetID := fmt.Sprintf("%d-%d", startTime.UnixNano(), endTime.UnixNano()) - var dataset *fitness.Dataset - err := retry.Do(ctx, func(ctx context.Context) error { - res, err := c.Service.Users.DataSources.Datasets.Get(userID, dataStreamID, datasetID).Context(ctx).Do() - if err != nil { - return wrapGoogleError(err) - } - dataset = res - return nil - }) + res, err := c.Service.Users.DataSources.Datasets.Get(userID, dataSourceID, datasetID).Context(ctx).Do() if err != nil { - log.Errorf(ctx, "c.Service.Users.DataSources.Datasets.Get(%q, %q) = %v", dataStreamID, datasetID, err) - return nil, err + return nil, fmt.Errorf("DataSources.Datasets.Get(%q, %q) = %v", dataSourceID, datasetID, err) } - return dataset, nil + return res, nil } func (c *Client) DatasetPatch(ctx context.Context, dataSourceID string, points []*fitness.DataPoint) error { @@ -192,12 +197,9 @@ func (c *Client) DatasetPatch(ctx context.Context, dataSourceID string, points [ Point: points, } - err := retry.Do(ctx, func(ctx context.Context) error { - _, err := c.Service.Users.DataSources.Datasets.Patch(userID, dataSourceID, datasetID, dataset).Context(ctx).Do() - return wrapGoogleError(err) - }) + _, err := c.Service.Users.DataSources.Datasets.Patch(userID, dataSourceID, datasetID, dataset).Context(ctx).Do() if err != nil { - log.Errorf(ctx, "c.Service.Users.DataSources.Datasets.Patch() = %v", err) + log.Errorf(ctx, "DataSources.Datasets.Patch(%q, %q) = %v", dataSourceID, datasetID, err) return err } return nil @@ -281,6 +283,7 @@ func (a Activity) String() string { func (c *Client) SetActivities(ctx context.Context, activities []Activity, startOfDay time.Time) error { if len(activities) == 0 { + log.Debugf(ctx, "SetActivities(): len(activities) == 0") return nil } @@ -334,9 +337,11 @@ Next: } if len(dataPoints) == 0 { + log.Debugf(ctx, "SetActivities(): len(dataPoints) == 0") return nil } + log.Debugf(ctx, "SetActivities(): calling c.DatasetPatch(%q)", dataStreamID) return c.DatasetPatch(ctx, dataStreamID, dataPoints) }