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 }