91 lines
2.2 KiB
Go
91 lines
2.2 KiB
Go
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)
|
|
}
|