From 832136b6d4afa63a1262df9e1fbf1d8544703a7a Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Wed, 14 Sep 2022 03:49:34 +0800 Subject: [PATCH] Add user list command (#427) Co-authored-by: Matti R Co-authored-by: Norwin Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: Norwin Reviewed-on: https://gitea.com/gitea/tea/pulls/427 Reviewed-by: Norwin Reviewed-by: 6543 <6543@obermui.de> Co-authored-by: techknowlogick Co-committed-by: techknowlogick --- cmd/admin.go | 55 +++++++++++++++++++++++++++++++++++++++++ cmd/admin/users/list.go | 54 ++++++++++++++++++++++++++++++++++++++++ cmd/categories.go | 1 + cmd/whoami.go | 2 +- main.go | 2 ++ modules/print/user.go | 9 +++++++ 6 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 cmd/admin.go create mode 100644 cmd/admin/users/list.go diff --git a/cmd/admin.go b/cmd/admin.go new file mode 100644 index 0000000..b20ead3 --- /dev/null +++ b/cmd/admin.go @@ -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"}, + 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 +} diff --git a/cmd/admin/users/list.go b/cmd/admin/users/list.go new file mode 100644 index 0000000..8205aed --- /dev/null +++ b/cmd/admin/users/list.go @@ -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(), + }) + if err != nil { + return err + } + + print.UserList(users, ctx.Output, fields) + + return nil +} diff --git a/cmd/categories.go b/cmd/categories.go index 4b2088b..f3bb3d5 100644 --- a/cmd/categories.go +++ b/cmd/categories.go @@ -8,4 +8,5 @@ var ( catSetup = "SETUP" catEntities = "ENTITIES" catHelpers = "HELPERS" + catMisc = "MISCELLANEOUS" ) diff --git a/cmd/whoami.go b/cmd/whoami.go index 2b56828..81d7713 100644 --- a/cmd/whoami.go +++ b/cmd/whoami.go @@ -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 diff --git a/main.go b/main.go index 1fc60bb..4110759 100644 --- a/main.go +++ b/main.go @@ -54,6 +54,8 @@ func main() { &cmd.CmdOpen, &cmd.CmdNotifications, &cmd.CmdRepoClone, + + &cmd.CmdAdmin, } app.EnableBashCompletion = true err := app.Run(os.Args) diff --git a/modules/print/user.go b/modules/print/user.go index 301685a..52380d3 100644 --- a/modules/print/user.go +++ b/modules/print/user.go @@ -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 "" }