package fitbit import ( "context" "encoding/json" "fmt" "net/http" "time" "golang.org/x/oauth2" oauth2fitbit "golang.org/x/oauth2/fitbit" ) var oauth2Config = &oauth2.Config{ ClientID: "@FITBIT_CLIENT_ID@", ClientSecret: "@FITBIT_CLIENT_SECRET@", Endpoint: oauth2fitbit.Endpoint, RedirectURL: "https://fitbit-gfit-sync.appspot.com/fitbit/grant", Scopes: []string{"activity"}, } type Activity struct { ActivityID int `json:"activityId"` ActivityParentID int `json:"activityParentId"` Calories int `json:"calories"` Description string `json:"description"` Distance float64 `json:"distance"` Duration int `json:"duration"` HasStartTime bool `json:"hasStartTime"` IsFavorite bool `json:"isFavorite"` LogID int `json:"logId"` Name string `json:"name"` StartTime string `json:"startTime"` Steps int `json:"steps"` } type Distance struct { Activity string `json:"activity"` Distance float64 `json:"distance"` } type ActivitySummary struct { Activities []Activity `json:"activities"` Goals struct { CaloriesOut int `json:"caloriesOut"` Distance float64 `json:"distance"` Floors int `json:"floors"` Steps int `json:"steps"` } `json:"goals"` Summary struct { ActivityCalories int `json:"activityCalories"` CaloriesBMR int `json:"caloriesBMR"` CaloriesOut int `json:"caloriesOut"` MarginalCalories int `json:"marginalCalories"` Distances []Distance `json:"distances"` Elevation float64 `json:"elevation"` Floors int `json:"floors"` Steps int `json:"steps"` SedentaryMinutes int `json:"sedentaryMinutes"` LightlyActiveMinutes int `json:"lightlyActiveMinutes"` FairlyActiveMinutes int `json:"fairlyActiveMinutes"` VeryActiveMinutes int `json:"veryActiveMinutes"` } `json:"summary"` } type Client struct { userID string client *http.Client } func NewClient(ctx context.Context, userID string, tok *oauth2.Token) *Client { return &Client{ userID: userID, client: oauth2Config.Client(ctx, tok), } } func (c *Client) ActivitySummary(t time.Time) (*ActivitySummary, error) { url := fmt.Sprintf("https://api.fitbit.com/1/user/%s/activity/date/%s.json", c.userID, t.Format("2006-01-02")) res, err := c.client.Get(url) if err != nil { return nil, err } defer res.Body.Close() var summary ActivitySummary if err := json.NewDecoder(res.Body).Decode(&summary); err != nil { return nil, err } return &summary, nil }