diff --git a/README.md b/README.md index 6783426b..c34ea2ea 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ For getting a development version of Fathom up & running, go through the followi 1. Get code: `git clone https://github.com/usefathom/fathom.git $GOPATH/src/github.com/usefathom/fathom` 1. Compile into binary & prepare assets: `make build` 1. (Optional) Set your [custom configuration values](https://github.com/usefathom/fathom/wiki/Configuration-file). -1. Register your user account: `fathom register --email= --password=` +1. Register your user account: `fathom user add --email= --password=` 1. Start the webserver: `fathom server` and then visit **http://localhost:8080** to access your analytics dashboard. To install and run Fathom in production, [have a look at the installation instructions](https://github.com/usefathom/fathom/wiki/Installing-&-running-Fathom). diff --git a/cmd/fathom/main.go b/cmd/fathom/main.go index 732533d9..f7560536 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 31e3c01d..00000000 --- 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 00000000..e95d1236 --- /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 82b22f88..59270f02 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 3c5dd6f3..a838613d 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