This commit is contained in:
2025-08-07 18:52:21 -07:00
parent f41316c8cf
commit 3dc3ec5c5c
15 changed files with 826 additions and 295 deletions

102
cmd/list.go Normal file
View File

@@ -0,0 +1,102 @@
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"
)
// 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 {
// Get flag values
listAll, _ := cmd.Flags().GetBool("all")
listMissing, _ := cmd.Flags().GetBool("missing")
listDownloaded, _ := cmd.Flags().GetBool("downloaded")
// 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
db, err := db.NewDatabase(cfg.DatabasePath)
if err != nil {
return fmt.Errorf("failed to connect to database: %w", err)
}
defer db.Close()
// Get activities from database with pagination
page := 1
pageSize := 20
for {
var filteredActivities []garmin.Activity
var err error
if listAll {
filteredActivities, err = db.GetAllPaginated(page, pageSize)
} else if listMissing {
filteredActivities, err = db.GetMissingPaginated(page, pageSize)
} else if listDownloaded {
filteredActivities, err = db.GetDownloadedPaginated(page, pageSize)
}
if err != nil {
return fmt.Errorf("failed to get activities: %w", err)
}
if len(filteredActivities) == 0 {
break
}
// Print activities for current page
for _, activity := range filteredActivities {
fmt.Printf("Activity ID: %d, Start Time: %s, Filename: %s\n",
activity.ActivityId, activity.StartTime.Format("2006-01-02 15:04:05"), activity.Filename)
}
// Prompt to continue or quit
fmt.Printf("\nPage %d - Show more? (y/n): ", page)
var response string
fmt.Scanln(&response)
if strings.ToLower(response) != "y" {
break
}
page++
}
return nil
},
}
func init() {
// Ensure rootCmd is properly initialized before adding subcommands
if rootCmd == nil {
panic("rootCmd must be initialized before adding subcommands")
}
listCmd.Flags().Bool("all", false, "List all activities")
listCmd.Flags().Bool("missing", false, "List activities that have not been downloaded")
listCmd.Flags().Bool("downloaded", false, "List activities that have been downloaded")
listCmd.MarkFlagsMutuallyExclusive("all", "missing", "downloaded")
listCmd.MarkFlagsRequiredAtLeastOne("all", "missing", "downloaded")
rootCmd.AddCommand(listCmd)
}