Files
go-garth-cli/python-garmin-connect/Connections.go
2025-09-21 11:03:52 -07:00

112 lines
2.9 KiB
Go

package connect
import (
"encoding/json"
"fmt"
"net/url"
"strings"
)
// Connections will list the connections of displayName. If displayName is
// empty, the current authenticated users connection list wil be returned.
func (c *Client) Connections(displayName string) ([]SocialProfile, error) {
// There also exist an endpoint without /pagination/ but it will return
// 403 for *some* connections.
URL := "https://connect.garmin.com/modern/proxy/userprofile-service/socialProfile/connections/pagination/" + displayName
if !c.authenticated() && displayName == "" {
return nil, ErrNotAuthenticated
}
var proxy struct {
Connections []SocialProfile `json:"userConnections"`
}
err := c.getJSON(URL, &proxy)
if err != nil {
return nil, err
}
return proxy.Connections, nil
}
// PendingConnections returns a list of pending connections.
func (c *Client) PendingConnections() ([]SocialProfile, error) {
URL := "https://connect.garmin.com/modern/proxy/userprofile-service/connection/pending"
if !c.authenticated() {
return nil, ErrNotAuthenticated
}
pending := make([]SocialProfile, 0, 10)
err := c.getJSON(URL, &pending)
if err != nil {
return nil, err
}
return pending, nil
}
// AcceptConnection will accept a pending connection.
func (c *Client) AcceptConnection(connectionRequestID int) error {
URL := fmt.Sprintf("https://connect.garmin.com/modern/proxy/userprofile-service/connection/accept/%d", connectionRequestID)
payload := struct {
ConnectionRequestID int `json:"connectionRequestId"`
}{
ConnectionRequestID: connectionRequestID,
}
return c.write("PUT", URL, payload, 0)
}
// SearchConnections can search other users of Garmin Connect.
func (c *Client) SearchConnections(keyword string) ([]SocialProfile, error) {
URL := "https://connect.garmin.com/modern/proxy/usersearch-service/search"
payload := url.Values{
"start": {"1"},
"limit": {"20"},
"keyword": {keyword},
}
req, err := c.newRequest("POST", URL, strings.NewReader(payload.Encode()))
if err != nil {
return nil, err
}
req.Header.Add("content-type", "application/x-www-form-urlencoded; charset=UTF-8")
resp, err := c.do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var proxy struct {
Profiles []SocialProfile `json:"profileList"`
}
dec := json.NewDecoder(resp.Body)
err = dec.Decode(&proxy)
if err != nil {
return nil, err
}
return proxy.Profiles, nil
}
// RemoveConnection will remove a connection.
func (c *Client) RemoveConnection(connectionRequestID int) error {
URL := fmt.Sprintf("https://connect.garmin.com/modern/proxy/userprofile-service/connection/end/%d", connectionRequestID)
return c.write("PUT", URL, nil, 200)
}
// RequestConnection will request a connection with displayName.
func (c *Client) RequestConnection(displayName string) error {
URL := "https://connect.garmin.com/modern/proxy/userprofile-service/connection/request/" + displayName
return c.write("PUT", URL, nil, 0)
}