Noah Petherbridge
6d3de7da69
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`.
81 lines
2.2 KiB
Go
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)
|
|
})
|
|
}
|