...

Source file src/edge-infra.dev/pkg/edge/okta/client.go

Documentation: edge-infra.dev/pkg/edge/okta

     1  package okta
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  	"time"
     8  
     9  	"github.com/go-resty/resty/v2"
    10  
    11  	"edge-infra.dev/pkg/edge/api/types"
    12  )
    13  
    14  const (
    15  	formContentType   = "application/x-www-form-urlencoded"
    16  	jsonContentType   = "application/json"
    17  	contentTypeHeader = "Content-Type"
    18  	acceptHeader      = "Accept"
    19  )
    20  
    21  type Client struct {
    22  	*resty.Client
    23  	config types.OktaConfig
    24  }
    25  
    26  type Request struct {
    27  	*resty.Request
    28  }
    29  
    30  var (
    31  	defaultTimeOut = time.Second * 10
    32  )
    33  
    34  func New(cfg types.OktaConfig) *Client {
    35  	client := resty.New()
    36  	client.SetBaseURL(cfg.OktaIssuer)
    37  	client.SetTimeout(defaultTimeOut)
    38  	client.SetHeader(contentTypeHeader, jsonContentType)
    39  	client.SetHeader(acceptHeader, jsonContentType)
    40  	return &Client{
    41  		Client: client,
    42  		config: cfg,
    43  	}
    44  }
    45  
    46  func (c *Client) request(ctx context.Context) *Request {
    47  	req := c.R().SetContext(ctx)
    48  	return &Request{Request: req}
    49  }
    50  
    51  func (c *Client) WithFormData(ctx context.Context, data map[string]string) *Request {
    52  	req := c.request(ctx)
    53  	req.SetFormData(data)
    54  	req.SetHeader(contentTypeHeader, formContentType)
    55  	req.SetHeader(acceptHeader, jsonContentType)
    56  	return req
    57  }
    58  
    59  func (c *Client) WithData(ctx context.Context, data interface{}) *Request {
    60  	req := c.request(ctx)
    61  	req.SetBody(data)
    62  	req.SetHeader(contentTypeHeader, formContentType)
    63  	req.SetHeader(acceptHeader, jsonContentType)
    64  	return req
    65  }
    66  
    67  func (c *Client) WithNoData(ctx context.Context) *Request {
    68  	req := c.request(ctx)
    69  	req.SetHeader(acceptHeader, jsonContentType)
    70  	return req
    71  }
    72  
    73  func (r *Request) WithAccessToken(token string) *Request {
    74  	r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
    75  	return r
    76  }
    77  
    78  func (r *Request) Post(path string, resp interface{}) error {
    79  	r.SetResult(resp)
    80  	res, err := r.Execute(http.MethodPost, path)
    81  	return ValidateResponse(res, err)
    82  }
    83  
    84  func (r *Request) Get(path string, resp interface{}) error {
    85  	r.SetResult(resp)
    86  	res, err := r.Execute(http.MethodGet, path)
    87  	return ValidateResponse(res, err)
    88  }
    89  
    90  func ValidateResponse(res *resty.Response, err error) error {
    91  	ok := res.StatusCode() == 200 || res.StatusCode() == 204
    92  	if err == nil && ok {
    93  		return nil
    94  	}
    95  	if err == nil {
    96  		err = fmt.Errorf("status code: %v", res.StatusCode())
    97  	}
    98  	if res.StatusCode() == http.StatusBadRequest {
    99  		err = fmt.Errorf("the request failed validation, status code: %v", res.StatusCode())
   100  	}
   101  	return err
   102  }
   103  

View as plain text