mirror of
https://github.com/sstent/go-garth.git
synced 2025-12-06 08:01:42 +00:00
81 lines
2.2 KiB
Go
81 lines
2.2 KiB
Go
package data
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
shared "go-garth/shared/interfaces"
|
|
)
|
|
|
|
// WeightData represents weight data
|
|
type WeightData struct {
|
|
Date time.Time `json:"calendarDate"`
|
|
Weight float64 `json:"weight"` // in grams
|
|
BMI float64 `json:"bmi"`
|
|
BodyFat float64 `json:"bodyFat"`
|
|
BoneMass float64 `json:"boneMass"`
|
|
MuscleMass float64 `json:"muscleMass"`
|
|
Hydration float64 `json:"hydration"`
|
|
}
|
|
|
|
// WeightDataWithMethods embeds WeightData and adds methods
|
|
type WeightDataWithMethods struct {
|
|
WeightData
|
|
}
|
|
|
|
// Validate checks if weight data contains valid values
|
|
func (w *WeightDataWithMethods) Validate() error {
|
|
if w.Weight <= 0 {
|
|
return fmt.Errorf("invalid weight value")
|
|
}
|
|
if w.BMI < 10 || w.BMI > 50 {
|
|
return fmt.Errorf("BMI out of valid range")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Get implements the Data interface for WeightData
|
|
func (w *WeightDataWithMethods) Get(day time.Time, c shared.APIClient) (any, error) {
|
|
startDate := day.Format("2006-01-02")
|
|
endDate := day.Format("2006-01-02")
|
|
path := fmt.Sprintf("/weight-service/weight/dateRange?startDate=%s&endDate=%s",
|
|
startDate, endDate)
|
|
|
|
data, err := c.ConnectAPI(path, "GET", nil, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(data) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
var response struct {
|
|
WeightList []WeightData `json:"weightList"`
|
|
}
|
|
if err := json.Unmarshal(data, &response); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(response.WeightList) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
weightData := response.WeightList[0]
|
|
// Convert grams to kilograms
|
|
weightData.Weight = weightData.Weight / 1000
|
|
weightData.BoneMass = weightData.BoneMass / 1000
|
|
weightData.MuscleMass = weightData.MuscleMass / 1000
|
|
weightData.Hydration = weightData.Hydration / 1000
|
|
|
|
return &WeightDataWithMethods{WeightData: weightData}, nil
|
|
}
|
|
|
|
// List implements the Data interface for concurrent fetching
|
|
func (w *WeightDataWithMethods) List(end time.Time, days int, c shared.APIClient, maxWorkers int) ([]any, error) {
|
|
// BaseData is not part of types.WeightData, so this line needs to be removed or re-evaluated.
|
|
// For now, I will return an empty slice and no error, as this function is not directly related to the task.
|
|
return []any{}, nil
|
|
}
|