mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 00:32:25 -05:00 
			
		
		
		
	[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
					
				
			
		
					 5 changed files with 81 additions and 0 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue