Documentation ¶
Index ¶
- Constants
- func ActivitiesIter(res <-chan *ActivityResult, iter ActivityIterFunc) error
- func Endpoint() oauth2.Endpoint
- func NewWebhookHandler(sub WebhookSubscriber) http.Handler
- type APIOption
- type Achievement
- type Activity
- type ActivityIterFunc
- type ActivityProfile
- type ActivityResult
- type ActivityService
- func (s *ActivityService) Activities(ctx context.Context, spec activity.Pagination, opts ...APIOption) <-chan *ActivityResult
- func (s *ActivityService) Activity(ctx context.Context, activityID int64, streams ...string) (*Activity, error)
- func (s *ActivityService) Export(ctx context.Context, activityID int64) (*activity.Export, error)
- func (s *ActivityService) Photos(ctx context.Context, activityID int64, size int) ([]*Photo, error)
- func (s *ActivityService) Status(ctx context.Context, uploadID int64) (*Upload, error)
- func (s *ActivityService) StreamSets() map[string]string
- func (s *ActivityService) Streams(ctx context.Context, activityID int64, streams ...string) (*Streams, error)
- func (s *ActivityService) Update(ctx context.Context, act *UpdatableActivity) (*Activity, error)
- func (s *ActivityService) Upload(ctx context.Context, file *activity.File) (*Upload, error)
- type Athlete
- type AthleteService
- type AuthService
- type BoolStream
- type Client
- type Club
- type CoordinateStream
- type Coordinates
- type Error
- type Fault
- type FitnessProfile
- type Gear
- type HighlightedKudosers
- type Lap
- type LengthStream
- type Map
- type MetaActivity
- type Option
- func WithAutoRefresh(ctx context.Context) Option
- func WithBaseURL(baseURL string) Option
- func WithClientCredentials(clientID, clientSecret string) Option
- func WithConfig(config oauth2.Config) Option
- func WithHTTPClient(client *http.Client) Option
- func WithHTTPTracing(debug bool) Option
- func WithRateLimiter(r *rate.Limiter) Option
- func WithToken(token *oauth2.Token) Option
- func WithTokenCredentials(accessToken, refreshToken string, expiry time.Time) Option
- func WithTransport(t http.RoundTripper) Option
- type PREffort
- type Photo
- type Photos
- type Route
- type RouteService
- type Segment
- type SegmentEffort
- type SegmentStats
- type SpeedStream
- type SplitsMetric
- type Stats
- type Stream
- type StreamMetadata
- type Streams
- type Totals
- type TrainingDate
- type TrainingLoad
- type UpdatableActivity
- type Upload
- type UploadResult
- type WebhookAcknowledgement
- type WebhookMessage
- type WebhookService
- type WebhookSubscriber
- type WebhookSubscription
Constants ¶
const (
// PageSize default for querying bulk entities (eg activities, routes)
PageSize = 100
)
Variables ¶
This section is empty.
Functions ¶
func ActivitiesIter ¶ added in v0.3.1
func ActivitiesIter(res <-chan *ActivityResult, iter ActivityIterFunc) error
ActivitiesIter executes the iter function over the results of the channel
func NewWebhookHandler ¶
func NewWebhookHandler(sub WebhookSubscriber) http.Handler
NewWebhookHandler returns a http.Handler for servicing webhook requests
Types ¶
type APIOption ¶ added in v0.3.0
APIOption for configuring API requests
func WithDateRange ¶ added in v0.3.0
WithDateRange sets the before and after date range
type Achievement ¶
type Achievement struct { Rank int `json:"rank"` Type string `json:"type"` TypeID int `json:"type_id"` }
Achievement .
type Activity ¶
type Activity struct { ID int64 `json:"id"` ResourceState int `json:"resource_state"` ExternalID string `json:"external_id"` UploadID int64 `json:"upload_id"` Athlete *Athlete `json:"athlete"` Name string `json:"name"` Hidden bool `json:"hide_from_home"` Distance unit.Length `json:"distance" units:"m"` MovingTime unit.Duration `json:"moving_time" units:"s"` ElapsedTime unit.Duration `json:"elapsed_time" units:"s"` ElevationGain unit.Length `json:"total_elevation_gain" units:"m"` Type string `json:"type"` SportType string `json:"sport_type"` StartDate time.Time `json:"start_date"` StartDateLocal time.Time `json:"start_date_local"` Timezone string `json:"timezone"` UTCOffset float64 `json:"utc_offset"` StartLatlng Coordinates `json:"start_latlng"` EndLatlng Coordinates `json:"end_latlng"` LocationCity string `json:"location_city"` LocationState string `json:"location_state"` LocationCountry string `json:"location_country"` AchievementCount int `json:"achievement_count"` KudosCount int `json:"kudos_count"` CommentCount int `json:"comment_count"` AthleteCount int `json:"athlete_count"` PhotoCount int `json:"photo_count"` Map *Map `json:"map"` Trainer bool `json:"trainer"` Commute bool `json:"commute"` Manual bool `json:"manual"` Private bool `json:"private"` Flagged bool `json:"flagged"` GearID string `json:"gear_id"` FromAcceptedTag bool `json:"from_accepted_tag"` AverageSpeed unit.Speed `json:"average_speed" units:"mps"` MaxSpeed unit.Speed `json:"max_speed" units:"mps"` AverageCadence float64 `json:"average_cadence"` AverageTemperature float64 `json:"average_temp" units:"C"` AverageWatts float64 `json:"average_watts"` WeightedAverageWatts int `json:"weighted_average_watts"` Kilojoules float64 `json:"kilojoules"` DeviceWatts bool `json:"device_watts"` HasHeartrate bool `json:"has_heartrate"` MaxWatts int `json:"max_watts"` ElevationHigh unit.Length `json:"elev_high" units:"m"` ElevationLow unit.Length `json:"elev_low" units:"m"` PRCount int `json:"pr_count"` TotalPhotoCount int `json:"total_photo_count"` HasKudoed bool `json:"has_kudoed"` WorkoutType int `json:"workout_type"` SufferScore float64 `json:"suffer_score"` Description string `json:"description"` PrivateNote string `json:"private_note"` Calories float64 `json:"calories"` SegmentEfforts []*SegmentEffort `json:"segment_efforts,omitempty"` SplitsMetric []*SplitsMetric `json:"splits_metric,omitempty"` Laps []*Lap `json:"laps,omitempty"` Gear *Gear `json:"gear,omitempty"` Photos *Photos `json:"photos,omitempty"` HighlightedKudosers []*HighlightedKudosers `json:"highlighted_kudosers,omitempty"` DeviceName string `json:"device_name"` EmbedToken string `json:"embed_token"` SegmentLeaderboardOptOut bool `json:"segment_leaderboard_opt_out"` LeaderboardOptOut bool `json:"leaderboard_opt_out"` PerceivedExertion float64 `json:"perceived_exertion"` PreferPerceivedExertion bool `json:"prefer_perceived_exertion"` Streams *Streams `json:"streams,omitempty"` }
Activity represents an activity
type ActivityIterFunc ¶
ActivityIterFunc is called for each activity in the results
type ActivityProfile ¶
type ActivityResult ¶
ActivityResult is the result of querying for a stream of activities
type ActivityService ¶
type ActivityService service
ActivityService is the API for activity endpoints
func (*ActivityService) Activities ¶
func (s *ActivityService) Activities(ctx context.Context, spec activity.Pagination, opts ...APIOption) <-chan *ActivityResult
Activities returns a channel for activities and errors for an athlete
func (*ActivityService) Activity ¶
func (s *ActivityService) Activity(ctx context.Context, activityID int64, streams ...string) (*Activity, error)
Activity returns the activity specified by id
func (*ActivityService) Photos ¶
Photos returns the metadata (not the photo itself) for an activity Size can be (0, 64, 1024, 2048)
func (*ActivityService) Status ¶
Status returns the status of an upload request
More information can be found at https://developers.strava.com/docs/uploads/
func (*ActivityService) StreamSets ¶
func (s *ActivityService) StreamSets() map[string]string
StreamSets returns the list of valid stream names
func (*ActivityService) Streams ¶
func (s *ActivityService) Streams(ctx context.Context, activityID int64, streams ...string) (*Streams, error)
Streams returns the activity's data streams
func (*ActivityService) Update ¶ added in v0.7.0
func (s *ActivityService) Update(ctx context.Context, act *UpdatableActivity) (*Activity, error)
Update the given activity owned by the authenticated athlete
func (*ActivityService) Upload ¶
Upload the file for the user
More information can be found at https://developers.strava.com/docs/uploads/
type Athlete ¶
type Athlete struct { ID int `json:"id"` Username string `json:"username"` ResourceState int `json:"resource_state"` Firstname string `json:"firstname"` Lastname string `json:"lastname"` City string `json:"city"` State string `json:"state"` Country string `json:"country"` Sex string `json:"sex"` Premium bool `json:"premium"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` BadgeTypeID int `json:"badge_type_id"` ProfileMedium string `json:"profile_medium"` Profile string `json:"profile"` Friend any `json:"friend"` Follower any `json:"follower"` FollowerCount int `json:"follower_count"` FriendCount int `json:"friend_count"` MutualFriendCount int `json:"mutual_friend_count"` AthleteType int `json:"athlete_type"` DatePreference string `json:"date_preference"` MeasurementPreference string `json:"measurement_preference"` Clubs []*Club `json:"clubs"` FTP float64 `json:"ftp"` Weight unit.Mass `json:"weight" units:"kg"` Bikes []*Gear `json:"bikes"` Shoes []*Gear `json:"shoes"` }
Athlete represents a Strava athlete
type AthleteService ¶
type AthleteService service
AthleteService is the API for athlete endpoints
type BoolStream ¶
type BoolStream struct { StreamMetadata Data []bool `json:"data"` }
BoolStream of data from an activity
type Client ¶
type Client struct { Auth *AuthService Route *RouteService Webhook *WebhookService Athlete *AthleteService Activity *ActivityService // contains filtered or unexported fields }
Client for accessing Strava's API
type Club ¶
type Club struct { Admin bool `json:"admin"` City string `json:"city"` Country string `json:"country"` CoverPhoto string `json:"cover_photo"` CoverPhotoSmall string `json:"cover_photo_small"` Featured bool `json:"featured"` ID int `json:"id"` MemberCount int `json:"member_count"` Membership string `json:"membership"` Name string `json:"name"` Owner bool `json:"owner"` Private bool `json:"private"` Profile string `json:"profile"` ProfileMedium string `json:"profile_medium"` ResourceState int `json:"resource_state"` SportType string `json:"sport_type"` State string `json:"state"` URL string `json:"url"` Verified bool `json:"verified"` }
Club in which an athlete can be a member
type CoordinateStream ¶
type CoordinateStream struct { StreamMetadata Data []Coordinates `json:"data"` }
CoordinateStream of data from an activity
type Error ¶
type Error struct { Resource string `json:"resource"` Field string `json:"field"` Code string `json:"code"` }
Error is an error from the Strava API
type Fault ¶
type Fault struct { Code int `json:"code"` Message string `json:"message"` Errors []*Error `json:"errors"` }
Fault contains errors
type FitnessProfile ¶
type Gear ¶
type Gear struct { ID string `json:"id"` Primary bool `json:"primary"` Name string `json:"name"` ResourceState int `json:"resource_state"` Distance unit.Length `json:"distance" units:"m"` AthleteID int `json:"athlete_id"` }
Gear represents gear used by the athlete
type HighlightedKudosers ¶
type HighlightedKudosers struct { DestinationURL string `json:"destination_url"` DisplayName string `json:"display_name"` AvatarURL string `json:"avatar_url"` ShowName bool `json:"show_name"` }
HighlightedKudosers .
type Lap ¶
type Lap struct { ID int64 `json:"id"` ResourceState int `json:"resource_state"` Name string `json:"name"` Activity *Activity `json:"activity"` Athlete *Athlete `json:"athlete"` ElapsedTime unit.Duration `json:"elapsed_time" units:"s"` MovingTime unit.Duration `json:"moving_time" units:"s"` StartDate time.Time `json:"start_date"` StartDateLocal time.Time `json:"start_date_local"` Distance unit.Length `json:"distance" units:"m"` StartIndex int `json:"start_index"` EndIndex int `json:"end_index"` TotalElevationGain unit.Length `json:"total_elevation_gain" units:"m"` AverageSpeed unit.Speed `json:"average_speed" units:"mps"` MaxSpeed unit.Speed `json:"max_speed" units:"mps"` AverageCadence float64 `json:"average_cadence"` DeviceWatts bool `json:"device_watts"` AverageWatts float64 `json:"average_watts"` LapIndex int `json:"lap_index"` Split int `json:"split"` }
Lap data
type LengthStream ¶
type LengthStream struct { StreamMetadata Data []unit.Length `json:"data" units:"m"` }
LengthStream of data from an activity
type Map ¶
type Map struct { ID string `json:"id"` Polyline string `json:"polyline"` ResourceState int `json:"resource_state"` SummaryPolyline string `json:"summary_polyline"` }
Map of the activity or route
func (*Map) LineString ¶
LineString of the map This function first checks for a Polyline and then a SummaryPolyline, returning the first non-nil LineString
type MetaActivity ¶
MetaActivity .
type Option ¶
Option provides a configuration mechanism for a Client
func WithAutoRefresh ¶
WithAutoRefresh refreshes access tokens automatically. The order of this option matters because it is dependent on the client's config and token. Use this option after With*Credentials.
func WithClientCredentials ¶
WithAPICredentials provides the client api credentials for the application.
func WithConfig ¶
WithConfig sets the underlying oauth2.Config.
func WithHTTPClient ¶
WithHTTPClient sets the underlying http client.
func WithHTTPTracing ¶
WithHTTPTracing enables tracing http calls.
func WithRateLimiter ¶
WithRateLimiter rate limits the client's api calls
func WithTokenCredentials ¶
WithTokenCredentials provides the tokens for an authenticated user.
func WithTransport ¶
func WithTransport(t http.RoundTripper) Option
WithTransport sets the underlying http client transport.
type PREffort ¶
type PREffort struct { Distance unit.Length `json:"distance" units:"m"` StartDateLocal time.Time `json:"start_date_local"` ActivityID int `json:"activity_id"` ElapsedTime unit.Duration `json:"elapsed_time" units:"s"` IsKOM bool `json:"is_kom"` ID int `json:"id"` StartDate time.Time `json:"start_date"` }
PREffort for the segment
type Photo ¶
type Photo struct { ID int64 `json:"id"` UniqueID string `json:"unique_id"` AthleteID int `json:"athlete_id"` ActivityID int64 `json:"activity_id"` ActivityName string `json:"activity_name"` PostID int64 `json:"post_id"` ResourceState int `json:"resource_state"` Ref string `json:"ref"` UID string `json:"uid"` Caption string `json:"caption"` Type string `json:"type"` Source int `json:"source"` UploadedAt time.Time `json:"uploaded_at"` CreatedAt time.Time `json:"created_at"` CreatedAtLocal time.Time `json:"created_at_local"` URLs map[string]string `json:"urls"` Sizes map[string][]int `json:"sizes"` DefaultPhoto bool `json:"default_photo"` Location []float64 `json:"location"` }
Photo metadata for activity and post photos
type Photos ¶
type Photos struct { Primary struct { ID int64 `json:"id"` UniqueID string `json:"unique_id"` URLs map[string]string `json:"urls"` Source int `json:"source"` } `json:"primary"` UsePrimaryPhoto bool `json:"use_primary_photo"` Count int `json:"count"` }
Photos for an activity
type Route ¶
type Route struct { Private bool `json:"private"` Distance unit.Length `json:"distance" units:"m"` Athlete *Athlete `json:"athlete"` Description string `json:"description"` CreatedAt time.Time `json:"created_at"` ElevationGain unit.Length `json:"elevation_gain" units:"m"` Type int `json:"type"` EstimatedMovingTime unit.Duration `json:"estimated_moving_time" units:"s"` Segments []*Segment `json:"segments"` Starred bool `json:"starred"` UpdatedAt time.Time `json:"updated_at"` SubType int `json:"sub_type"` IDString string `json:"id_str"` Name string `json:"name"` ID int64 `json:"id"` Map *Map `json:"map"` Timestamp int `json:"timestamp"` }
Route is a planned activity
type RouteService ¶
type RouteService service
RouteService is the API for route endpoints
func (*RouteService) Routes ¶
func (s *RouteService) Routes(ctx context.Context, athleteID int, spec activity.Pagination) ([]*Route, error)
Routes returns a page of routes for an athlete
type Segment ¶
type Segment struct { ID int `json:"id"` ResourceState int `json:"resource_state"` Name string `json:"name"` ActivityType string `json:"activity_type"` Distance unit.Length `json:"distance" units:"m"` AverageGrade float64 `json:"average_grade"` MaximumGrade float64 `json:"maximum_grade"` ElevationHigh unit.Length `json:"elevation_high" units:"m"` ElevationLow unit.Length `json:"elevation_low" units:"m"` StartLatlng Coordinates `json:"start_latlng"` EndLatlng Coordinates `json:"end_latlng"` ClimbCategory int `json:"climb_category"` City string `json:"city"` State string `json:"state"` Country string `json:"country"` Private bool `json:"private"` Hazardous bool `json:"hazardous"` Starred bool `json:"starred"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` ElevationGain unit.Length `json:"total_elevation_gain" units:"m"` Map *Map `json:"map"` EffortCount int `json:"effort_count"` AthleteCount int `json:"athlete_count"` StarCount int `json:"star_count"` PREffort *PREffort `json:"athlete_pr_effort"` AthleteSegmentStats *SegmentStats `json:"athlete_segment_stats"` }
Segment .
type SegmentEffort ¶
type SegmentEffort struct { ID int64 `json:"id"` ResourceState int `json:"resource_state"` Name string `json:"name"` Activity *MetaActivity `json:"activity"` Athlete *Athlete `json:"athlete"` ElapsedTime unit.Duration `json:"elapsed_time" units:"s"` MovingTime unit.Duration `json:"moving_time" units:"s"` StartDate time.Time `json:"start_date"` StartDateLocal time.Time `json:"start_date_local"` Distance unit.Length `json:"distance" units:"m"` StartIndex int `json:"start_index"` EndIndex int `json:"end_index"` AverageCadence float64 `json:"average_cadence"` DeviceWatts bool `json:"device_watts"` AverageWatts float64 `json:"average_watts"` Segment *Segment `json:"segment"` KOMRank int `json:"kom_rank"` PRRank int `json:"pr_rank"` Achievements []*Achievement `json:"achievements"` Hidden bool `json:"hidden"` }
SegmentEffort .
type SegmentStats ¶
type SegmentStats struct { PRElapsedTime unit.Duration `json:"pr_elapsed_time" units:"s"` PRDate time.Time `json:"pr_date"` EffortCount int `json:"effort_count"` PRActivityID int `json:"pr_activity_id"` }
SegmentStats for the segment
type SpeedStream ¶
type SpeedStream struct { StreamMetadata Data []unit.Speed `json:"data" units:"mps"` }
SpeedStream of data from an activity
type SplitsMetric ¶
type SplitsMetric struct { Distance unit.Length `json:"distance" units:"m"` ElapsedTime unit.Duration `json:"elapsed_time" units:"s"` ElevationDifference unit.Length `json:"elevation_difference" units:"m"` MovingTime unit.Duration `json:"moving_time" units:"s"` Split int `json:"split"` AverageSpeed float64 `json:"average_speed"` PaceZone int `json:"pace_zone"` }
SplitsMetric .
type Stats ¶
type Stats struct { RecentRunTotals *Totals `json:"recent_run_totals"` AllRunTotals *Totals `json:"all_run_totals"` RecentSwimTotals *Totals `json:"recent_swim_totals"` BiggestRideDistance unit.Length `json:"biggest_ride_distance" units:"m"` YTDSwimTotals *Totals `json:"ytd_swim_totals"` AllSwimTotals *Totals `json:"all_swim_totals"` RecentRideTotals *Totals `json:"recent_ride_totals"` BiggestClimbElevationGain unit.Length `json:"biggest_climb_elevation_gain" units:"m"` YTDRideTotals *Totals `json:"ytd_ride_totals"` AllRideTotals *Totals `json:"all_ride_totals"` YTDRunTotals *Totals `json:"ytd_run_totals"` }
Stats for the athlete
type Stream ¶
type Stream struct { StreamMetadata Data []float64 `json:"data"` }
Stream of data from an activity
type StreamMetadata ¶
type StreamMetadata struct { OriginalSize int `json:"original_size"` Resolution string `json:"resolution"` SeriesType string `json:"series_type"` }
StreamMetadata for the stream
type Streams ¶
type Streams struct { ActivityID int64 `json:"activity_id"` LatLng *CoordinateStream `json:"latlng,omitempty"` Elevation *LengthStream `json:"altitude,omitempty"` Time *Stream `json:"time,omitempty"` Distance *LengthStream `json:"distance,omitempty"` Velocity *SpeedStream `json:"velocity_smooth,omitempty"` HeartRate *Stream `json:"heartrate,omitempty"` Cadence *Stream `json:"cadence,omitempty"` Watts *Stream `json:"watts,omitempty"` Temperature *Stream `json:"temp,omitempty"` Moving *BoolStream `json:"moving,omitempty"` Grade *Stream `json:"grade_smooth,omitempty"` }
Streams of data available for an activity, not all activities will have all streams
type Totals ¶
type Totals struct { Distance unit.Length `json:"distance" units:"m"` AchievementCount int `json:"achievement_count"` Count int `json:"count"` ElapsedTime unit.Duration `json:"elapsed_time" units:"s"` ElevationGain unit.Length `json:"elevation_gain" units:"m"` MovingTime unit.Duration `json:"moving_time" units:"s"` }
Totals for stats
type TrainingDate ¶
type TrainingLoad ¶
type TrainingLoad struct { TrainingDate *TrainingDate `json:"date"` FitnessProfile *FitnessProfile `json:"fitness_profile"` Activities []*ActivityProfile `json:"activities"` }
type UpdatableActivity ¶ added in v0.7.0
type UpdatableActivity struct { ID int64 `json:"id"` Commute *bool `json:"commute,omitempty"` Trainer *bool `json:"trainer,omitempty"` Hidden *bool `json:"hide_from_home,omitempty"` Description *string `json:"description,omitempty"` Name *string `json:"name,omitempty"` SportType *string `json:"sport_type,omitempty"` GearID *string `json:"gear_id,omitempty"` }
UpdatableActivity represents an activity with updatable attributes
type Upload ¶
type Upload struct { ID int64 `json:"id"` IDString string `json:"id_str"` ExternalID string `json:"external_id"` Error string `json:"error"` Status string `json:"status"` ActivityID int64 `json:"activity_id"` }
Upload is the state representation of an uploaded activity
func (*Upload) Identifier ¶
type UploadResult ¶
UploadResult is the result of polling for upload status
type WebhookAcknowledgement ¶
type WebhookAcknowledgement struct {
ID int64 `json:"id"`
}
WebhookAcknowledgement is the ack from Strava a webhook subscription has been received
type WebhookMessage ¶
type WebhookMessage struct { ObjectType string `json:"object_type"` ObjectID int64 `json:"object_id"` AspectType string `json:"aspect_type"` OwnerID int `json:"owner_id"` SubscriptionID int64 `json:"subscription_id"` EventTime int `json:"event_time"` Updates map[string]string `json:"updates"` }
WebhookMessage is the incoming webhook message
type WebhookService ¶
type WebhookService service
WebhookService is the API for webhook endpoints
func (*WebhookService) List ¶
func (s *WebhookService) List(ctx context.Context) ([]*WebhookSubscription, error)
List active webhook subscriptions
func (*WebhookService) Subscribe ¶
func (s *WebhookService) Subscribe(ctx context.Context, callbackURL, verifyToken string) (*WebhookAcknowledgement, error)
Subscribe to a webhook
func (*WebhookService) Unsubscribe ¶
func (s *WebhookService) Unsubscribe(ctx context.Context, subscriptionID int64) error
Unsubscribe to a webhook
type WebhookSubscriber ¶
type WebhookSubscriber interface { // SubscriptionRequest receives a callback during the subscription request flow SubscriptionRequest(challenge, verify string) error // MessageReceived is called every time a message is received from Strava MessageReceived(*WebhookMessage) error }
WebhookSubscriber provides callbacks on webhook messages
type WebhookSubscription ¶
type WebhookSubscription struct { ID int64 `json:"id"` ResourceState int `json:"resource_state"` ApplicationID int `json:"application_id"` CallbackURL string `json:"callback_url"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` }
WebhookSubscription describes the details of webhook subscription