github.com/saucelabs/saucectl@v0.175.1/internal/http/userservice.go (about)

     1  package http
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	"net/http"
     9  	"time"
    10  
    11  	"github.com/saucelabs/saucectl/internal/iam"
    12  )
    13  
    14  type UserService struct {
    15  	HTTPClient  *http.Client
    16  	URL         string
    17  	Credentials iam.Credentials
    18  }
    19  
    20  func NewUserService(url string, creds iam.Credentials, timeout time.Duration) UserService {
    21  	return UserService{
    22  		HTTPClient: &http.Client{
    23  			Timeout:   timeout,
    24  			Transport: &http.Transport{Proxy: http.ProxyFromEnvironment},
    25  		},
    26  		URL:         url,
    27  		Credentials: creds,
    28  	}
    29  }
    30  
    31  // Concurrency returns the concurrency settings for the current account.
    32  func (c *UserService) Concurrency(ctx context.Context) (iam.Concurrency, error) {
    33  	req, err := NewRequestWithContext(ctx, http.MethodGet,
    34  		fmt.Sprintf("%s/rest/v1.2/users/%s/concurrency", c.URL, c.Credentials.Username), nil)
    35  	if err != nil {
    36  		return iam.Concurrency{}, err
    37  	}
    38  	req.SetBasicAuth(c.Credentials.Username, c.Credentials.AccessKey)
    39  
    40  	resp, err := c.HTTPClient.Do(req)
    41  	if err != nil {
    42  		return iam.Concurrency{}, err
    43  	}
    44  	defer resp.Body.Close()
    45  
    46  	if resp.StatusCode != http.StatusOK {
    47  		b, _ := io.ReadAll(resp.Body)
    48  		return iam.Concurrency{}, fmt.Errorf("unexpected server response (%d): %s", resp.StatusCode, b)
    49  	}
    50  
    51  	var body struct {
    52  		Concurrency iam.Concurrency `json:"concurrency"`
    53  	}
    54  
    55  	return body.Concurrency, json.NewDecoder(resp.Body).Decode(&body)
    56  }
    57  
    58  func (c *UserService) User(ctx context.Context) (iam.User, error) {
    59  	url := fmt.Sprintf("%s/team-management/v1/users/me", c.URL)
    60  
    61  	var user iam.User
    62  	req, err := NewRequestWithContext(ctx, http.MethodGet, url, nil)
    63  	if err != nil {
    64  		return user, err
    65  	}
    66  
    67  	req.SetBasicAuth(c.Credentials.Username, c.Credentials.AccessKey)
    68  	resp, err := c.HTTPClient.Do(req)
    69  	if err != nil {
    70  		return user, err
    71  	}
    72  	defer resp.Body.Close()
    73  	body, err := io.ReadAll(resp.Body)
    74  	if err != nil {
    75  		return user, err
    76  	}
    77  	err = json.Unmarshal(body, &user)
    78  	if err != nil {
    79  		return user, err
    80  	}
    81  	return user, nil
    82  }