github.com/kubeshop/testkube@v1.17.23/pkg/cloud/client/rest.go (about)

     1  package client
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	nethttp "net/http"
     9  
    10  	"github.com/kubeshop/testkube/pkg/http"
    11  )
    12  
    13  type ListResponse[T All] struct {
    14  	Elements []T `json:"elements"`
    15  }
    16  
    17  type All interface {
    18  	Organization | Environment
    19  }
    20  
    21  type RESTClient[T All] struct {
    22  	BaseUrl string
    23  	Path    string
    24  	Client  http.HttpClient
    25  	Token   string
    26  }
    27  
    28  func (c RESTClient[T]) List() ([]T, error) {
    29  	r, err := nethttp.NewRequest("GET", c.BaseUrl+c.Path, nil)
    30  	r.Header.Add("Authorization", "Bearer "+c.Token)
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  	resp, err := c.Client.Do(r)
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  
    39  	var orgsResponse ListResponse[T]
    40  	err = json.NewDecoder(resp.Body).Decode(&orgsResponse)
    41  	return orgsResponse.Elements, err
    42  }
    43  
    44  func (c RESTClient[T]) Get(id string) (e T, err error) {
    45  	path := c.BaseUrl + c.Path + "/" + id
    46  	req, err := nethttp.NewRequest("GET", path, nil)
    47  	req.Header.Add("Authorization", "Bearer "+c.Token)
    48  	if err != nil {
    49  		return e, err
    50  	}
    51  	resp, err := c.Client.Do(req)
    52  	if err != nil {
    53  		return e, err
    54  	}
    55  
    56  	if resp.StatusCode > 299 {
    57  		d, err := io.ReadAll(resp.Body)
    58  		if err != nil {
    59  			return e, fmt.Errorf("error creating %s: can't read response: %s", c.Path, err)
    60  		}
    61  		return e, fmt.Errorf("error getting %s: %s", path, d)
    62  	}
    63  
    64  	err = json.NewDecoder(resp.Body).Decode(&e)
    65  	return
    66  }
    67  
    68  func (c RESTClient[T]) Create(entity T, overridePath ...string) (e T, err error) {
    69  	d, err := json.Marshal(entity)
    70  	if err != nil {
    71  		return e, err
    72  	}
    73  
    74  	path := c.Path
    75  	if len(overridePath) == 1 {
    76  		path = overridePath[0]
    77  	}
    78  
    79  	r, err := nethttp.NewRequest("POST", c.BaseUrl+path, bytes.NewBuffer(d))
    80  	if err != nil {
    81  		return e, err
    82  	}
    83  	r.Header.Add("Content-type", "application/json")
    84  	r.Header.Add("Authorization", "Bearer "+c.Token)
    85  
    86  	resp, err := c.Client.Do(r)
    87  	if err != nil {
    88  		return e, err
    89  	}
    90  
    91  	if resp.StatusCode > 299 {
    92  		d, err := io.ReadAll(resp.Body)
    93  		if err != nil {
    94  			return e, fmt.Errorf("error creating %s: can't read response: %s", c.Path, err)
    95  		}
    96  		return e, fmt.Errorf("error creating %s: %s", c.Path, d)
    97  	}
    98  
    99  	err = json.NewDecoder(resp.Body).Decode(&e)
   100  	if err != nil {
   101  		return e, fmt.Errorf("error decoding response: %s", err)
   102  	}
   103  
   104  	return e, nil
   105  }