mirror of
https://github.com/sstent/go-garth.git
synced 2026-01-25 16:42:28 +00:00
sync
This commit is contained in:
153
profile.go
Normal file
153
profile.go
Normal file
@@ -0,0 +1,153 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user