[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:
parent
9e1756ce8b
commit
7d09863393
|
@ -21,6 +21,8 @@ import (
|
||||||
"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 @@ var Create action.GTSAction = func(ctx context.Context) error {
|
||||||
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
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -25,6 +25,8 @@ import (
|
||||||
|
|
||||||
// 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.
|
||||||
|
|
Loading…
Reference in New Issue