Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit 2d52bb3

Browse files
authored
Merge pull request #95 from cdr/cleanup-entclient
Cleanup and export entclient
2 parents 057ccbc + 9974e45 commit 2d52bb3

File tree

23 files changed

+241
-271
lines changed

23 files changed

+241
-271
lines changed

ci/integration/users_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"testing"
66

77
"cdr.dev/coder-cli/ci/tcli"
8-
"cdr.dev/coder-cli/internal/entclient"
8+
"cdr.dev/coder-cli/coder-sdk"
99
"cdr.dev/slog/sloggers/slogtest/assert"
1010
)
1111

@@ -20,7 +20,7 @@ func TestUsers(t *testing.T) {
2020

2121
headlessLogin(ctx, t, c)
2222

23-
var user entclient.User
23+
var user coder.User
2424
c.Run(ctx, `coder users ls --output json | jq -c '.[] | select( .username == "charlie")'`).Assert(t,
2525
tcli.Success(),
2626
tcli.StdoutJSONUnmarshal(&user),
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
package entclient
1+
package coder
22

33
import (
44
"context"
55
"net/http"
66
)
77

8-
// PushActivity pushes CLI activity to Coder
8+
// PushActivity pushes CLI activity to Coder.
99
func (c Client) PushActivity(ctx context.Context, source string, envID string) error {
10-
res, err := c.request(ctx, "POST", "/api/metrics/usage/push", map[string]string{
10+
res, err := c.request(ctx, http.MethodPost, "/api/metrics/usage/push", map[string]string{
1111
"source": source,
1212
"environment_id": envID,
1313
})
@@ -18,6 +18,5 @@ func (c Client) PushActivity(ctx context.Context, source string, envID string) e
1818
if res.StatusCode != http.StatusOK {
1919
return bodyError(res)
2020
}
21-
2221
return nil
2322
}

internal/entclient/client.go renamed to coder-sdk/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package entclient
1+
package coder
22

33
import (
44
"net/http"

internal/entclient/devurl.go renamed to coder-sdk/devurl.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package entclient
1+
package coder
22

33
import (
44
"context"
@@ -24,7 +24,7 @@ type delDevURLRequest struct {
2424
func (c Client) DelDevURL(ctx context.Context, envID, urlID string) error {
2525
reqURL := fmt.Sprintf("/api/environments/%s/devurls/%s", envID, urlID)
2626

27-
res, err := c.request(ctx, "DELETE", reqURL, delDevURLRequest{
27+
res, err := c.request(ctx, http.MethodDelete, reqURL, delDevURLRequest{
2828
EnvID: envID,
2929
DevURLID: urlID,
3030
})
@@ -51,7 +51,7 @@ type createDevURLRequest struct {
5151
func (c Client) InsertDevURL(ctx context.Context, envID string, port int, name, access string) error {
5252
reqURL := fmt.Sprintf("/api/environments/%s/devurls", envID)
5353

54-
res, err := c.request(ctx, "POST", reqURL, createDevURLRequest{
54+
res, err := c.request(ctx, http.MethodPost, reqURL, createDevURLRequest{
5555
EnvID: envID,
5656
Port: port,
5757
Access: access,
@@ -75,7 +75,7 @@ type updateDevURLRequest createDevURLRequest
7575
func (c Client) UpdateDevURL(ctx context.Context, envID, urlID string, port int, name, access string) error {
7676
reqURL := fmt.Sprintf("/api/environments/%s/devurls/%s", envID, urlID)
7777

78-
res, err := c.request(ctx, "PUT", reqURL, updateDevURLRequest{
78+
res, err := c.request(ctx, http.MethodPut, reqURL, updateDevURLRequest{
7979
EnvID: envID,
8080
Port: port,
8181
Access: access,

internal/entclient/env.go renamed to coder-sdk/env.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
package entclient
1+
package coder
22

33
import (
44
"context"
5+
"net/http"
56
"time"
67

78
"cdr.dev/coder-cli/internal/x/xjson"
@@ -33,12 +34,12 @@ type Environment struct {
3334
AutoOffThreshold xjson.Duration `json:"auto_off_threshold" tab:"-"`
3435
}
3536

36-
// Envs gets the list of environments owned by the authenticated user
37-
func (c Client) Envs(ctx context.Context, user *User, org Org) ([]Environment, error) {
37+
// EnvironmentsByOrganization gets the list of environments owned by the given user.
38+
func (c Client) EnvironmentsByOrganization(ctx context.Context, userID, orgID string) ([]Environment, error) {
3839
var envs []Environment
3940
err := c.requestBody(
4041
ctx,
41-
"GET", "/api/orgs/"+org.ID+"/members/"+user.ID+"/environments",
42+
http.MethodGet, "/api/orgs/"+orgID+"/members/"+userID+"/environments",
4243
nil,
4344
&envs,
4445
)
@@ -47,7 +48,7 @@ func (c Client) Envs(ctx context.Context, user *User, org Org) ([]Environment, e
4748

4849
// DialWsep dials an environments command execution interface
4950
// See github.com/cdr/wsep for details
50-
func (c Client) DialWsep(ctx context.Context, env Environment) (*websocket.Conn, error) {
51+
func (c Client) DialWsep(ctx context.Context, env *Environment) (*websocket.Conn, error) {
5152
u := c.copyURL()
5253
if c.BaseURL.Scheme == "https" {
5354
u.Scheme = "wss"

internal/entclient/error.go renamed to coder-sdk/error.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package entclient
1+
package coder
22

33
import (
44
"encoding/json"

internal/entclient/org.go renamed to coder-sdk/org.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
package entclient
1+
package coder
22

3-
import "context"
3+
import (
4+
"context"
5+
"net/http"
6+
)
47

58
// Org describes an Organization in Coder
69
type Org struct {
@@ -12,6 +15,6 @@ type Org struct {
1215
// Orgs gets all Organizations
1316
func (c Client) Orgs(ctx context.Context) ([]Org, error) {
1417
var os []Org
15-
err := c.requestBody(ctx, "GET", "/api/orgs", nil, &os)
18+
err := c.requestBody(ctx, http.MethodGet, "/api/orgs", nil, &os)
1619
return os, err
1720
}

internal/entclient/request.go renamed to coder-sdk/request.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package entclient
1+
package coder
22

33
import (
44
"bytes"

coder-sdk/secrets.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package coder
2+
3+
import (
4+
"context"
5+
"net/http"
6+
"time"
7+
)
8+
9+
// Secret describes a Coder secret
10+
type Secret struct {
11+
ID string `json:"id" tab:"-"`
12+
Name string `json:"name"`
13+
Value string `json:"value,omitempty"`
14+
Description string `json:"description"`
15+
CreatedAt time.Time `json:"created_at"`
16+
UpdatedAt time.Time `json:"updated_at" tab:"-"`
17+
}
18+
19+
// Secrets gets all secrets for the given user
20+
func (c *Client) Secrets(ctx context.Context, userID string) ([]Secret, error) {
21+
var secrets []Secret
22+
err := c.requestBody(ctx, http.MethodGet, "/api/users/"+userID+"/secrets", nil, &secrets)
23+
return secrets, err
24+
}
25+
26+
// SecretWithValueByName gets the Coder secret with its value by its name.
27+
func (c *Client) SecretWithValueByName(ctx context.Context, name, userID string) (*Secret, error) {
28+
s, err := c.SecretByName(ctx, name, userID)
29+
if err != nil {
30+
return nil, err
31+
}
32+
var secret Secret
33+
err = c.requestBody(ctx, http.MethodGet, "/api/users/"+userID+"/secrets/"+s.ID, nil, &secret)
34+
return &secret, err
35+
}
36+
37+
// SecretWithValueByID gets the Coder secret with its value by the secret_id.
38+
func (c *Client) SecretWithValueByID(ctx context.Context, id, userID string) (*Secret, error) {
39+
var secret Secret
40+
err := c.requestBody(ctx, http.MethodGet, "/api/users/"+userID+"/secrets/"+id, nil, &secret)
41+
return &secret, err
42+
}
43+
44+
// SecretByName gets a secret object by name
45+
func (c *Client) SecretByName(ctx context.Context, name, userID string) (*Secret, error) {
46+
secrets, err := c.Secrets(ctx, userID)
47+
if err != nil {
48+
return nil, err
49+
}
50+
for _, s := range secrets {
51+
if s.Name == name {
52+
return &s, nil
53+
}
54+
}
55+
return nil, ErrNotFound
56+
}
57+
58+
// InsertSecretReq describes the request body for creating a new secret
59+
type InsertSecretReq struct {
60+
Name string `json:"name"`
61+
Value string `json:"value"`
62+
Description string `json:"description"`
63+
}
64+
65+
// InsertSecret adds a new secret for the authed user
66+
func (c *Client) InsertSecret(ctx context.Context, user *User, req InsertSecretReq) error {
67+
var resp interface{}
68+
return c.requestBody(ctx, http.MethodPost, "/api/users/"+user.ID+"/secrets", req, &resp)
69+
}
70+
71+
// DeleteSecretByName deletes the authenticated users secret with the given name
72+
func (c *Client) DeleteSecretByName(ctx context.Context, name, userID string) error {
73+
secret, err := c.SecretByName(ctx, name, userID)
74+
if err != nil {
75+
return err
76+
}
77+
_, err = c.request(ctx, http.MethodDelete, "/api/users/"+userID+"/secrets/"+secret.ID, nil)
78+
return err
79+
}

coder-sdk/users.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package coder
2+
3+
import (
4+
"context"
5+
"net/http"
6+
"time"
7+
)
8+
9+
// User describes a Coder user account.
10+
type User struct {
11+
ID string `json:"id" tab:"-"`
12+
Email string `json:"email"`
13+
Username string `json:"username"`
14+
Name string `json:"name"`
15+
CreatedAt time.Time `json:"created_at"`
16+
UpdatedAt time.Time `json:"updated_at" tab:"-"`
17+
}
18+
19+
// Me gets the details of the authenticated user.
20+
func (c Client) Me(ctx context.Context) (*User, error) {
21+
return c.UserByID(ctx, Me)
22+
}
23+
24+
// UserByID get the details of a user by their id.
25+
func (c Client) UserByID(ctx context.Context, id string) (*User, error) {
26+
var u User
27+
err := c.requestBody(ctx, http.MethodGet, "/api/users/"+id, nil, &u)
28+
if err != nil {
29+
return nil, err
30+
}
31+
return &u, nil
32+
}
33+
34+
// SSHKey describes an SSH keypair
35+
type SSHKey struct {
36+
PublicKey string `json:"public_key"`
37+
PrivateKey string `json:"private_key"`
38+
}
39+
40+
// SSHKey gets the current SSH kepair of the authenticated user.
41+
func (c Client) SSHKey(ctx context.Context) (*SSHKey, error) {
42+
var key SSHKey
43+
err := c.requestBody(ctx, http.MethodGet, "/api/users/me/sshkey", nil, &key)
44+
if err != nil {
45+
return nil, err
46+
}
47+
return &key, nil
48+
}
49+
50+
// Users gets the list of user accounts.
51+
func (c Client) Users(ctx context.Context) ([]User, error) {
52+
var u []User
53+
err := c.requestBody(ctx, http.MethodGet, "/api/users", nil, &u)
54+
if err != nil {
55+
return nil, err
56+
}
57+
return u, nil
58+
}
59+
60+
// UserByEmail gets a user by email.
61+
func (c Client) UserByEmail(ctx context.Context, email string) (*User, error) {
62+
if email == Me {
63+
return c.Me(ctx)
64+
}
65+
users, err := c.Users(ctx)
66+
if err != nil {
67+
return nil, err
68+
}
69+
for _, u := range users {
70+
if u.Email == email {
71+
return &u, nil
72+
}
73+
}
74+
return nil, ErrNotFound
75+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy