Create a Sign up page and handler and route
This commit is contained in:
parent
c0087ba978
commit
41c80386b5
@ -17,6 +17,69 @@ func LoginGETHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
|
|||||||
return e.Rends(w, r, "users/login")
|
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 {
|
func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
|
||||||
type loginForm struct {
|
type loginForm struct {
|
||||||
Username string
|
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)
|
err = e.Auth.Login(w, r, form.Username, form.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == auth.ErrInvalidPassword || err == ErrUnknownUser {
|
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 e.Rends(w, r, "users/login")
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
@ -49,6 +112,7 @@ func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
e.Log.Debugf("redirecting to %s", path)
|
e.Log.Debugf("redirecting to %s", path)
|
||||||
if path != "" {
|
if path != "" {
|
||||||
http.Redirect(w, r, path, http.StatusTemporaryRedirect)
|
http.Redirect(w, r, path, http.StatusTemporaryRedirect)
|
||||||
|
@ -75,6 +75,17 @@ func (u *User) SetConfig(key string, v interface{}) error {
|
|||||||
return u.RawConfig.UnmarshalJSON(b)
|
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
|
// Token represents a token
|
||||||
type Token struct {
|
type Token struct {
|
||||||
sqly.BaseModel
|
sqly.BaseModel
|
||||||
|
@ -72,6 +72,8 @@ func main() {
|
|||||||
env.Handle("/", movies.ExplorePopular).Name("movies.home")
|
env.Handle("/", movies.ExplorePopular).Name("movies.home")
|
||||||
env.Handle("/users/login", users.LoginGETHandler).Name("users.login").Methods("GET")
|
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/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/logout", users.LogoutHandler).Name("users.logout")
|
||||||
env.Handle("/users/details", users.DetailsHandler).Name("users.details").WithRole(users.UserRole)
|
env.Handle("/users/details", users.DetailsHandler).Name("users.details").WithRole(users.UserRole)
|
||||||
env.Handle("/users/edit", users.EditHandler).Name("users.edit").WithRole(users.UserRole)
|
env.Handle("/users/edit", users.EditHandler).Name("users.edit").WithRole(users.UserRole)
|
||||||
|
39
src/templates/users/signup.tmpl
Normal file
39
src/templates/users/signup.tmpl
Normal 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>
|
Loading…
x
Reference in New Issue
Block a user