Skip to content

Commit b56de7d

Browse files
API Key CRUD (#34)
1 parent 50c5c32 commit b56de7d

File tree

3 files changed

+124
-1
lines changed

3 files changed

+124
-1
lines changed

client.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,13 @@ func withBody(body interface{}) requestOption {
209209
return err
210210
}
211211
contentType = "application/x-www-form-urlencoded"
212+
case string:
213+
bodyBuf = new(bytes.Buffer)
214+
_, err := io.WriteString(bodyBuf, body)
215+
contentType = "text/plain"
216+
if err != nil {
217+
return err
218+
}
212219
default:
213220
bodyBuf = new(bytes.Buffer)
214221
if err := json.NewEncoder(bodyBuf).Encode(body); err != nil {

team.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ type Team struct {
1717
}
1818

1919
type APIKey struct {
20-
Key string `json:"key"`
20+
Key string `json:"key"`
21+
Comment string `json:"comment"`
22+
Created int `json:"created"`
23+
LastUsed int `json:"lastUsed"`
24+
MaskedKey string `json:"maskedKey"`
2125
}
2226

2327
type TeamService struct {
@@ -61,6 +65,41 @@ func (ts TeamService) GenerateAPIKey(ctx context.Context, teamUUID uuid.UUID) (k
6165
return
6266
}
6367

68+
func (ts TeamService) DeleteAPIKey(ctx context.Context, key string) (err error) {
69+
req, err := ts.client.newRequest(ctx, http.MethodDelete, fmt.Sprintf("/api/v1/team/key/%s", key))
70+
if err != nil {
71+
return
72+
}
73+
_, err = ts.client.doRequest(req, nil)
74+
return
75+
}
76+
77+
func (ts TeamService) UpdateAPIKeyComment(ctx context.Context, key, comment string) (commentOut string, err error) {
78+
req, err := ts.client.newRequest(ctx, http.MethodPost, fmt.Sprintf("/api/v1/team/key/%s/comment", key), withBody(comment))
79+
if err != nil {
80+
return
81+
}
82+
var apiKey APIKey
83+
_, err = ts.client.doRequest(req, &apiKey)
84+
commentOut = apiKey.Comment
85+
return
86+
}
87+
88+
func (ts TeamService) GetAPIKeys(ctx context.Context, teamUUID uuid.UUID) (keys []APIKey, err error) {
89+
keys = []APIKey{}
90+
err = ForEach(
91+
func(po PageOptions) (Page[Team], error) { return ts.GetAll(ctx, po) },
92+
func(item Team) error {
93+
if item.UUID != teamUUID {
94+
return nil
95+
}
96+
keys = append(keys, item.APIKeys...)
97+
return nil
98+
},
99+
)
100+
return keys, err
101+
}
102+
64103
func (ts TeamService) Create(ctx context.Context, team Team) (t Team, err error) {
65104
req, err := ts.client.newRequest(ctx, http.MethodPut, "/api/v1/team", withBody(team))
66105
if err != nil {

team_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package dtrack
2+
3+
import (
4+
"context"
5+
"github.com/stretchr/testify/require"
6+
"testing"
7+
)
8+
9+
func TestGenerateAPIKey(t *testing.T) {
10+
client := setUpContainer(t, testContainerOptions{
11+
APIPermissions: []string{
12+
PermissionAccessManagement,
13+
},
14+
})
15+
16+
team, err := client.Team.Create(context.Background(), Team{
17+
Name: "GenerateAPIKey",
18+
})
19+
require.NoError(t, err)
20+
21+
key, err := client.Team.GenerateAPIKey(context.Background(), team.UUID)
22+
require.NoError(t, err)
23+
24+
keys, err := client.Team.GetAPIKeys(context.Background(), team.UUID)
25+
require.NoError(t, err)
26+
require.Equal(t, len(keys), 1)
27+
require.Equal(t, keys[0].Key, key)
28+
}
29+
30+
func TestDeleteAPIKey(t *testing.T) {
31+
client := setUpContainer(t, testContainerOptions{
32+
APIPermissions: []string{
33+
PermissionAccessManagement,
34+
},
35+
})
36+
37+
team, err := client.Team.Create(context.Background(), Team{
38+
Name: "DeleteAPIKey",
39+
})
40+
require.NoError(t, err)
41+
42+
key, err := client.Team.GenerateAPIKey(context.Background(), team.UUID)
43+
require.NoError(t, err)
44+
45+
err = client.Team.DeleteAPIKey(context.Background(), key)
46+
require.NoError(t, err)
47+
48+
keys, err := client.Team.GetAPIKeys(context.Background(), team.UUID)
49+
require.NoError(t, err)
50+
require.Empty(t, keys)
51+
}
52+
53+
func TestUpdateAPIKeyComment(t *testing.T) {
54+
client := setUpContainer(t, testContainerOptions{
55+
APIPermissions: []string{
56+
PermissionAccessManagement,
57+
},
58+
})
59+
60+
team, err := client.Team.Create(context.Background(), Team{
61+
Name: "UpdateAPIKeyComment",
62+
})
63+
require.NoError(t, err)
64+
65+
key, err := client.Team.GenerateAPIKey(context.Background(), team.UUID)
66+
require.NoError(t, err)
67+
68+
comment, err := client.Team.UpdateAPIKeyComment(context.Background(), key, "test-comment")
69+
require.NoError(t, err)
70+
require.Equal(t, comment, "test-comment")
71+
72+
keys, err := client.Team.GetAPIKeys(context.Background(), team.UUID)
73+
require.NoError(t, err)
74+
require.Equal(t, len(keys), 1)
75+
require.Equal(t, keys[0].Key, key)
76+
require.Equal(t, keys[0].Comment, "test-comment")
77+
}

0 commit comments

Comments
 (0)