Changeset 0.20.0 (#85)
This commit is contained in:
108
server/notifications/templates.go
Normal file
108
server/notifications/templates.go
Normal file
@@ -0,0 +1,108 @@
|
||||
package notifications
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"html/template"
|
||||
"strings"
|
||||
|
||||
"git.gobha.me/xcaliber/chat-switchboard/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(`<!DOCTYPE html>
|
||||
<html>
|
||||
<head><meta charset="UTF-8"></head>
|
||||
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; color: #333;">
|
||||
<div style="border-bottom: 2px solid #4a8af4; padding-bottom: 12px; margin-bottom: 20px;">
|
||||
<h2 style="margin: 0; color: #4a8af4;">{{.InstanceName}}</h2>
|
||||
</div>
|
||||
<div style="background: #f8f9fa; border-radius: 8px; padding: 16px; margin-bottom: 16px;">
|
||||
<h3 style="margin: 0 0 8px;">{{.Title}}</h3>
|
||||
{{if .Body}}<p style="margin: 0; color: #555;">{{.Body}}</p>{{end}}
|
||||
</div>
|
||||
<p style="font-size: 0.85em; color: #999;">
|
||||
This notification was sent by {{.InstanceName}}. You can adjust your notification preferences in Settings.
|
||||
</p>
|
||||
</body>
|
||||
</html>`))
|
||||
|
||||
// ── 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 = "Chat Switchboard"
|
||||
}
|
||||
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 "<p>" + template.HTMLEscapeString(n.Title) + "</p>"
|
||||
}
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
// RenderText renders a plaintext email body for a notification.
|
||||
func RenderText(n *models.Notification, instanceName string) string {
|
||||
if instanceName == "" {
|
||||
instanceName = "Chat Switchboard"
|
||||
}
|
||||
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 = "Chat Switchboard"
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user