Skip to content

Commit e288818

Browse files
feat: implement get --with-value command
1 parent e739809 commit e288818

File tree

5 files changed

+73
-8
lines changed

5 files changed

+73
-8
lines changed

cli/user_secrets.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func (r *RootCmd) secretList() *serpent.Command {
9292

9393
func (r *RootCmd) secretGet() *serpent.Command {
9494
client := new(codersdk.Client)
95-
//var value string
95+
var withValue bool
9696
cmd := &serpent.Command{
9797
Use: "get <name>",
9898
Short: "Get user secret",
@@ -107,17 +107,28 @@ func (r *RootCmd) secretGet() *serpent.Command {
107107
return err
108108
}
109109

110-
fmt.Fprintf(inv.Stdout, "ID | Name | Description\n")
111-
fmt.Fprintf(inv.Stdout, "%v - %v - %v\n", secret.ID, secret.Name, secret.Description)
110+
userSecretValue := codersdk.UserSecretValue{
111+
Value: "hidden",
112+
}
113+
if withValue {
114+
userSecretValue, err = client.GetUserSecretValue(inv.Context(), secretName)
115+
if err != nil {
116+
return err
117+
}
118+
}
119+
value := userSecretValue.Value
120+
121+
fmt.Fprintf(inv.Stdout, "ID | Name | Description | Value\n")
122+
fmt.Fprintf(inv.Stdout, "%v - %v - %v - %v\n", secret.ID, secret.Name, secret.Description, value)
112123
return nil
113124
},
114125
}
115126
cmd.Options = serpent.OptionSet{
116-
//{
117-
// Flag: "value",
118-
// Description: "Value of the secret (required).",
119-
// Value: serpent.StringOf(&value),
120-
//},
127+
{
128+
Flag: "with-value",
129+
Description: "Display value of the secret.",
130+
Value: serpent.BoolOf(&withValue),
131+
},
121132
}
122133
return cmd
123134
}

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,6 +1250,7 @@ func New(options *Options) *API {
12501250
r.Post("/", api.createUserSecret)
12511251
r.Get("/", api.listUserSecrets)
12521252
r.Get("/{name}", api.getUserSecret)
1253+
r.Get("/{name}/value", api.getUserSecretValue)
12531254
})
12541255
r.Route("/{user}", func(r chi.Router) {
12551256
r.Group(func(r chi.Router) {

coderd/user_secrets.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,33 @@ func (api *API) getUserSecret(rw http.ResponseWriter, r *http.Request) {
104104

105105
httpapi.Write(ctx, rw, http.StatusOK, response)
106106
}
107+
108+
// Returns a user secret value.
109+
//
110+
// @Summary Returns a user secret value.
111+
// @ID get-user-secret-value
112+
// @Security CoderSessionToken
113+
// @Produce json
114+
// @Tags User-Secrets
115+
// @Success 200 {object} codersdk.UserSecretValue
116+
// @Router /users/secrets/{name}/value [get]
117+
func (api *API) getUserSecretValue(rw http.ResponseWriter, r *http.Request) {
118+
ctx := r.Context()
119+
apiKey := httpmw.APIKey(r)
120+
secretName := chi.URLParam(r, "name")
121+
122+
userSecret, err := api.Database.GetUserSecret(ctx, database.GetUserSecretParams{
123+
UserID: apiKey.UserID,
124+
Name: secretName,
125+
})
126+
if err != nil {
127+
httpapi.InternalServerError(rw, err)
128+
return
129+
}
130+
131+
response := codersdk.UserSecretValue{
132+
Value: userSecret.Value,
133+
}
134+
135+
httpapi.Write(ctx, rw, http.StatusOK, response)
136+
}

coderd/user_secrets_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,9 @@ func TestUserSecrets(t *testing.T) {
7272
require.Equal(t, templateAdmin.ID, userSecret.UserID)
7373
require.Equal(t, userSecretName, userSecret.Name)
7474
require.Equal(t, userSecretDescription, userSecret.Description)
75+
76+
// test get value API
77+
userSecretValue, err := templateAdminClient.GetUserSecretValue(ctx, userSecretName)
78+
require.NoError(t, err)
79+
require.Equal(t, "secretkey", userSecretValue.Value)
7580
}

codersdk/user_secrets.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,21 @@ func (c *Client) GetUserSecret(ctx context.Context, secretName string) (UserSecr
9696
var userSecret UserSecret
9797
return userSecret, json.NewDecoder(res.Body).Decode(&userSecret)
9898
}
99+
100+
func (c *Client) GetUserSecretValue(ctx context.Context, secretName string) (UserSecretValue, error) {
101+
res, err := c.Request(ctx, http.MethodGet,
102+
fmt.Sprintf("/api/v2/users/secrets/%v/value", secretName),
103+
nil,
104+
)
105+
if err != nil {
106+
return UserSecretValue{}, xerrors.Errorf("execute request: %w", err)
107+
}
108+
defer res.Body.Close()
109+
110+
if res.StatusCode != http.StatusOK {
111+
return UserSecretValue{}, ReadBodyAsError(res)
112+
}
113+
114+
var userSecretValue UserSecretValue
115+
return userSecretValue, json.NewDecoder(res.Body).Decode(&userSecretValue)
116+
}

0 commit comments

Comments
 (0)