Create a Sign up page and handler and route

This commit is contained in:
Lucas BEE 2016-11-13 13:23:56 +00:00
parent c0087ba978
commit 41c80386b5
4 changed files with 117 additions and 1 deletions

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -0,0 +1,39 @@
<div class="container">
<div class="content-fluid">
<div class="col-md-6 col-md-offset-3 col-xs-12">
<h2>Sign up</h2>
<hr>
<form accept-charset="UTF-8" action="{{ URL "users.signup" }}" method="POST" class="form-horizontal" id="new_user">
<div>
<p class="">
<label for="user_email">Username</label>
<br>
<input autofocus="autofocus" class="form-control" id="username" name="Username" type="username" value="">
<span class="error"></span>
</p>
</div>
<div>
<p class="">
<label for="user_password">Password</label>
<br>
<input autocomplete="off" class="form-control" id="password" name="Password" type="password" value="">
<span class="error"></span>
</p>
</div>
<div>
<p class="">
<label for="user_password">Confirm Password</label>
<br>
<input autocomplete="off" class="form-control" id="passwordVerify" name="PasswordVerify" type="password" value="">
<span class="error"></span>
</p>
</div>
<div>
<input class="btn btn-primary pull-right" type="submit" value="Sign up">
<br>
</div>
<a class="btn btn-default btn-sm pull-left" href="/movies/%3cnil%3e">Cancel</a>
</form>
</div>
</div>
</div>