[feature] Add list command to admin account (#1648)

* [feature] Add list command to admin account

Relates to: #388

* Print booleans as yes/no too
This commit is contained in:
Daenney 2023-03-27 16:02:26 +02:00 committed by GitHub
parent 9e1756ce8b
commit 7d09863393
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 81 additions and 0 deletions

View file

@ -21,6 +21,8 @@
"context" "context"
"errors" "errors"
"fmt" "fmt"
"os"
"text/tabwriter"
"time" "time"
"github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action" "github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action"
@ -93,6 +95,51 @@
return dbConn.Stop(ctx) return dbConn.Stop(ctx)
} }
// List returns all existing local accounts.
var List action.GTSAction = func(ctx context.Context) error {
var state state.State
state.Caches.Init()
state.Workers.Start()
dbConn, err := bundb.NewBunDBService(ctx, &state)
if err != nil {
return fmt.Errorf("error creating dbservice: %s", err)
}
// Set the state DB connection
state.DB = dbConn
users, err := dbConn.GetAllUsers(ctx)
if err != nil {
return err
}
fmtBool := func(b *bool) string {
if b == nil {
return "unknown"
}
if *b {
return "yes"
}
return "no"
}
fmtDate := func(t time.Time) string {
if t.Equal(time.Time{}) {
return "no"
}
return "yes"
}
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0)
fmt.Fprintln(w, "user\taccount\tapproved\tadmin\tmoderator\tsuspended\tconfirmed")
for _, u := range users {
fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", u.Account.Username, u.AccountID, fmtBool(u.Approved), fmtBool(u.Admin), fmtBool(u.Moderator), fmtDate(u.Account.SuspendedAt), fmtDate(u.ConfirmedAt))
}
w.Flush()
return nil
}
// Confirm sets a user to Approved, sets Email to the current UnconfirmedEmail value, and sets ConfirmedAt to now. // Confirm sets a user to Approved, sets Email to the current UnconfirmedEmail value, and sets ConfirmedAt to now.
var Confirm action.GTSAction = func(ctx context.Context) error { var Confirm action.GTSAction = func(ctx context.Context) error {
var state state.State var state state.State

View file

@ -54,6 +54,18 @@ func adminCommands() *cobra.Command {
config.AddAdminAccountCreate(adminAccountCreateCmd) config.AddAdminAccountCreate(adminAccountCreateCmd)
adminAccountCmd.AddCommand(adminAccountCreateCmd) adminAccountCmd.AddCommand(adminAccountCreateCmd)
adminAccountListCmd := &cobra.Command{
Use: "list",
Short: "list all existing local accounts",
PreRunE: func(cmd *cobra.Command, args []string) error {
return preRun(preRunArgs{cmd: cmd})
},
RunE: func(cmd *cobra.Command, args []string) error {
return run(cmd.Context(), account.List)
},
}
adminAccountCmd.AddCommand(adminAccountListCmd)
adminAccountConfirmCmd := &cobra.Command{ adminAccountConfirmCmd := &cobra.Command{
Use: "confirm", Use: "confirm",
Short: "confirm an existing local account manually, thereby skipping email confirmation", Short: "confirm an existing local account manually, thereby skipping email confirmation",

View file

@ -122,6 +122,20 @@ func (u *userDB) GetUserByConfirmationToken(ctx context.Context, confirmationTok
}, confirmationToken) }, confirmationToken)
} }
func (u *userDB) GetAllUsers(ctx context.Context) ([]*gtsmodel.User, db.Error) {
var users []*gtsmodel.User
q := u.conn.
NewSelect().
Model(&users).
Relation("Account")
if err := q.Scan(ctx); err != nil {
return nil, u.conn.ProcessError(err)
}
return users, nil
}
func (u *userDB) PutUser(ctx context.Context, user *gtsmodel.User) db.Error { func (u *userDB) PutUser(ctx context.Context, user *gtsmodel.User) db.Error {
return u.state.Caches.GTS.User().Store(user, func() error { return u.state.Caches.GTS.User().Store(user, func() error {
_, err := u.conn. _, err := u.conn.

View file

@ -29,6 +29,12 @@ type UserTestSuite struct {
BunDBStandardTestSuite BunDBStandardTestSuite
} }
func (suite *UserTestSuite) TestGetAllUsers() {
users, err := suite.db.GetAllUsers(context.Background())
suite.NoError(err)
suite.Len(users, len(suite.testUsers))
}
func (suite *UserTestSuite) TestGetUser() { func (suite *UserTestSuite) TestGetUser() {
user, err := suite.db.GetUserByID(context.Background(), suite.testUsers["local_account_1"].ID) user, err := suite.db.GetUserByID(context.Background(), suite.testUsers["local_account_1"].ID)
suite.NoError(err) suite.NoError(err)

View file

@ -25,6 +25,8 @@
// User contains functions related to user getting/setting/creation. // User contains functions related to user getting/setting/creation.
type User interface { type User interface {
// GetAllUsers returns all local user accounts, or an error if something goes wrong.
GetAllUsers(ctx context.Context) ([]*gtsmodel.User, Error)
// GetUserByID returns one user with the given ID, or an error if something goes wrong. // GetUserByID returns one user with the given ID, or an error if something goes wrong.
GetUserByID(ctx context.Context, id string) (*gtsmodel.User, Error) GetUserByID(ctx context.Context, id string) (*gtsmodel.User, Error)
// GetUserByAccountID returns one user by its account ID, or an error if something goes wrong. // GetUserByAccountID returns one user by its account ID, or an error if something goes wrong.