package notifications import ( "bytes" "html/template" "strings" "switchboard-core/models" ) // ── Template Data ─────────────────────────── type emailData struct { Title string Body string Type string ResourceType string InstanceName string } // ── HTML Template ─────────────────────────── var htmlTmpl = template.Must(template.New("email").Parse(`

{{.InstanceName}}

{{.Title}}

{{if .Body}}

{{.Body}}

{{end}}

This notification was sent by {{.InstanceName}}. You can adjust your notification preferences in Settings.

`)) // ── Plaintext Template ────────────────────── var textTmpl = template.Must(template.New("email_text").Parse(`{{.InstanceName}} — Notification {{.Title}} {{if .Body}} {{.Body}} {{end}} --- Adjust your notification preferences in Settings. `)) // ── Render Functions ──────────────────────── // RenderHTML renders an HTML email body for a notification. func RenderHTML(n *models.Notification, instanceName string) string { if instanceName == "" { instanceName = "Switchboard Core" } data := emailData{ Title: n.Title, Body: n.Body, Type: n.Type, ResourceType: n.ResourceType, InstanceName: instanceName, } var buf bytes.Buffer if err := htmlTmpl.Execute(&buf, data); err != nil { return "

" + template.HTMLEscapeString(n.Title) + "

" } return buf.String() } // RenderText renders a plaintext email body for a notification. func RenderText(n *models.Notification, instanceName string) string { if instanceName == "" { instanceName = "Switchboard Core" } data := emailData{ Title: n.Title, Body: n.Body, Type: n.Type, ResourceType: n.ResourceType, InstanceName: instanceName, } var buf bytes.Buffer if err := textTmpl.Execute(&buf, data); err != nil { return n.Title } return buf.String() } // SubjectForNotification returns an email subject line. func SubjectForNotification(n *models.Notification, instanceName string) string { if instanceName == "" { instanceName = "Switchboard Core" } prefix := "[" + instanceName + "] " switch { case strings.HasPrefix(n.Type, "kb."): return prefix + "Knowledge Base: " + n.Title case strings.HasPrefix(n.Type, "role."): return prefix + "Model Alert: " + n.Title case strings.HasPrefix(n.Type, "grant."): return prefix + "Access Change: " + n.Title default: return prefix + n.Title } }