...
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