package controllers import ( "bytes" "encoding/json" "html/template" "os" "time" "github.com/CyCoreSystems/cycore-web/app/routes" "github.com/CyCoreSystems/sendinblue" "github.com/pkg/errors" "github.com/revel/revel" ) var contactEmailT *template.Template // EmailContact describes an email EmailContact type EmailContact struct { Name string `json:"name"` Email string `json:"email"` } func init() { contactEmailT = template.Must(template.New("contactEmail").Parse(contactEmailTemplate)) } // Contact controller handles customer contact operations type Contact struct { *revel.Controller } // Request handles a customer contact request func (c Contact) Request(name, email string) revel.Result { emailBody, err := renderContactEmail(name, email) if err != nil { return c.Controller.RenderError(errors.Wrap(err, "failed to render email for contact request")) } msg := &sendinblue.Message{ Sender: sendinblue.Address{ Name: "CyCore Systems, Inc", Email: "sys@cycoresys.com", }, To: getEmailContacts(), Subject: "Contact Request", HTMLContent: emailBody, Tags: []string{"contact-request"}, } if err = msg.Send(os.Getenv("SENDINBLUE_APIKEY")); err != nil { return c.Controller.RenderError(err) } c.Flash.Success("Request sent") return c.Redirect(routes.App.Index()) } func renderContactEmail(name, email string) (string, error) { buf := new(bytes.Buffer) err := contactEmailT.Execute(buf, struct { Name string Email string Timestamp string }{ Name: name, Email: email, Timestamp: time.Now().String(), }) if err != nil { return "", err } return buf.String(), nil } func getEmailContacts() []sendinblue.Address { var ret []sendinblue.Address if err := json.Unmarshal([]byte(os.Getenv("CONTACT_RECIPIENTS")), &ret); err != nil { // Fall back to default if we fail to load from environment ret = append(ret, sendinblue.Address{ Name: "System Receiver", Email: "sys@cycoresys.com", }) } return ret } var contactEmailTemplate = `