diff --git a/cmd/registeruser/main.go b/cmd/registeruser/main.go index fd573db..b642ff6 100644 --- a/cmd/registeruser/main.go +++ b/cmd/registeruser/main.go @@ -2,6 +2,8 @@ package main import ( "database/sql" + "encoding/json" + "errors" "fmt" "os" @@ -10,22 +12,64 @@ import ( "git.tilde.town/tildetown/town/towndb" ) -// TODO this command adds a new user to /town/var/town.db -// it's meant to be invoked by the welcome binary upon successfully -// creating a new user account +// this command adds a new user to /town/var/town.db. it's meant to be invoked +// by the welcome binary upon successfully creating a new user account -func _main(db *sql.DB) error { - return nil +func _main(tdb *sql.DB, userData towndb.TownUser) error { + if userData.Username == "" { + return errors.New("no username") + } + + if len(userData.Emails) == 0 { + return errors.New("no email set") + } + + for _, e := range userData.Emails { + if e == "" { + return errors.New("blank email in email list") + } + } + + if userData.IsAdmin { + return errors.New("please stop") + } + + if userData.State != towndb.StateActive { + return errors.New("bad state") + } + + return userData.Insert(tdb) +} + +func parseInput(stdin *os.File) (u towndb.TownUser, err error) { + var n int + input := make([]byte, 3000) // arbitrary + if n, err = stdin.Read(input); err != nil { + return + } + if n == 0 { + err = errors.New("nothing passed on input") + return + } + err = json.Unmarshal(input[0:n], &u) + return } func main() { - towndb, err := towndb.ConnectDB() + tdb, err := towndb.ConnectDB() if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } - if err = _main(towndb); err != nil { + + userData, err := parseInput(os.Stdin) + if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(2) } + + if err = _main(tdb, userData); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(3) + } }