From 7c3adcb10be24d40d8dfc19c74136e48ac9631b9 Mon Sep 17 00:00:00 2001 From: Danny van Kooten Date: Wed, 26 Sep 2018 14:44:13 +0200 Subject: [PATCH] rework user cli management --- cmd/fathom/main.go | 2 +- cmd/fathom/register.go | 57 ------------------- cmd/fathom/user.go | 99 +++++++++++++++++++++++++++++++++ pkg/datastore/datastore.go | 1 + pkg/datastore/sqlstore/users.go | 7 +++ 5 files changed, 108 insertions(+), 58 deletions(-) delete mode 100644 cmd/fathom/register.go create mode 100644 cmd/fathom/user.go diff --git a/cmd/fathom/main.go b/cmd/fathom/main.go index 732533d..f756053 100644 --- a/cmd/fathom/main.go +++ b/cmd/fathom/main.go @@ -38,7 +38,7 @@ func main() { app.After = after app.Commands = []cli.Command{ serverCmd, - registerCmd, + userCmd, statsCmd, } diff --git a/cmd/fathom/register.go b/cmd/fathom/register.go deleted file mode 100644 index 31e3c01..0000000 --- a/cmd/fathom/register.go +++ /dev/null @@ -1,57 +0,0 @@ -package main - -import ( - "errors" - "fmt" - - log "github.com/sirupsen/logrus" - "github.com/urfave/cli" - "github.com/usefathom/fathom/pkg/models" -) - -var registerCmd = cli.Command{ - Name: "register", - Usage: "register a new admin user", - Action: register, - Flags: []cli.Flag{ - cli.StringFlag{ - Name: "email, e", - Usage: "user email", - }, - cli.StringFlag{ - Name: "password, p", - Usage: "user password", - }, - cli.BoolFlag{ - Name: "skip-bcrypt", - Usage: "store password string as is, skipping bcrypt", - }, - }, -} - -func register(c *cli.Context) error { - email := c.String("email") - if email == "" { - return errors.New("Invalid arguments: missing email") - } - - password := c.String("password") - if password == "" { - return errors.New("Invalid arguments: missing password") - } - - user := models.NewUser(email, password) - - // set password manually if --skip-bcrypt was given - // this is used to supply an already encrypted password string - if c.Bool("skip-bcrypt") { - user.Password = password - } - - if err := app.database.SaveUser(&user); err != nil { - return fmt.Errorf("Error creating user: %s", err) - } - - log.Infof("Created user %s", user.Email) - return nil -} diff --git a/cmd/fathom/user.go b/cmd/fathom/user.go new file mode 100644 index 0000000..e95d123 --- /dev/null +++ b/cmd/fathom/user.go @@ -0,0 +1,99 @@ +package main + +import ( + "errors" + "fmt" + + log "github.com/sirupsen/logrus" + "github.com/urfave/cli" + "github.com/usefathom/fathom/pkg/datastore" + "github.com/usefathom/fathom/pkg/models" +) + +var userCmd = cli.Command{ + Name: "user", + Usage: "manage registered admin users", + Action: userAdd, + Subcommands: []cli.Command{ + cli.Command{ + Name: "add", + Aliases: []string{"register"}, + Action: userAdd, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "email, e", + Usage: "user email", + }, + cli.StringFlag{ + Name: "password, p", + Usage: "user password", + }, + cli.BoolFlag{ + Name: "skip-bcrypt", + Usage: "store password string as-is, skipping bcrypt", + }, + }, + }, + cli.Command{ + Name: "delete", + Action: userDelete, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "email, e", + Usage: "user email", + }, + }, + }, + }, +} + +func userAdd(c *cli.Context) error { + email := c.String("email") + if email == "" { + return errors.New("Invalid arguments: missing email") + } + + password := c.String("password") + if password == "" { + return errors.New("Invalid arguments: missing password") + } + + user := models.NewUser(email, password) + + // set password manually if --skip-bcrypt was given + // this is used to supply an already encrypted password string + if c.Bool("skip-bcrypt") { + user.Password = password + } + + if err := app.database.SaveUser(&user); err != nil { + return fmt.Errorf("Error creating user: %s", err) + } + + log.Infof("Created user %s", user.Email) + return nil +} + +func userDelete(c *cli.Context) error { + email := c.String("email") + if email == "" { + return errors.New("Invalid arguments: missing email") + } + + user, err := app.database.GetUserByEmail(email) + if err != nil { + if err == datastore.ErrNoResults { + return fmt.Errorf("No user with email %s", email) + } + + return err + } + + if err := app.database.DeleteUser(user); err != nil { + return err + } + + log.Infof("Deleted user %s", user.Email) + + return nil +} diff --git a/pkg/datastore/datastore.go b/pkg/datastore/datastore.go index 82b22f8..59270f0 100644 --- a/pkg/datastore/datastore.go +++ b/pkg/datastore/datastore.go @@ -16,6 +16,7 @@ type Datastore interface { GetUser(int64) (*models.User, error) GetUserByEmail(string) (*models.User, error) SaveUser(*models.User) error + DeleteUser(*models.User) error CountUsers() (int64, error) // site stats diff --git a/pkg/datastore/sqlstore/users.go b/pkg/datastore/sqlstore/users.go index 3c5dd6f..a838613 100644 --- a/pkg/datastore/sqlstore/users.go +++ b/pkg/datastore/sqlstore/users.go @@ -51,6 +51,13 @@ func (db *sqlstore) SaveUser(u *models.User) error { return nil } +// DeleteUser deletes the user in the datastore +func (db *sqlstore) DeleteUser(user *models.User) error { + query := db.Rebind("DELETE FROM users WHERE id = ?") + _, err := db.Exec(query, user.ID) + return err +} + // CountUsers returns the number of users func (db *sqlstore) CountUsers() (int64, error) { var c int64