Add user list command #427

Merged
6543 merged 9 commits from admin-list-users into main 2022-09-13 19:49:35 +00:00
6 changed files with 122 additions and 1 deletions

55
cmd/admin.go Normal file
View File

@ -0,0 +1,55 @@
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package cmd
import (
"code.gitea.io/tea/cmd/admin/users"
"code.gitea.io/tea/modules/context"
"code.gitea.io/tea/modules/print"
"github.com/urfave/cli/v2"
)
// CmdAdmin represents the namespace of admin commands.
// The command itself has no functionality, but hosts subcommands.
var CmdAdmin = cli.Command{
Name: "admin",
Usage: "Operations requiring admin access on the Gitea instance",
Aliases: []string{"a"},
noerw marked this conversation as resolved
Review

return cli.ShowCommandHelp(cmd, "") would be a good default behaviour i think

`return cli.ShowCommandHelp(cmd, "")` would be a good default behaviour i think
Category: catMisc,
Action: func(cmd *cli.Context) error {
return cli.ShowSubcommandHelp(cmd)
},
Subcommands: []*cli.Command{
&cmdAdminUsers,
},
}
var cmdAdminUsers = cli.Command{
Name: "users",
Aliases: []string{"u"},
Usage: "Manage registered users",
Action: func(ctx *cli.Context) error {
if ctx.Args().Len() == 1 {
return runAdminUserDetail(ctx, ctx.Args().First())
}
return users.RunUserList(ctx)
},
Subcommands: []*cli.Command{
&users.CmdUserList,
},
Flags: users.CmdUserList.Flags,
}
func runAdminUserDetail(cmd *cli.Context, u string) error {
ctx := context.InitCommand(cmd)
client := ctx.Login.Client()
user, _, err := client.GetUserInfo(u)
if err != nil {
return err
}
print.UserDetails(user)
return nil
}

54
cmd/admin/users/list.go Normal file
View File

@ -0,0 +1,54 @@
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package users
import (
"code.gitea.io/tea/cmd/flags"
"code.gitea.io/tea/modules/context"
"code.gitea.io/tea/modules/print"
"code.gitea.io/sdk/gitea"
"github.com/urfave/cli/v2"
)
var userFieldsFlag = flags.FieldsFlag(print.UserFields, []string{
"id", "login", "full_name", "email", "activated",
})
// CmdUserList represents a sub command of users to list users
var CmdUserList = cli.Command{
Name: "list",
Aliases: []string{"ls"},
Usage: "List Users",
Description: "List users",
Action: RunUserList,
Flags: append([]cli.Flag{
userFieldsFlag,
&flags.PaginationPageFlag,
&flags.PaginationLimitFlag,
}, flags.AllDefaultFlags...),
}
// RunUserList list users
func RunUserList(cmd *cli.Context) error {
ctx := context.InitCommand(cmd)
fields, err := userFieldsFlag.GetValues(cmd)
if err != nil {
return err
}
client := ctx.Login.Client()
users, _, err := client.AdminListUsers(gitea.AdminListUsersOptions{
ListOptions: ctx.GetListOptions(),
})
noerw marked this conversation as resolved Outdated
Outdated
Review

if you put that before the request, flag validation will fail faster (i.e. before waiting for the request)

if you put that before the request, flag validation will fail faster (i.e. before waiting for the request)
if err != nil {
return err
}
print.UserList(users, ctx.Output, fields)
return nil
}

View File

@ -8,4 +8,5 @@ var (
catSetup = "SETUP"
catEntities = "ENTITIES"
catHelpers = "HELPERS"
catMisc = "MISCELLANEOUS"
noerw marked this conversation as resolved Outdated
Outdated
Review

if we put all admin commands under the tea admin namespace, do we need a ADMIN category? the admin command will be the only one in this category.. though I agree it shouldn't be in any of the existing categories.. hm.
maybe rename it to a more generic MISC?

if we put all admin commands under the `tea admin` namespace, do we need a `ADMIN` category? the admin command will be the only one in this category.. though I agree it shouldn't be in any of the existing categories.. hm. maybe rename it to a more generic `MISC`?
)

View File

@ -14,7 +14,7 @@ import (
// CmdWhoami represents the command to show current logged in user
var CmdWhoami = cli.Command{
Name: "whoami",
Category: catSetup,
Category: catMisc,
Description: `For debugging purposes, show the user that is currently logged in.`,
Usage: "Show current logged in user",
ArgsUsage: " ", // command does not accept arguments

View File

@ -54,6 +54,8 @@ func main() {
&cmd.CmdOpen,
&cmd.CmdNotifications,
&cmd.CmdRepoClone,
&cmd.CmdAdmin,
}
app.EnableBashCompletion = true
err := app.Run(os.Args)

View File

@ -77,6 +77,9 @@ var UserFields = []string{
"website",
"description",
"visibility",
"activated",
"lastlogin_at",
"created_at",
}
type printableUser struct{ *gitea.User }
@ -113,6 +116,8 @@ func (x printableUser) FormatField(field string, machineReadable bool) string {
return formatBoolean(x.Restricted, !machineReadable)
case "prohibit_login":
return formatBoolean(x.ProhibitLogin, !machineReadable)
case "activated":
return formatBoolean(x.IsActive, !machineReadable)
case "location":
return x.Location
case "website":
@ -121,6 +126,10 @@ func (x printableUser) FormatField(field string, machineReadable bool) string {
return x.Description
case "visibility":
return string(x.Visibility)
case "created_at":
return FormatTime(x.Created, machineReadable)
case "lastlogin_at":
return FormatTime(x.LastLogin, machineReadable)
}
return ""
}