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

23 files changed

+241
-271
lines changed

Diff for: ci/integration/users_test.go

+2-2
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),
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
}

Diff for: internal/entclient/client.go renamed to coder-sdk/client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package entclient
1+
package coder
22

33
import (
44
"net/http"

Diff for: internal/entclient/devurl.go renamed to coder-sdk/devurl.go

+4-4
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,

Diff for: internal/entclient/env.go renamed to coder-sdk/env.go

+6-5
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"

Diff for: internal/entclient/error.go renamed to coder-sdk/error.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package entclient
1+
package coder
22

33
import (
44
"encoding/json"

Diff for: internal/entclient/org.go renamed to coder-sdk/org.go

+6-3
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
}

Diff for: internal/entclient/request.go renamed to coder-sdk/request.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package entclient
1+
package coder
22

33
import (
44
"bytes"

Diff for: coder-sdk/secrets.go

+79
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+
}

Diff for: coder-sdk/users.go

+75
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+
}

Diff for: internal/activity/pusher.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"context"
55
"time"
66

7-
"cdr.dev/coder-cli/internal/entclient"
7+
"cdr.dev/coder-cli/coder-sdk"
88
"golang.org/x/time/rate"
99

1010
"go.coder.com/flog"
@@ -18,12 +18,12 @@ type Pusher struct {
1818
envID string
1919
source string
2020

21-
client *entclient.Client
21+
client *coder.Client
2222
rate *rate.Limiter
2323
}
2424

2525
// NewPusher instantiates a new instance of Pusher
26-
func NewPusher(c *entclient.Client, envID, source string) *Pusher {
26+
func NewPusher(c *coder.Client, envID, source string) *Pusher {
2727
return &Pusher{
2828
envID: envID,
2929
source: source,

Diff for: internal/cmd/auth.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@ package cmd
33
import (
44
"net/url"
55

6+
"cdr.dev/coder-cli/coder-sdk"
67
"cdr.dev/coder-cli/internal/config"
7-
"cdr.dev/coder-cli/internal/entclient"
88
"golang.org/x/xerrors"
99

1010
"go.coder.com/flog"
1111
)
1212

1313
// requireAuth exits the process with a nonzero exit code if the user is not authenticated to make requests
14-
func requireAuth() *entclient.Client {
14+
func requireAuth() *coder.Client {
1515
client, err := newClient()
1616
if err != nil {
1717
flog.Fatal("%v", err)
1818
}
1919
return client
2020
}
2121

22-
func newClient() (*entclient.Client, error) {
22+
func newClient() (*coder.Client, error) {
2323
sessionToken, err := config.Session.Read()
2424
if err != nil {
2525
return nil, xerrors.Errorf("read session: %v (did you run coder login?)", err)
@@ -35,7 +35,7 @@ func newClient() (*entclient.Client, error) {
3535
return nil, xerrors.Errorf("url misformatted: %v (try runing coder login)", err)
3636
}
3737

38-
client := &entclient.Client{
38+
client := &coder.Client{
3939
BaseURL: u,
4040
Token: sessionToken,
4141
}

0 commit comments

Comments
 (0)