dnote/pkg/server/controllers/users.go
2021-01-04 22:07:37 +11:00

87 lines
2 KiB
Go

package controllers
import (
"encoding/json"
"net/http"
"github.com/dnote/dnote/pkg/server/app"
"github.com/dnote/dnote/pkg/server/config"
"github.com/dnote/dnote/pkg/server/log"
"github.com/dnote/dnote/pkg/server/views"
)
// NewUsers creates a new Users controller.
// It panics if the necessary templates are not parsed.
func NewUsers(cfg config.Config, app *app.App) *Users {
return &Users{
NewView: views.NewView(cfg.PageTemplateDir, views.Config{Title: "Join", Layout: "base"}, "users/new"),
LoginView: views.NewView(cfg.PageTemplateDir, views.Config{Title: "Login", Layout: "base"}, "users/login"),
onPremise: cfg.OnPremise,
app: app,
}
}
// Users is a user controller.
type Users struct {
NewView *views.View
LoginView *views.View
app *app.App
onPremise bool
}
// New handles GET /register
func (u *Users) New(w http.ResponseWriter, r *http.Request) {
var form RegistrationForm
parseURLParams(r, &form)
u.NewView.Render(w, r, form)
}
// RegistrationForm is the form data for registering
type RegistrationForm struct {
Email string `schema:"email"`
Password string `schema:"password"`
}
// LoginForm is the form data for log in
type LoginForm struct {
Email string `schema:"email" json:"email"`
Password string `schema:"password" json:"password"`
}
func (u *Users) Login(w http.ResponseWriter, r *http.Request) {
var form LoginForm
if err := parseRequestData(r, &form); err != nil {
log.Error(err.Error())
w.WriteHeader(500)
return
}
user, err := u.app.Authenticate(form.Email, form.Password)
if err != nil {
log.Error(err.Error())
w.WriteHeader(500)
return
}
session, err := u.app.SignIn(user)
if err != nil {
log.Error(err.Error())
w.WriteHeader(500)
return
}
setSessionCookie(w, session.Key, session.ExpiresAt)
response := SessionResponse{
Key: session.Key,
ExpiresAt: session.ExpiresAt.Unix(),
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(200)
if err := json.NewEncoder(w).Encode(response); err != nil {
log.Error(err.Error())
return
}
}