forked from Cox-Automotive/alks-go
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi.go
More file actions
151 lines (127 loc) · 3.63 KB
/
api.go
File metadata and controls
151 lines (127 loc) · 3.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package alks
import (
"bytes"
"encoding/json"
"fmt"
"github.com/hashicorp/go-cleanhttp"
"io/ioutil"
"log"
"net/http"
"net/http/httputil"
"net/url"
)
// AlksAccount is used to represent the configuration for the ALKS client
type AlksAccount struct {
Username string `json:"userid"`
Password string `json:"password"`
Account string `json:"account"`
Role string `json:"role"`
}
type AlksSTS struct {
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
Token string `json:"sessionToken"`
}
// Client represents an ALKS client and contains the account info and base url.
type Client struct {
Account AlksAccount
STS AlksSTS
BaseURL string
Http *http.Client
}
// NewClient will create a new instance of the ALKS Client. If you don't yet know the account/role
// pass them as nil and then invoke GetAccounts().
func NewClient(url string, username string, password string, account string, role string) (*Client, error) {
client := Client{
Account: AlksAccount{
Username: username,
Password: password,
Account: account,
Role: role,
},
STS: AlksSTS{},
BaseURL: url,
Http: cleanhttp.DefaultClient(),
}
return &client, nil
}
// NewSTSClient will create a new instance of the ALKS Client using STS tokens.
func NewSTSClient(url string, accessKey string, secretKey string, token string) (*Client, error) {
client := Client{
Account: AlksAccount{},
STS: AlksSTS{
AccessKey: accessKey,
SecretKey: secretKey,
Token: token,
},
BaseURL: url,
Http: cleanhttp.DefaultClient(),
}
return &client, nil
}
// newRequest will create a new request object for API requests.
func (c *Client) NewRequest(json []byte, method string, endpoint string) (*http.Request, error) {
u, err := url.Parse(c.BaseURL + endpoint)
if err != nil {
return nil, fmt.Errorf("Error parsing base URL: %s", err)
}
req, err := http.NewRequest(method, u.String(), bytes.NewBuffer(json))
if err != nil {
return nil, fmt.Errorf("Error creating request: %s", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "alks-go")
log.Println("------- ALKS HTTP Request -------")
requestDump, err := httputil.DumpRequest(req, true)
if err != nil {
log.Println(err)
}
log.Println(string(requestDump))
log.Println("-------- !!!!!!!!!! ---------")
return req, nil
}
// decodeBody will convert a http.Response object to a JSON object.
func decodeBody(resp *http.Response, out interface{}) error {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
log.Println("------- ALKS HTTP Response -------")
log.Printf("Status code: %v", resp.StatusCode)
log.Println(string(body))
log.Println("-------- !!!!!!!!!! ---------")
if err = json.Unmarshal(body, &out); err != nil {
return err
}
return nil
}
// checkResp will validate a http.Response based on its status code.
func checkResp(resp *http.Response, err error) (*http.Response, error) {
if err != nil {
return resp, err
}
switch i := resp.StatusCode; {
case i == 200:
return resp, nil
case i == 201:
return resp, nil
case i == 202:
return resp, nil
case i == 204:
return resp, nil
case i == 400:
return nil, fmt.Errorf("API Error 400: %s", resp.Status)
case i == 401: // access denied will still return json
return resp, nil
case i == 402:
return nil, fmt.Errorf("API Error 402: %s", resp.Status)
case i == 422:
return nil, fmt.Errorf("API Error 422: %s", resp.Status)
default:
return nil, fmt.Errorf("API Error %d: %s", resp.StatusCode, resp.Status)
}
}
// Durations will provide the valid session durations
func (c *Client) Durations() []int {
return []int{1, 2, 6, 12, 18}
}