Files
go-garth/profile.go
2025-09-02 06:52:24 -07:00

154 lines
3.7 KiB
Go

package garth
import (
"bytes"
"context"
"encoding/json"
"io/ioutil"
"net/http"
)
// Profile represents a user's Garmin profile
type Profile struct {
UserID string `json:"userId"`
Username string `json:"username"`
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
EmailAddress string `json:"emailAddress"`
Country string `json:"country"`
City string `json:"city"`
State string `json:"state"`
ProfileImage string `json:"profileImage"`
}
// ProfileService provides access to user profile operations
type ProfileService struct {
client *APIClient
}
// NewProfileService creates a new ProfileService instance
func NewProfileService(client *APIClient) *ProfileService {
return &ProfileService{client: client}
}
// Get fetches the current user's profile
func (s *ProfileService) Get(ctx context.Context) (*Profile, error) {
resp, err := s.client.Get(ctx, "/userprofile-service/userprofile")
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, &APIError{
StatusCode: resp.StatusCode,
Message: "Failed to get user profile",
}
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, &APIError{
StatusCode: http.StatusInternalServerError,
Message: "Failed to read profile response",
Cause: err,
}
}
var profile Profile
if err := json.Unmarshal(body, &profile); err != nil {
return nil, &APIError{
StatusCode: http.StatusInternalServerError,
Message: "Failed to parse profile data",
Cause: err,
}
}
return &profile, nil
}
// UpdateSettings updates the user's profile settings
func (s *ProfileService) UpdateSettings(ctx context.Context, settings map[string]interface{}) error {
// Serialize settings to JSON
jsonData, err := json.Marshal(settings)
if err != nil {
return &APIError{
StatusCode: http.StatusInternalServerError,
Message: "Failed to serialize settings",
Cause: err,
}
}
// Convert JSON data to a Reader
reader := bytes.NewReader(jsonData)
resp, err := s.client.Post(ctx, "/userprofile-service/userprofile/settings", reader)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent {
return &APIError{
StatusCode: resp.StatusCode,
Message: "Failed to update settings",
}
}
return nil
}
// Delete deletes the user's profile
func (s *ProfileService) Delete(ctx context.Context) error {
resp, err := s.client.Delete(ctx, "/userprofile-service/userprofile", nil)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent {
return &APIError{
StatusCode: resp.StatusCode,
Message: "Failed to delete profile",
}
}
return nil
}
// GetPublic retrieves public profile information for a user
func (s *ProfileService) GetPublic(ctx context.Context, userID string) (*Profile, error) {
resp, err := s.client.Get(ctx, "/userprofile-service/userprofile/public/"+userID)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, &APIError{
StatusCode: resp.StatusCode,
Message: "Failed to get public profile",
}
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, &APIError{
StatusCode: http.StatusInternalServerError,
Message: "Failed to read profile response",
Cause: err,
}
}
var profile Profile
if err := json.Unmarshal(body, &profile); err != nil {
return nil, &APIError{
StatusCode: http.StatusInternalServerError,
Message: "Failed to parse profile data",
Cause: err,
}
}
return &profile, nil
}