Skip to content

Commit 681ecba

Browse files
committed
feat: add roles flag to user edit-roles command for passing in roles
1 parent 8908b96 commit 681ecba

File tree

1 file changed

+44
-10
lines changed

1 file changed

+44
-10
lines changed

cli/usereditroles.go

+44-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package cli
22

33
import (
4+
"slices"
45
"sort"
6+
"strings"
57

68
"golang.org/x/xerrors"
79

@@ -12,9 +14,20 @@ import (
1214

1315
func (r *RootCmd) userEditRoles() *serpent.Command {
1416
client := new(codersdk.Client)
17+
18+
var givenRoles []string
19+
1520
cmd := &serpent.Command{
16-
Use: "edit-roles <username|user_id>",
17-
Short: "Edit a user's roles by username or id",
21+
Use: "edit-roles <username|user_id>",
22+
Short: "Edit a user's roles by username or id",
23+
Options: []serpent.Option{
24+
cliui.SkipPromptOption(),
25+
{
26+
Name: "roles",
27+
Description: "A list of roles to give to the user. This removes any existing roles the user may have.",
28+
Flag: "roles",
29+
Value: serpent.StringArrayOf(&givenRoles)},
30+
},
1831
Middleware: serpent.Chain(serpent.RequireNArgs(1), r.InitClient(client)),
1932
Handler: func(inv *serpent.Invocation) error {
2033
ctx := inv.Context()
@@ -35,20 +48,41 @@ func (r *RootCmd) userEditRoles() *serpent.Command {
3548
siteRoles = append(siteRoles, role.Name)
3649
}
3750
}
51+
sort.Strings(siteRoles)
3852

3953
userRoles, err := client.UserRoles(ctx, user.Username)
4054
if err != nil {
4155
return xerrors.Errorf("fetch user roles: %w", err)
4256
}
4357

44-
sort.Strings(siteRoles)
45-
selectedRoles, err := cliui.MultiSelect(inv, cliui.MultiSelectOptions{
46-
Message: "Select the roles you'd like to assign to the user",
47-
Options: siteRoles,
48-
Defaults: userRoles.Roles,
49-
})
50-
if err != nil {
51-
return xerrors.Errorf("selecting roles for user: %w", err)
58+
var selectedRoles []string
59+
if len(givenRoles) > 0 {
60+
// If the none role is present ignore all other roles.
61+
// This is so there is a way to clear roles from the CLI without making a
62+
// new command.
63+
if slices.Contains(givenRoles, "none") {
64+
selectedRoles = []string{}
65+
} else {
66+
// Make sure all of the given roles are valid site roles
67+
for _, givenRole := range givenRoles {
68+
if !slices.Contains(siteRoles, givenRole) {
69+
siteRolesPretty := strings.Join(siteRoles, ", ")
70+
return xerrors.Errorf("The role %s is not valid. Please use one or more of the following roles: %s, or none\n", givenRole, siteRolesPretty)
71+
}
72+
}
73+
74+
selectedRoles = givenRoles
75+
}
76+
} else {
77+
selectedRoles, err = cliui.MultiSelect(inv, cliui.MultiSelectOptions{
78+
Message: "Select the roles you'd like to assign to the user",
79+
Options: siteRoles,
80+
Defaults: userRoles.Roles,
81+
})
82+
if err != nil {
83+
return xerrors.Errorf("selecting roles for user: %w", err)
84+
}
85+
5286
}
5387

5488
_, err = client.UpdateUserRoles(ctx, user.Username, codersdk.UpdateRoles{

0 commit comments

Comments
 (0)