mirror of
https://github.com/sstent/GarminSync.git
synced 2026-01-26 09:02:51 +00:00
112 lines
2.9 KiB
Go
112 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/sstent/garminsync/internal/config"
|
|
"github.com/sstent/garminsync/internal/db"
|
|
"github.com/sstent/garminsync/internal/garmin"
|
|
)
|
|
|
|
// Global flag variables for list command
|
|
var listAll bool
|
|
var listMissing bool
|
|
var listDownloaded bool
|
|
|
|
// listCmd represents the list command
|
|
var listCmd = &cobra.Command{
|
|
Use: "list",
|
|
Short: "List activities from Garmin Connect",
|
|
Long: `List activities with various filters:
|
|
- All activities
|
|
- Missing activities (not yet downloaded)
|
|
- Downloaded activities`,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
// Initialize config
|
|
cfg, err := config.LoadConfig()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to load config: %w", err)
|
|
}
|
|
|
|
// Sync database with Garmin Connect
|
|
if err := db.SyncActivities(cfg); err != nil {
|
|
return fmt.Errorf("database sync failed: %w", err)
|
|
}
|
|
|
|
// Initialize database
|
|
database, err := db.NewDatabase(cfg.DatabasePath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to connect to database: %w", err)
|
|
}
|
|
defer database.Close()
|
|
|
|
// Get activities from database with pagination
|
|
page := 1
|
|
pageSize := 20
|
|
for {
|
|
var filteredActivities []garmin.Activity
|
|
var err error
|
|
|
|
if listAll {
|
|
filteredActivities, err = database.GetAllPaginated(page, pageSize)
|
|
} else if listMissing {
|
|
filteredActivities, err = database.GetMissingPaginated(page, pageSize)
|
|
} else if listDownloaded {
|
|
filteredActivities, err = database.GetDownloadedPaginated(page, pageSize)
|
|
}
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get activities: %w", err)
|
|
}
|
|
|
|
if len(filteredActivities) == 0 {
|
|
if page == 1 {
|
|
fmt.Println("No activities found matching the criteria")
|
|
}
|
|
break
|
|
}
|
|
|
|
// Print activities for current page
|
|
for _, activity := range filteredActivities {
|
|
status := "❌ Not Downloaded"
|
|
if activity.Downloaded {
|
|
status = "✅ Downloaded"
|
|
}
|
|
fmt.Printf("ID: %d | %s | %s | %s\n",
|
|
activity.ActivityId,
|
|
activity.StartTime.Format("2006-01-02 15:04:05"),
|
|
activity.Filename,
|
|
status)
|
|
}
|
|
|
|
// Only prompt if there might be more results
|
|
if len(filteredActivities) == pageSize {
|
|
fmt.Printf("\nPage %d - Show more? (y/n): ", page)
|
|
var response string
|
|
fmt.Scanln(&response)
|
|
if strings.ToLower(response) != "y" {
|
|
break
|
|
}
|
|
page++
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
// Bind flags to global variables
|
|
listCmd.Flags().BoolVar(&listAll, "all", false, "List all activities")
|
|
listCmd.Flags().BoolVar(&listMissing, "missing", false, "List activities that have not been downloaded")
|
|
listCmd.Flags().BoolVar(&listDownloaded, "downloaded", false, "List activities that have been downloaded")
|
|
|
|
listCmd.MarkFlagsMutuallyExclusive("all", "missing", "downloaded")
|
|
listCmd.MarkFlagsRequiredAtLeastOne("all", "missing", "downloaded")
|
|
|
|
rootCmd.AddCommand(listCmd)
|
|
} |