diff --git a/src/internal/users/handlers.go b/src/internal/users/handlers.go index e6a38ff..122a254 100644 --- a/src/internal/users/handlers.go +++ b/src/internal/users/handlers.go @@ -17,6 +17,69 @@ func LoginGETHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error { return e.Rends(w, r, "users/login") } +func SignupGETHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error { + return e.Rends(w, r, "users/signup") +} + +func SignupPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error { + type newForm struct { + Username string + Password string + PasswordVerify string + } + e.Log.Debugf("creating new user ...") + + err := r.ParseForm() + if err != nil { + return err + } + + form := new(newForm) + decoder := schema.NewDecoder() + err = decoder.Decode(form, r.PostForm) + if err != nil { + return err + } + + user := User{ + Name: form.Username, + } + if form.Password != "" || form.PasswordVerify != "" { + if form.Password != form.PasswordVerify { + data.SetData(r, "Errors", "Password mismatch") + return e.Rends(w, r, "users/signup") + } + user.Hash, err = e.Auth.GenHash(form.Password) + if err != nil { + return err + } + } + + err = user.NewConfig() + if err != nil { + return err + } + + err = user.Add(e.Database) + if err != nil { + pretty.Println(err) + return err + } + e.Log.Debugf("new user %s created ...", form.Username) + + err = e.Auth.Login(w, r, form.Username, form.Password) + if err != nil { + if err == auth.ErrInvalidPassword || err == ErrUnknownUser { + data.SetData(r, "Errors", "Error invalid user or password") + return e.Rends(w, r, "users/signup") + } + return err + } + + http.Redirect(w, r, "/", http.StatusTemporaryRedirect) + return nil +} + func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error { type loginForm struct { Username string @@ -38,7 +101,7 @@ func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error err = e.Auth.Login(w, r, form.Username, form.Password) if err != nil { if err == auth.ErrInvalidPassword || err == ErrUnknownUser { - data.SetData(r, "FormErrors", "Error invalid user or password") + data.SetData(r, "Errors", "Error invalid user or password") return e.Rends(w, r, "users/login") } return err @@ -49,6 +112,7 @@ func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error if err != nil { return err } + e.Log.Debugf("redirecting to %s", path) if path != "" { http.Redirect(w, r, path, http.StatusTemporaryRedirect) diff --git a/src/internal/users/users.go b/src/internal/users/users.go index 5359dae..a0f036b 100644 --- a/src/internal/users/users.go +++ b/src/internal/users/users.go @@ -75,6 +75,17 @@ func (u *User) SetConfig(key string, v interface{}) error { return u.RawConfig.UnmarshalJSON(b) } +// NewConfig creates a new empty config +func (u *User) NewConfig() error { + var configMap map[string]*json.RawMessage + b, err := json.Marshal(configMap) + if err != nil { + return err + } + + return u.RawConfig.UnmarshalJSON(b) +} + // Token represents a token type Token struct { sqly.BaseModel diff --git a/src/main.go b/src/main.go index 90e474b..16ac02c 100644 --- a/src/main.go +++ b/src/main.go @@ -72,6 +72,8 @@ func main() { env.Handle("/", movies.ExplorePopular).Name("movies.home") env.Handle("/users/login", users.LoginGETHandler).Name("users.login").Methods("GET") env.Handle("/users/login", users.LoginPOSTHandler).Name("users.login").Methods("POST") + env.Handle("/users/signup", users.SignupGETHandler).Name("users.signup").Methods("GET") + env.Handle("/users/signup", users.SignupPOSTHandler).Name("users.signup").Methods("POST") env.Handle("/users/logout", users.LogoutHandler).Name("users.logout") env.Handle("/users/details", users.DetailsHandler).Name("users.details").WithRole(users.UserRole) env.Handle("/users/edit", users.EditHandler).Name("users.edit").WithRole(users.UserRole) diff --git a/src/templates/errors.tmpl b/src/templates/errors.tmpl new file mode 100644 index 0000000..56877aa --- /dev/null +++ b/src/templates/errors.tmpl @@ -0,0 +1,9 @@ +{{ if $.Data.Errors }} +
{{ $.Data.Errors }}
+