Skip to content

Commit e739809

Browse files
feat: implement get command
1 parent 1a716d2 commit e739809

File tree

5 files changed

+94
-9
lines changed

5 files changed

+94
-9
lines changed

cli/user_secrets.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func (r *RootCmd) secrets() *serpent.Command {
1717
Children: []*serpent.Command{
1818
r.secretCreate(),
1919
r.secretList(),
20+
r.secretGet(),
2021
},
2122
}
2223
}
@@ -66,7 +67,6 @@ func (r *RootCmd) secretCreate() *serpent.Command {
6667

6768
func (r *RootCmd) secretList() *serpent.Command {
6869
client := new(codersdk.Client)
69-
//var value string
7070
cmd := &serpent.Command{
7171
Use: "list",
7272
Short: "List user secrets",
@@ -86,6 +86,32 @@ func (r *RootCmd) secretList() *serpent.Command {
8686
return nil
8787
},
8888
}
89+
cmd.Options = serpent.OptionSet{}
90+
return cmd
91+
}
92+
93+
func (r *RootCmd) secretGet() *serpent.Command {
94+
client := new(codersdk.Client)
95+
//var value string
96+
cmd := &serpent.Command{
97+
Use: "get <name>",
98+
Short: "Get user secret",
99+
Middleware: serpent.Chain(
100+
serpent.RequireNArgs(1),
101+
r.InitClient(client),
102+
),
103+
Handler: func(inv *serpent.Invocation) error {
104+
secretName := inv.Args[0]
105+
secret, err := client.GetUserSecret(inv.Context(), secretName)
106+
if err != nil {
107+
return err
108+
}
109+
110+
fmt.Fprintf(inv.Stdout, "ID | Name | Description\n")
111+
fmt.Fprintf(inv.Stdout, "%v - %v - %v\n", secret.ID, secret.Name, secret.Description)
112+
return nil
113+
},
114+
}
89115
cmd.Options = serpent.OptionSet{
90116
//{
91117
// Flag: "value",

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,7 @@ func New(options *Options) *API {
12491249

12501250
r.Post("/", api.createUserSecret)
12511251
r.Get("/", api.listUserSecrets)
1252+
r.Get("/{name}", api.getUserSecret)
12521253
})
12531254
r.Route("/{user}", func(r chi.Router) {
12541255
r.Group(func(r chi.Router) {

coderd/user_secrets.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"github.com/coder/coder/v2/coderd/database"
55
"github.com/coder/coder/v2/coderd/database/db2sdk"
66
"github.com/coder/coder/v2/coderd/httpmw"
7+
"github.com/go-chi/chi/v5"
78
"github.com/google/uuid"
89
"net/http"
910

@@ -75,3 +76,31 @@ func (api *API) listUserSecrets(rw http.ResponseWriter, r *http.Request) {
7576

7677
httpapi.Write(ctx, rw, http.StatusOK, response)
7778
}
79+
80+
// Returns a user secret.
81+
//
82+
// @Summary Returns a user secret.
83+
// @ID get-user-secret
84+
// @Security CoderSessionToken
85+
// @Produce json
86+
// @Tags User-Secrets
87+
// @Success 200 {object} codersdk.UserSecret
88+
// @Router /users/secrets/{name} [get]
89+
func (api *API) getUserSecret(rw http.ResponseWriter, r *http.Request) {
90+
ctx := r.Context()
91+
apiKey := httpmw.APIKey(r)
92+
secretName := chi.URLParam(r, "name")
93+
94+
userSecret, err := api.Database.GetUserSecret(ctx, database.GetUserSecretParams{
95+
UserID: apiKey.UserID,
96+
Name: secretName,
97+
})
98+
if err != nil {
99+
httpapi.InternalServerError(rw, err)
100+
return
101+
}
102+
103+
response := db2sdk.UserSecret(userSecret)
104+
105+
httpapi.Write(ctx, rw, http.StatusOK, response)
106+
}

coderd/user_secrets_test.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package coderd_test
22

33
import (
4-
"encoding/json"
5-
"fmt"
64
"github.com/coder/coder/v2/codersdk"
75
"github.com/stretchr/testify/require"
86
"testing"
@@ -41,9 +39,9 @@ func TestUserSecrets(t *testing.T) {
4139
Value: "secretkey",
4240
})
4341
require.NoError(t, err)
44-
userSecretInJSON, err := json.Marshal(userSecret)
45-
require.NoError(t, err)
46-
fmt.Printf("userSecretInJSON: %s\n", userSecretInJSON)
42+
//userSecretInJSON, err := json.Marshal(userSecret)
43+
//require.NoError(t, err)
44+
//fmt.Printf("userSecretInJSON: %s\n", userSecretInJSON)
4745

4846
require.NotNil(t, userSecret.ID)
4947
require.Equal(t, templateAdmin.ID, userSecret.UserID)
@@ -54,12 +52,24 @@ func TestUserSecrets(t *testing.T) {
5452
userSecretList, err := templateAdminClient.ListUserSecrets(ctx)
5553
require.NoError(t, err)
5654
require.Len(t, userSecretList.Secrets, 1)
57-
userSecretListInJSON, err := json.Marshal(userSecretList)
58-
require.NoError(t, err)
59-
fmt.Printf("userSecretListInJSON: %s\n", userSecretListInJSON)
55+
//userSecretListInJSON, err := json.Marshal(userSecretList)
56+
//require.NoError(t, err)
57+
//fmt.Printf("userSecretListInJSON: %s\n", userSecretListInJSON)
6058

6159
require.NotNil(t, userSecretList.Secrets[0].ID)
6260
require.Equal(t, templateAdmin.ID, userSecretList.Secrets[0].UserID)
6361
require.Equal(t, userSecretName, userSecretList.Secrets[0].Name)
6462
require.Equal(t, userSecretDescription, userSecretList.Secrets[0].Description)
63+
64+
// test get API
65+
userSecret, err = templateAdminClient.GetUserSecret(ctx, userSecretName)
66+
require.NoError(t, err)
67+
//userSecretInJSON, err := json.Marshal(userSecret)
68+
//require.NoError(t, err)
69+
//fmt.Printf("userSecretInJSON: %s\n", userSecretInJSON)
70+
71+
require.NotNil(t, userSecret.ID)
72+
require.Equal(t, templateAdmin.ID, userSecret.UserID)
73+
require.Equal(t, userSecretName, userSecret.Name)
74+
require.Equal(t, userSecretDescription, userSecret.Description)
6575
}

codersdk/user_secrets.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package codersdk
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
67
"net/http"
78
"time"
89

@@ -77,3 +78,21 @@ func (c *Client) ListUserSecrets(ctx context.Context) (ListUserSecretsResponse,
7778
var userSecrets ListUserSecretsResponse
7879
return userSecrets, json.NewDecoder(res.Body).Decode(&userSecrets)
7980
}
81+
82+
func (c *Client) GetUserSecret(ctx context.Context, secretName string) (UserSecret, error) {
83+
res, err := c.Request(ctx, http.MethodGet,
84+
fmt.Sprintf("/api/v2/users/secrets/%v", secretName),
85+
nil,
86+
)
87+
if err != nil {
88+
return UserSecret{}, xerrors.Errorf("execute request: %w", err)
89+
}
90+
defer res.Body.Close()
91+
92+
if res.StatusCode != http.StatusOK {
93+
return UserSecret{}, ReadBodyAsError(res)
94+
}
95+
96+
var userSecret UserSecret
97+
return userSecret, json.NewDecoder(res.Body).Decode(&userSecret)
98+
}

0 commit comments

Comments
 (0)