blog/core/contact.go
Noah Petherbridge 6d3de7da69 Let me use interface{} for template vars
Since most of the `render.Vars{}` fields were hardcoded/not really
editable for the templates, apart from .Data, this struct is now locked
away in the render subpackage.

End http.HandlerFunc's can then make any arbitrary template data
structure they want to, available inside the templates as `.Data`.
2018-02-10 14:05:41 -08:00

81 lines
2.2 KiB
Go

package core
import (
"fmt"
"html/template"
"net/http"
"os"
"path/filepath"
"time"
"github.com/gorilla/mux"
"github.com/kirsle/blog/core/internal/forms"
"github.com/kirsle/blog/core/internal/markdown"
"github.com/kirsle/blog/core/internal/models/settings"
"github.com/kirsle/blog/core/internal/render"
"github.com/kirsle/blog/core/internal/responses"
)
// ContactRoutes attaches the contact URL to the app.
func (b *Blog) ContactRoutes(r *mux.Router) {
r.HandleFunc("/contact", func(w http.ResponseWriter, r *http.Request) {
form := &forms.Contact{}
v := map[string]interface{}{
"Form": form,
}
// If there is no site admin, show an error.
cfg, err := settings.Load()
if err != nil {
b.Error(w, r, "Error loading site configuration!")
return
} else if cfg.Site.AdminEmail == "" {
b.Error(w, r, "There is no admin email configured for this website!")
return
} else if !cfg.Mail.Enabled {
b.Error(w, r, "This website doesn't have an e-mail gateway configured.")
return
}
// Posting?
if r.Method == http.MethodPost {
form.ParseForm(r)
if err = form.Validate(); err != nil {
responses.Flash(w, r, err.Error())
} else {
go b.SendEmail(Email{
To: cfg.Site.AdminEmail,
Admin: true,
ReplyTo: form.Email,
Subject: fmt.Sprintf("Contact Form on %s: %s", cfg.Site.Title, form.Subject),
Template: ".email/contact.gohtml",
Data: map[string]interface{}{
"Name": form.Name,
"Message": template.HTML(markdown.RenderMarkdown(form.Message)),
"Email": form.Email,
},
})
// Log it to disk, too.
fh, err := os.OpenFile(filepath.Join(b.UserRoot, ".contact.log"), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
responses.Flash(w, r, "Error logging the message to disk: %s", err)
} else {
fh.WriteString(fmt.Sprintf(
"Date: %s\nName: %s\nEmail: %s\nSubject: %s\n\n%s\n\n--------------------\n\n",
time.Now().Format(time.UnixDate),
form.Name,
form.Email,
form.Subject,
form.Message,
))
fh.Close()
}
responses.FlashAndRedirect(w, r, "/contact", "Your message has been sent.")
}
}
render.Template(w, r, "contact", v)
})
}