@@ -2,10 +2,13 @@ package cli
2
2
3
3
import (
4
4
"fmt"
5
+ "os"
5
6
"strings"
6
7
"time"
7
8
9
+ "github.com/google/uuid"
8
10
"github.com/spf13/cobra"
11
+ "golang.org/x/exp/slices"
9
12
"golang.org/x/xerrors"
10
13
11
14
"github.com/coder/coder/cli/cliflag"
@@ -83,12 +86,47 @@ func createToken() *cobra.Command {
83
86
return cmd
84
87
}
85
88
89
+ // tokenListRow is the type provided to the OutputFormatter.
90
+ type tokenListRow struct {
91
+ // For JSON format:
92
+ codersdk.APIKey `table:"-"`
93
+
94
+ // For table format:
95
+ ID string `json:"-" table:"id,default_sort"`
96
+ LastUsed time.Time `json:"-" table:"last used"`
97
+ ExpiresAt time.Time `json:"-" table:"expires at"`
98
+ CreatedAt time.Time `json:"-" table:"created at"`
99
+ Owner string `json:"-" table:"owner"`
100
+ }
101
+
102
+ func tokenListRowFromToken (token codersdk.APIKey , usersByID map [uuid.UUID ]codersdk.User ) tokenListRow {
103
+ user := usersByID [token .UserID ]
104
+
105
+ return tokenListRow {
106
+ APIKey : token ,
107
+ ID : token .ID ,
108
+ LastUsed : token .LastUsed ,
109
+ ExpiresAt : token .ExpiresAt ,
110
+ CreatedAt : token .CreatedAt ,
111
+ Owner : user .Username ,
112
+ }
113
+ }
114
+
86
115
func listTokens () * cobra.Command {
87
- formatter := cliui .NewOutputFormatter (
88
- cliui .TableFormat ([]codersdk.APIKey {}, nil ),
89
- cliui .JSONFormat (),
90
- )
116
+ // we only display the 'owner' column if the --all argument is passed in
117
+ defaultCols := []string {"id" , "last used" , "expires at" , "created at" }
118
+ if slices .Contains (os .Args , "-a" ) || slices .Contains (os .Args , "--all" ) {
119
+ defaultCols = append (defaultCols , "owner" )
120
+ }
91
121
122
+ var (
123
+ all bool
124
+ displayTokens []tokenListRow
125
+ formatter = cliui .NewOutputFormatter (
126
+ cliui .TableFormat ([]tokenListRow {}, defaultCols ),
127
+ cliui .JSONFormat (),
128
+ )
129
+ )
92
130
cmd := & cobra.Command {
93
131
Use : "list" ,
94
132
Aliases : []string {"ls" },
@@ -99,18 +137,36 @@ func listTokens() *cobra.Command {
99
137
return xerrors .Errorf ("create codersdk client: %w" , err )
100
138
}
101
139
102
- keys , err := client .Tokens (cmd .Context (), codersdk .Me )
140
+ tokens , err := client .Tokens (cmd .Context (), codersdk .Me , codersdk.TokensFilter {
141
+ IncludeAll : all ,
142
+ })
103
143
if err != nil {
104
- return xerrors .Errorf ("create tokens: %w" , err )
144
+ return xerrors .Errorf ("list tokens: %w" , err )
105
145
}
106
146
107
- if len (keys ) == 0 {
147
+ if len (tokens ) == 0 {
108
148
cmd .Println (cliui .Styles .Wrap .Render (
109
149
"No tokens found." ,
110
150
))
111
151
}
112
152
113
- out , err := formatter .Format (cmd .Context (), keys )
153
+ userRes , err := client .Users (cmd .Context (), codersdk.UsersRequest {})
154
+ if err != nil {
155
+ return err
156
+ }
157
+
158
+ usersByID := map [uuid.UUID ]codersdk.User {}
159
+ for _ , user := range userRes .Users {
160
+ usersByID [user .ID ] = user
161
+ }
162
+
163
+ displayTokens = make ([]tokenListRow , len (tokens ))
164
+
165
+ for i , token := range tokens {
166
+ displayTokens [i ] = tokenListRowFromToken (token , usersByID )
167
+ }
168
+
169
+ out , err := formatter .Format (cmd .Context (), displayTokens )
114
170
if err != nil {
115
171
return err
116
172
}
@@ -120,6 +176,9 @@ func listTokens() *cobra.Command {
120
176
},
121
177
}
122
178
179
+ cmd .Flags ().BoolVarP (& all , "all" , "a" , false ,
180
+ "Specifies whether all users' tokens will be listed or not (must have Owner role to see all tokens)." )
181
+
123
182
formatter .AttachFlags (cmd )
124
183
return cmd
125
184
}
0 commit comments