feat: add --shared-with-me flag to coder list command (#19948)

Closes
[coder/internal#1013](https://github.com/coder/internal/issues/1013)
This commit is contained in:
Brett Kolodny
2025-09-25 16:54:44 -04:00
committed by GitHub
parent a78790c632
commit 647101b421
2 changed files with 71 additions and 1 deletions
+25 -1
View File
@@ -95,6 +95,7 @@ func (r *RootCmd) list() *serpent.Command {
),
cliui.JSONFormat(),
)
sharedWithMe bool
)
cmd := &serpent.Command{
Annotations: workspaceCommand,
@@ -104,13 +105,36 @@ func (r *RootCmd) list() *serpent.Command {
Middleware: serpent.Chain(
serpent.RequireNArgs(0),
),
Options: serpent.OptionSet{
{
Name: "shared-with-me",
Description: "Show workspaces shared with you.",
Flag: "shared-with-me",
Value: serpent.BoolOf(&sharedWithMe),
Hidden: true,
},
},
Handler: func(inv *serpent.Invocation) error {
client, err := r.InitClient(inv)
if err != nil {
return err
}
res, err := QueryConvertWorkspaces(inv.Context(), client, filter.Filter(), WorkspaceListRowFromWorkspace)
workspaceFilter := filter.Filter()
if sharedWithMe {
user, err := client.User(inv.Context(), codersdk.Me)
if err != nil {
return xerrors.Errorf("fetch current user: %w", err)
}
workspaceFilter.SharedWithUser = user.ID.String()
// Unset the default query that conflicts with the --shared-with-me flag
if workspaceFilter.FilterQuery == "owner:me" {
workspaceFilter.FilterQuery = ""
}
}
res, err := QueryConvertWorkspaces(inv.Context(), client, workspaceFilter, WorkspaceListRowFromWorkspace)
if err != nil {
return err
}
+46
View File
@@ -13,6 +13,7 @@ import (
"github.com/coder/coder/v2/coderd/coderdtest"
"github.com/coder/coder/v2/coderd/database"
"github.com/coder/coder/v2/coderd/database/dbfake"
"github.com/coder/coder/v2/coderd/rbac"
"github.com/coder/coder/v2/codersdk"
"github.com/coder/coder/v2/pty/ptytest"
"github.com/coder/coder/v2/testutil"
@@ -100,4 +101,49 @@ func TestList(t *testing.T) {
require.Len(t, stderr.Bytes(), 0)
})
t.Run("SharedWorkspaces", func(t *testing.T) {
t.Parallel()
var (
client, db = coderdtest.NewWithDatabase(t, &coderdtest.Options{
DeploymentValues: coderdtest.DeploymentValues(t, func(dv *codersdk.DeploymentValues) {
dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)}
}),
})
orgOwner = coderdtest.CreateFirstUser(t, client)
memberClient, member = coderdtest.CreateAnotherUser(t, client, orgOwner.OrganizationID, rbac.ScopedRoleOrgAuditor(orgOwner.OrganizationID))
sharedWorkspace = dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
Name: "wibble",
OwnerID: orgOwner.UserID,
OrganizationID: orgOwner.OrganizationID,
}).Do().Workspace
_ = dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
Name: "wobble",
OwnerID: orgOwner.UserID,
OrganizationID: orgOwner.OrganizationID,
}).Do().Workspace
)
ctx := testutil.Context(t, testutil.WaitMedium)
client.UpdateWorkspaceACL(ctx, sharedWorkspace.ID, codersdk.UpdateWorkspaceACL{
UserRoles: map[string]codersdk.WorkspaceRole{
member.ID.String(): codersdk.WorkspaceRoleUse,
},
})
inv, root := clitest.New(t, "list", "--shared-with-me", "--output=json")
clitest.SetupConfig(t, memberClient, root)
stdout := new(bytes.Buffer)
inv.Stdout = stdout
err := inv.WithContext(ctx).Run()
require.NoError(t, err)
var workspaces []codersdk.Workspace
require.NoError(t, json.Unmarshal(stdout.Bytes(), &workspaces))
require.Len(t, workspaces, 1)
require.Equal(t, sharedWorkspace.ID, workspaces[0].ID)
})
}