Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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=<email> --password=<password>`
1. Register your user account: `fathom user add --email=<email> --password=<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).
Expand Down
2 changes: 1 addition & 1 deletion cmd/fathom/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func main() {
app.After = after
app.Commands = []cli.Command{
serverCmd,
registerCmd,
userCmd,
statsCmd,
}

Expand Down
57 changes: 0 additions & 57 deletions cmd/fathom/register.go

This file was deleted.

99 changes: 99 additions & 0 deletions cmd/fathom/user.go
Original file line number Diff line number Diff line change
@@ -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
}
1 change: 1 addition & 0 deletions pkg/datastore/datastore.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions pkg/datastore/sqlstore/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down