fix: resolve build errors and implement missing health data types

- Fix various build errors in the CLI application.
- Implement missing health data types (VO2 Max, Heart Rate Zones).
- Corrected `tablewriter` usage from `SetHeader` to `Header`.
- Removed unused imports and fixed syntax errors.
This commit is contained in:
2025-09-19 05:19:02 -07:00
parent 47a179d215
commit c1993ba022
36 changed files with 878 additions and 405 deletions

View File

@@ -2,9 +2,9 @@ package garmin_test
import (
"encoding/json"
"garmin-connect/internal/api/client"
"garmin-connect/internal/data"
"garmin-connect/internal/testutils"
"go-garth/internal/api/client"
"go-garth/internal/data"
"go-garth/internal/testutils"
"testing"
"time"
)

View File

@@ -2,13 +2,13 @@ package garmin
import (
"fmt"
"os"
"path/filepath"
"time"
internalClient "garmin-connect/internal/api/client"
"garmin-connect/internal/types"
"garmin-connect/pkg/garmin/activities"
"garmin-connect/pkg/garmin/health"
"garmin-connect/pkg/garmin/stats"
internalClient "go-garth/internal/api/client"
"go-garth/internal/errors"
"go-garth/internal/types"
)
// Client is the main Garmin Connect client type
@@ -22,7 +22,7 @@ func NewClient(domain string) (*Client, error) {
if err != nil {
return nil, err
}
return &Client{Client: c},
return &Client{Client: c}, nil
}
// Login authenticates to Garmin Connect
@@ -45,8 +45,8 @@ func (c *Client) RefreshSession() error {
return c.Client.RefreshSession()
}
// GetActivities retrieves recent activities
func (c *Client) GetActivities(opts activities.ActivityOptions) ([]Activity, error) {
// ListActivities retrieves recent activities
func (c *Client) ListActivities(opts ActivityOptions) ([]Activity, error) {
// TODO: Map ActivityOptions to internalClient.Client.GetActivities parameters
// For now, just call the internal client's GetActivities with a dummy limit
internalActivities, err := c.Client.GetActivities(opts.Limit)
@@ -60,7 +60,7 @@ func (c *Client) GetActivities(opts activities.ActivityOptions) ([]Activity, err
ActivityID: act.ActivityID,
ActivityName: act.ActivityName,
ActivityType: act.ActivityType,
Starttime: act.Starttime,
StartTimeLocal: act.StartTimeLocal,
Distance: act.Distance,
Duration: act.Duration,
})
@@ -69,13 +69,13 @@ func (c *Client) GetActivities(opts activities.ActivityOptions) ([]Activity, err
}
// GetActivity retrieves details for a specific activity ID
func (c *Client) GetActivity(activityID int) (*activities.ActivityDetail, error) {
func (c *Client) GetActivity(activityID int) (*ActivityDetail, error) {
// TODO: Implement internalClient.Client.GetActivity
return nil, fmt.Errorf("not implemented")
}
// DownloadActivity downloads activity data
func (c *Client) DownloadActivity(activityID int, opts activities.DownloadOptions) error {
func (c *Client) DownloadActivity(activityID int, opts DownloadOptions) error {
// TODO: Determine file extension based on format
fileExtension := opts.Format
if fileExtension == "csv" {
@@ -133,45 +133,53 @@ func (c *Client) SearchActivities(query string) ([]Activity, error) {
}
// GetSleepData retrieves sleep data for a specified date range
func (c *Client) GetSleepData(startDate, endDate time.Time) ([]health.SleepData, error) {
// TODO: Implement internalClient.Client.GetSleepData
return nil, fmt.Errorf("not implemented")
func (c *Client) GetSleepData(startDate, endDate time.Time) ([]types.SleepData, error) {
return c.Client.GetSleepData(startDate, endDate)
}
// GetHrvData retrieves HRV data for a specified number of days
func (c *Client) GetHrvData(days int) ([]health.HrvData, error) {
// TODO: Implement internalClient.Client.GetHrvData
return nil, fmt.Errorf("not implemented")
func (c *Client) GetHrvData(days int) ([]types.HrvData, error) {
return c.Client.GetHrvData(days)
}
// GetStressData retrieves stress data
func (c *Client) GetStressData(startDate, endDate time.Time) ([]health.StressData, error) {
// TODO: Implement internalClient.Client.GetStressData
return nil, fmt.Errorf("not implemented")
func (c *Client) GetStressData(startDate, endDate time.Time) ([]types.StressData, error) {
return c.Client.GetStressData(startDate, endDate)
}
// GetBodyBatteryData retrieves Body Battery data
func (c *Client) GetBodyBatteryData(startDate, endDate time.Time) ([]health.BodyBatteryData, error) {
// TODO: Implement internalClient.Client.GetBodyBatteryData
return nil, fmt.Errorf("not implemented")
func (c *Client) GetBodyBatteryData(startDate, endDate time.Time) ([]types.BodyBatteryData, error) {
return c.Client.GetBodyBatteryData(startDate, endDate)
}
// GetStepsData retrieves steps data for a specified date range
func (c *Client) GetStepsData(startDate, endDate time.Time) ([]stats.StepsData, error) {
// TODO: Implement internalClient.Client.GetStepsData
return nil, fmt.Errorf("not implemented")
func (c *Client) GetStepsData(startDate, endDate time.Time) ([]types.StepsData, error) {
return c.Client.GetStepsData(startDate, endDate)
}
// GetDistanceData retrieves distance data for a specified date range
func (c *Client) GetDistanceData(startDate, endDate time.Time) ([]stats.DistanceData, error) {
// TODO: Implement internalClient.Client.GetDistanceData
return nil, fmt.Errorf("not implemented")
func (c *Client) GetDistanceData(startDate, endDate time.Time) ([]types.DistanceData, error) {
return c.Client.GetDistanceData(startDate, endDate)
}
// GetCaloriesData retrieves calories data for a specified date range
func (c *Client) GetCaloriesData(startDate, endDate time.Time) ([]stats.CaloriesData, error) {
// TODO: Implement internalClient.Client.GetCaloriesData
return nil, fmt.Errorf("not implemented")
func (c *Client) GetCaloriesData(startDate, endDate time.Time) ([]types.CaloriesData, error) {
return c.Client.GetCaloriesData(startDate, endDate)
}
// GetVO2MaxData retrieves VO2 max data for a specified date range
func (c *Client) GetVO2MaxData(startDate, endDate time.Time) ([]types.VO2MaxData, error) {
return c.Client.GetVO2MaxData(startDate, endDate)
}
// GetHeartRateZones retrieves heart rate zone data
func (c *Client) GetHeartRateZones() (*types.HeartRateZones, error) {
return c.Client.GetHeartRateZones()
}
// GetWellnessData retrieves comprehensive wellness data for a specified date range
func (c *Client) GetWellnessData(startDate, endDate time.Time) ([]types.WellnessData, error) {
return c.Client.GetWellnessData(startDate, endDate)
}
// OAuth1Token returns the OAuth1 token

View File

@@ -38,4 +38,42 @@ type BodyBatteryData struct {
Charge int `json:"charge"`
Drain int `json:"drain"`
// Add more fields as needed
}
// VO2MaxData represents VO2 max data
type VO2MaxData struct {
Date time.Time `json:"calendarDate"`
VO2MaxRunning float64 `json:"vo2MaxRunning"`
VO2MaxCycling float64 `json:"vo2MaxCycling"`
// Add more fields as needed
}
// HeartRateZones represents heart rate zone data
type HeartRateZones struct {
RestingHR int `json:"resting_hr"`
MaxHR int `json:"max_hr"`
LactateThreshold int `json:"lactate_threshold"`
Zones []HRZone `json:"zones"`
UpdatedAt time.Time `json:"updated_at"`
}
// HRZone represents a single heart rate zone
type HRZone struct {
Zone int `json:"zone"`
MinBPM int `json:"min_bpm"`
MaxBPM int `json:"max_bpm"`
Name string `json:"name"`
}
// WellnessData represents additional wellness metrics
type WellnessData struct {
Date time.Time `json:"calendarDate"`
RestingHR *int `json:"resting_hr"`
Weight *float64 `json:"weight"`
BodyFat *float64 `json:"body_fat"`
BMI *float64 `json:"bmi"`
BodyWater *float64 `json:"body_water"`
BoneMass *float64 `json:"bone_mass"`
MuscleMass *float64 `json:"muscle_mass"`
// Add more fields as needed
}

View File

@@ -4,9 +4,9 @@ import (
"testing"
"time"
"garmin-connect/internal/api/client"
"garmin-connect/internal/data"
"garmin-connect/internal/stats"
"go-garth/internal/api/client"
"go-garth/internal/data"
"go-garth/internal/stats"
)
func TestBodyBatteryIntegration(t *testing.T) {

View File

@@ -3,7 +3,7 @@ package garmin
import (
"time"
"garmin-connect/internal/stats"
"go-garth/internal/stats"
)
// Stats is an interface for stats data types.

View File

@@ -1,6 +1,6 @@
package garmin
import "garmin-connect/internal/types"
import "go-garth/internal/types"
// GarminTime represents Garmin's timestamp format with custom JSON parsing
type GarminTime = types.GarminTime