Fix email template

The Email notifier was using `map[string]interface{}` to "put" the
information (like Service and Failure struct) into the template.
The value of a map can only be used with `{{ index . "Service" }}` in a
GoLang template.
To simplify – and reduce the needed changes – `emailOutgoing` now
contains for the `Data` field an extra struct with `Service` and
`Failure` fields.

This patch fixes #472.
pull/540/head
Emanuel Bennici 2020-04-27 13:34:31 +02:00
parent e4ed216833
commit 1053be44b0
No known key found for this signature in database
GPG Key ID: 17FA2D56BAD01661
2 changed files with 26 additions and 21 deletions

View File

@ -155,19 +155,27 @@ type emailOutgoing struct {
Subject string Subject string
Template string Template string
From string From string
Data interface{} Data emailData
Source string Source string
Sent bool Sent bool
} }
type emailData struct {
Service services.Service
Failure failures.Failure
}
// OnFailure will trigger failing service // OnFailure will trigger failing service
func (e *emailer) OnFailure(s *services.Service, f *failures.Failure) error { func (e *emailer) OnFailure(s *services.Service, f *failures.Failure) error {
email := &emailOutgoing{ email := &emailOutgoing{
To: e.Var2, To: e.Var2,
Subject: fmt.Sprintf("Service %v is Failing", s.Name), Subject: fmt.Sprintf("Service %v is Failing", s.Name),
Template: mainEmailTemplate, Template: mainEmailTemplate,
Data: ToMap(s, f), Data: emailData{
From: e.Var1, Service: *s,
Failure: *f,
},
From: e.Var1,
} }
return e.dialSend(email) return e.dialSend(email)
} }
@ -179,15 +187,18 @@ func (e *emailer) OnSuccess(s *services.Service) error {
To: e.Var2, To: e.Var2,
Subject: msg, Subject: msg,
Template: mainEmailTemplate, Template: mainEmailTemplate,
Data: ToMap(s, nil), Data: emailData{
From: e.Var1, Service: *s,
Failure: failures.Failure{},
},
From: e.Var1,
} }
return e.dialSend(email) return e.dialSend(email)
} }
// OnTest triggers when this notifier has been saved // OnTest triggers when this notifier has been saved
func (e *emailer) OnTest() (string, error) { func (e *emailer) OnTest() (string, error) {
testService := &services.Service{ testService := services.Service{
Id: 1, Id: 1,
Name: "Example Service", Name: "Example Service",
Domain: "https://www.youtube.com/watch?v=-u6DvRyyKGU", Domain: "https://www.youtube.com/watch?v=-u6DvRyyKGU",
@ -206,8 +217,11 @@ func (e *emailer) OnTest() (string, error) {
To: e.Var2, To: e.Var2,
Subject: subject, Subject: subject,
Template: mainEmailTemplate, Template: mainEmailTemplate,
Data: testService, Data: emailData{
From: e.Var1, Service: testService,
Failure: failures.Failure{},
},
From: e.Var1,
} }
err := e.dialSend(email) err := e.dialSend(email)
return subject, err return subject, err

View File

@ -2,32 +2,23 @@ package utils
import ( import (
"bytes" "bytes"
"fmt"
"text/template" "text/template"
) )
func ReplaceTemplate(tmpl string, data interface{}) string { func ReplaceTemplate(tmpl string, data interface{}) string {
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
var varStr string
switch fmt.Sprintf("%T", data) {
case "*services.Service":
varStr = "Service"
case "*failures.Failure":
varStr = "Failure"
default:
varStr = "Object"
}
injectVars := make(map[string]interface{})
injectVars[varStr] = data
slackTemp, err := template.New("replacement").Parse(tmpl) slackTemp, err := template.New("replacement").Parse(tmpl)
if err != nil { if err != nil {
Log.Error(err) Log.Error(err)
return err.Error() return err.Error()
} }
err = slackTemp.Execute(buf, injectVars)
err = slackTemp.Execute(buf, data)
if err != nil { if err != nil {
Log.Error(err) Log.Error(err)
return err.Error() return err.Error()
} }
return buf.String() return buf.String()
} }