1
1
package cli
2
2
3
3
import (
4
+ "slices"
4
5
"sort"
6
+ "strings"
5
7
6
8
"golang.org/x/xerrors"
7
9
@@ -12,9 +14,20 @@ import (
12
14
13
15
func (r * RootCmd ) userEditRoles () * serpent.Command {
14
16
client := new (codersdk.Client )
17
+
18
+ var givenRoles []string
19
+
15
20
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
+ },
18
31
Middleware : serpent .Chain (serpent .RequireNArgs (1 ), r .InitClient (client )),
19
32
Handler : func (inv * serpent.Invocation ) error {
20
33
ctx := inv .Context ()
@@ -35,20 +48,41 @@ func (r *RootCmd) userEditRoles() *serpent.Command {
35
48
siteRoles = append (siteRoles , role .Name )
36
49
}
37
50
}
51
+ sort .Strings (siteRoles )
38
52
39
53
userRoles , err := client .UserRoles (ctx , user .Username )
40
54
if err != nil {
41
55
return xerrors .Errorf ("fetch user roles: %w" , err )
42
56
}
43
57
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
+
52
86
}
53
87
54
88
_ , err = client .UpdateUserRoles (ctx , user .Username , codersdk.UpdateRoles {
0 commit comments