mirror of
https://github.com/sstent/go-garth-cli.git
synced 2025-12-05 23:52:02 +00:00
112 lines
2.9 KiB
Go
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)
|
|
}
|