Files
go-garth/workout_implementation_spec.md
2025-09-03 08:29:15 -07:00

5.3 KiB

Workout Service Implementation Specification

Overview

This document provides the technical specification for implementing the complete WorkoutService functionality in the go-garth library, following the established patterns from the ActivityService.

Data Structures

Workout (Summary)

type Workout struct {
    WorkoutID   int64     `json:"workoutId"`
    Name        string    `json:"workoutName"`
    Type        string    `json:"workoutType"`
    Description string    `json:"description"`
    CreatedDate time.Time `json:"createdDate"`
    UpdatedDate time.Time `json:"updatedDate"`
    OwnerID     int64     `json:"ownerId"`
    IsPublic    bool      `json:"isPublic"`
    SportType   string    `json:"sportType"`
    SubSportType string   `json:"subSportType"`
}

WorkoutDetails (Full)

type WorkoutDetails struct {
    WorkoutID       int64           `json:"workoutId"`
    Name            string          `json:"workoutName"`
    Description     string          `json:"description"`
    Type            string          `json:"workoutType"`
    CreatedDate     time.Time       `json:"createdDate"`
    UpdatedDate     time.Time       `json:"updatedDate"`
    OwnerID         int64           `json:"ownerId"`
    IsPublic        bool            `json:"isPublic"`
    SportType       string          `json:"sportType"`
    SubSportType    string          `json:"subSportType"`
    WorkoutSegments []WorkoutSegment `json:"workoutSegments"`
    EstimatedDuration int           `json:"estimatedDuration"`
    EstimatedDistance float64       `json:"estimatedDistance"`
    TrainingLoad    float64         `json:"trainingLoad"`
    Tags            []string        `json:"tags"`
}

WorkoutSegment

type WorkoutSegment struct {
    SegmentID   int64           `json:"segmentId"`
    Name        string          `json:"name"`
    Description string          `json:"description"`
    Order       int             `json:"order"`
    Exercises   []WorkoutExercise `json:"exercises"`
}

WorkoutExercise

type WorkoutExercise struct {
    ExerciseID   int64  `json:"exerciseId"`
    Name         string `json:"name"`
    Category     string `json:"category"`
    Type         string `json:"type"`
    Duration     int    `json:"duration,omitempty"`
    Distance     float64 `json:"distance,omitempty"`
    Repetitions  int    `json:"repetitions,omitempty"`
    Weight       float64 `json:"weight,omitempty"`
    RestInterval int    `json:"restInterval,omitempty"`
}

WorkoutListOptions

type WorkoutListOptions struct {
    Limit        int
    Offset       int
    StartDate    time.Time
    EndDate      time.Time
    WorkoutType  string
    Type         string
    Status       string
    SportType    string
    NameContains string
    OwnerID      int64
    IsPublic     *bool
    SortBy       string
    SortOrder    string
}

WorkoutUpdate

type WorkoutUpdate struct {
    Name        string    `json:"workoutName,omitempty"`
    Description string    `json:"description,omitempty"`
    Type        string    `json:"workoutType,omitempty"`
    SportType   string    `json:"sportType,omitempty"`
    IsPublic    *bool     `json:"isPublic,omitempty"`
    Tags        []string  `json:"tags,omitempty"`
}

API Endpoints

Base URL Pattern

All workout endpoints follow the pattern: /workout-service/workout

Specific Endpoints

  • GET /workout-service/workout - List workouts (with query parameters)
  • GET /workout-service/workout/{workoutId} - Get workout details
  • POST /workout-service/workout - Create new workout
  • PUT /workout-service/workout/{workoutId} - Update existing workout
  • DELETE /workout-service/workout/{workoutId} - Delete workout
  • GET /download-service/export/{format}/workout/{workoutId} - Export workout

Method Signatures

WorkoutService Methods

func (s *WorkoutService) List(ctx context.Context, opts WorkoutListOptions) ([]Workout, error)
func (s *WorkoutService) Get(ctx context.Context, workoutID int64) (*WorkoutDetails, error)
func (s *WorkoutService) Create(ctx context.Context, workout WorkoutDetails) (*WorkoutDetails, error)
func (s *WorkoutService) Update(ctx context.Context, workoutID int64, update WorkoutUpdate) (*WorkoutDetails, error)
func (s *WorkoutService) Delete(ctx context.Context, workoutID int64) error
func (s *WorkoutService) Export(ctx context.Context, workoutID int64, format string) (io.ReadCloser, error)

Testing Strategy

Test Coverage Requirements

  • All public methods must have unit tests
  • Test both success and error scenarios
  • Use httptest for HTTP mocking
  • Test JSON marshaling/unmarshaling
  • Test query parameter construction

Test File Structure

  • File: workouts_test.go
  • Test functions:
    • TestWorkoutService_List
    • TestWorkoutService_Get
    • TestWorkoutService_Create
    • TestWorkoutService_Update
    • TestWorkoutService_Delete
    • TestWorkoutService_Export

Error Handling

  • Follow the same pattern as ActivityService
  • Use APIError for HTTP-related errors
  • Include proper status codes and messages
  • Handle JSON parsing errors appropriately

Implementation Notes

  • Use the same HTTP client pattern as ActivityService
  • Follow consistent naming conventions
  • Ensure proper context handling
  • Include appropriate defer statements for resource cleanup
  • Use strconv.FormatInt for ID conversion in URLs