package controllers import ( "log" "net/http" "git.kirsle.net/apps/gophertype/pkg/authentication" "git.kirsle.net/apps/gophertype/pkg/glue" "git.kirsle.net/apps/gophertype/pkg/models" "git.kirsle.net/apps/gophertype/pkg/responses" "git.kirsle.net/apps/gophertype/pkg/session" "github.com/albrow/forms" ) func init() { glue.Register(glue.Endpoint{ Path: "/login", Methods: []string{"GET", "POST"}, Handler: func(w http.ResponseWriter, r *http.Request) { // Template variables. v := responses.NewTemplateVars(w, r) // POST handler: create the admin account. for r.Method == http.MethodPost { form, _ := forms.Parse(r) v.FormValues = form.Values // Validate form parameters. val := form.Validator() val.Require("email") val.MatchEmail("email") val.Require("password") if val.HasErrors() { v.ValidationError = val.ErrorMap() log.Printf("validation: %+v", v.ValidationError) break } // Check authentication. user, err := models.AuthenticateUser(form.Get("email"), form.Get("password")) if err != nil { v.Error = err break } _ = user authentication.Login(w, r, user) session.Flash(w, r, "Signed in!") responses.Redirect(w, r, "/") // TODO: next URL return } responses.RenderTemplate(w, r, "_builtin/users/login.gohtml", v) }, }) glue.Register(glue.Endpoint{ Path: "/logout", Handler: func(w http.ResponseWriter, r *http.Request) { authentication.Logout(w, r) session.Flash(w, r, "Signed out!") responses.Redirect(w, r, "/") }, }) }