mirror of
https://github.com/sstent/go-garth.git
synced 2026-01-25 16:42:28 +00:00
90 lines
2.4 KiB
Go
90 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/joho/godotenv"
|
|
"github.com/sstent/go-garth"
|
|
)
|
|
|
|
func main() {
|
|
// Load environment variables from .env file (robust path handling)
|
|
var envPath string
|
|
if _, err := os.Stat("../../.env"); err == nil {
|
|
envPath = "../../.env"
|
|
} else if _, err := os.Stat("../../../.env"); err == nil {
|
|
envPath = "../../../.env"
|
|
} else {
|
|
envPath = ".env"
|
|
}
|
|
|
|
if err := godotenv.Load(envPath); err != nil {
|
|
log.Println("Note: Using system environment variables (no .env file found)")
|
|
}
|
|
|
|
// Get credentials from environment
|
|
username := os.Getenv("GARMIN_USERNAME")
|
|
password := os.Getenv("GARMIN_PASSWORD")
|
|
if username == "" || password == "" {
|
|
log.Fatal("GARMIN_USERNAME or GARMIN_PASSWORD not set in environment")
|
|
}
|
|
|
|
// Create context with timeout
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
// Create token storage and authenticator
|
|
storage := garth.NewMemoryStorage()
|
|
auth := garth.NewAuthenticator(garth.ClientOptions{
|
|
Storage: storage,
|
|
TokenURL: "https://connectapi.garmin.com/oauth-service/oauth/token",
|
|
Timeout: 30 * time.Second,
|
|
})
|
|
|
|
// Authenticate
|
|
token, err := auth.Login(ctx, username, password, "")
|
|
if err != nil {
|
|
log.Fatalf("Authentication failed: %v", err)
|
|
}
|
|
log.Printf("Authenticated successfully! Token expires at: %s", token.Expiry.Format(time.RFC3339))
|
|
|
|
// Create HTTP client with authentication transport
|
|
httpClient := &http.Client{
|
|
Transport: garth.NewAuthTransport(auth.(*garth.GarthAuthenticator), storage, nil),
|
|
}
|
|
|
|
// Create API client
|
|
apiClient := garth.NewAPIClient("https://connectapi.garmin.com", httpClient)
|
|
|
|
// Create activity service
|
|
activityService := garth.NewActivityService(apiClient)
|
|
|
|
// List last 20 activities
|
|
activities, err := activityService.List(ctx, garth.ActivityListOptions{
|
|
Limit: 20,
|
|
})
|
|
if err != nil {
|
|
log.Fatalf("Failed to get activities: %v", err)
|
|
}
|
|
|
|
// Print activities
|
|
fmt.Println("\nLast 20 Activities:")
|
|
fmt.Println("=======================================")
|
|
for i, activity := range activities {
|
|
fmt.Printf("%d. %s [%s] - %s\n", i+1,
|
|
activity.Name,
|
|
activity.Type,
|
|
activity.StartTime.Format("2006-01-02 15:04"))
|
|
fmt.Printf(" Distance: %.2f km, Duration: %.0f min\n\n",
|
|
activity.Distance/1000,
|
|
activity.Duration/60)
|
|
}
|
|
|
|
fmt.Println("Example completed successfully!")
|
|
}
|