-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtokens.go
131 lines (114 loc) · 3.31 KB
/
tokens.go
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
package scaleway
import (
"fmt"
"time"
)
// TokensService handles communication with the tokens related
// methods of the Scaleway API.
//
// Scaleway API docs: https://developer.scaleway.com/#tokens
type TokensService struct {
client *Client
}
// Token represents a Scaleway auth-token.
type Token struct {
CreationDate Ntime `json:"creation_date,omitempty"`
Expires Ntime `json:"expires,omitempty"`
ID string `json:"id,omitempty"`
InheritsUserPerms bool `json:"inherits_user_perms,omitempty"`
UserID string `json:"user_id,omitempty"`
Permission []string `json:"permissions"`
}
func (t *Token) String() string {
return fmt.Sprintf("id: %s, created: %s, expires: %s", t.ID, time.Time(t.CreationDate), time.Time(t.Expires))
}
// tokenRequest represents a request to create a token.
type tokenRequest struct {
*Credentials
Expires bool `json:"expires"`
}
// tokenResponse represents a Scaleway token creation response.
type tokenResponse struct {
Token *Token `json:"token"`
}
// tokenListResponse represents a Scaleway token list response.
type tokenListResponse struct {
Tokens []*Token `json:"tokens"`
}
// Create authenticates a user against their username, password, and then
// returns a new Token, which can be used until it expires.
func (s *TokensService) Create(credentials *Credentials, expires bool) (*Token, *Response, error) {
tr := &tokenRequest{
Credentials: credentials,
Expires: expires,
}
u := fmt.Sprintf("/tokens")
req, err := s.client.NewRequestAccount("POST", u, tr)
if err != nil {
return nil, nil, err
}
token := new(tokenResponse)
resp, err := s.client.Do(req, token)
if err != nil {
return nil, nil, err
}
return token.Token, resp, nil
}
// List returns a list of all tokens associate to your account.
func (s *TokensService) List() ([]*Token, *Response, error) {
return s.listTokens()
}
func (s *TokensService) listTokens() ([]*Token, *Response, error) {
u := fmt.Sprintf("/tokens")
req, err := s.client.NewRequestAccount("GET", u, nil)
if err != nil {
return nil, nil, err
}
tokens := new(tokenListResponse)
resp, err := s.client.Do(req, tokens)
if err != nil {
return nil, nil, err
}
return tokens.Tokens, resp, nil
}
// Get returns info for a specific token.
func (s *TokensService) Get(id string) (*Token, *Response, error) {
u := fmt.Sprintf("/tokens/%s", id)
req, err := s.client.NewRequestAccount("GET", u, nil)
if err != nil {
return nil, nil, err
}
token := new(tokenResponse)
resp, err := s.client.Do(req, token)
if err != nil {
return nil, nil, err
}
return token.Token, resp, nil
}
// Update increases token expiration time of 30 minutes.
func (s *TokensService) Update(id string) (*Token, *Response, error) {
u := fmt.Sprintf("/tokens/%s", id)
req, err := s.client.NewRequestAccount("PATCH", u, struct{}{})
if err != nil {
return nil, nil, err
}
token := new(tokenResponse)
resp, err := s.client.Do(req, token)
if err != nil {
return nil, nil, err
}
return token.Token, resp, nil
}
// Delete deletes a token.
func (s *TokensService) Delete(id string) (*Response, error) {
u := fmt.Sprintf("/tokens/%s", id)
req, err := s.client.NewRequestAccount("DELETE", u, nil)
if err != nil {
return nil, err
}
resp, err := s.client.Do(req, nil)
if err != nil {
return nil, err
}
return resp, nil
}