Merge branch 'update' into 'master'

Update

See merge request !18
This commit is contained in:
Grégoire Delattre 2016-11-13 13:20:47 +00:00
commit f42a813516
8 changed files with 198 additions and 49 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") 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)

View File

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

View File

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

View File

@ -0,0 +1,9 @@
{{ if $.Data.Errors }}
<div class="row">
<div class="col-md-6 col-md-offset-3 col-xs-12">
<div class="alert alert-warning">
<p>{{ $.Data.Errors }}</p>
</div>
</div>
</div>
{{ end }}

View File

@ -10,6 +10,8 @@
</head> </head>
<body> <body>
{{ template "errors" $ }}
{{ template "success" $ }}
{{ template "navbar" $ }} {{ template "navbar" $ }}
<div class="container-fluid"> <div class="container-fluid">
<div class="container"> <div class="container">

View File

@ -1,4 +1,5 @@
<nav class="navbar navbar-inverse navbar-fixed-top"> <nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="container-fluid"> <div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display --> <!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header"> <div class="navbar-header">
@ -14,17 +15,27 @@
<!-- Collect the nav links, forms, and other content for toggling --> <!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li><p class="navbar-text">Library: </p></li>
<li {{ if eq $.Route "movies.polochon" }}class="active"{{ end }}>
<a href="{{ URL "movies.polochon" }}?limit=10">Movies{{ if eq $.Route "movies.polochon" }}<span class="sr-only">(current)</span>{{ end }}</a>
</li>
<li><a href="#">TV Shows</a></li>
<li><p class="navbar-text">Explore: </p></li>
<li><a href="{{ URL "movies.explore.popular"}}">Movies</a></li> <li><a href="{{ URL "movies.explore.popular"}}">Movies</a></li>
<li><a href="#">TV Shows</a></li> <li><a href="#">TV Shows</a></li>
{{ if $.Data.user }}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-list"></i>
My Library
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li {{ if eq $.Route "movies.polochon" }}class="active"{{ end }}>
<a href="{{ URL "movies.polochon" }}?limit=10">Movies{{ if eq $.Route "movies.polochon" }}<span class="sr-only">Movies</span>{{ end }}</a>
</li>
<li>
<a href="#">
TVShows
</a>
</li>
</ul>
</li>
{{ end }}
</ul> </ul>
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
@ -45,14 +56,16 @@
</ul> </ul>
</li> </li>
{{ else }} {{ else }}
<ul class="nav navbar-nav navbar-right">
<li> <li>
<a href="{{ URL "users.login"}}">Sign in</a> <a href="{{ URL "users.login"}}">Sign in</a>
</li> </li>
</ul> <li>
<a href="{{ URL "users.signup"}}">Sign up</a>
</li>
{{ end }} {{ end }}
</ul> </ul>
</div><!-- /.navbar-collapse --> </div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid --> </div><!-- /.container-fluid -->
</div><!-- /.container -->
</nav> </nav>

View File

@ -0,0 +1,9 @@
{{ if $.Data.Success }}
<div class="row">
<div class="col-xs-12">
<div class="alert alert-success">
{{ $.Data.Success }}
</div>
</div>
</div>
{{ end }}

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>