package controllers import ( "fmt" "html/template" "net/http" "git.kirsle.net/apps/gophertype/pkg/glue" "git.kirsle.net/apps/gophertype/pkg/mail" "git.kirsle.net/apps/gophertype/pkg/markdown" "git.kirsle.net/apps/gophertype/pkg/responses" "git.kirsle.net/apps/gophertype/pkg/session" "git.kirsle.net/apps/gophertype/pkg/settings" "github.com/albrow/forms" ) func init() { glue.Register(glue.Endpoint{ Path: "/contact", Methods: []string{"GET", "POST"}, Handler: ContactHandler, }) } // ContactHandler receives admin emails from users. func ContactHandler(w http.ResponseWriter, r *http.Request) { var ( v = responses.NewTemplateVars(w, r) ses = session.Get(r) ) // Load their cached name from any previous comments they may have posted. name, _ := ses.Values["c.name"].(string) email, _ := ses.Values["c.email"].(string) for r.Method == http.MethodPost { // Validate form parameters. form, _ := forms.Parse(r) val := form.Validator() val.Require("message") if val.HasErrors() { v.ValidationError = val.ErrorMap() v.V["Error"] = "Missing required form fields." break } var ( name = form.Get("name") email = form.Get("email") subject = form.Get("subject") message = form.Get("message") ) // Cache their name in their session for future comments/asks. ses.Values["c.name"] = name ses.Values["c.email"] = email ses.Save(r, w) // Email the site admin. if name == "" { name = "Anonymous" } if subject == "" { subject = "No Subject" } go mail.EmailAdmins(mail.Email{ Subject: fmt.Sprintf("Contact Me (%s) from %s: %s", settings.Current.Title, name, subject), Template: "_builtin/email/generic.gohtml", Data: map[string]interface{}{ "Subject": subject, "ReplyTo": email, "Message": template.HTML( markdown.RenderMarkdown(fmt.Sprintf( "Subject: %s\nSender name: %s\nSender email: %s\n\n%s\n", subject, name, email, message, )), ), }, }) session.Flash(w, r, "Thank you! Your message has been e-mailed to the site owner.") responses.Redirect(w, r, "/contact") return } v.V["name"] = name v.V["email"] = email responses.RenderTemplate(w, r, "_builtin/contact.gohtml", v) }