-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreporting.go
112 lines (90 loc) · 2.41 KB
/
reporting.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package cmes
import (
"fmt"
_ "io/ioutil"
_ "os"
"strings"
"time"
"github.com/jung-kurt/gofpdf"
"gopkg.in/gomail.v2"
)
type Report struct {
PerformerName string
BenchmarkDate time.Time
Scores map[string]int
}
type Reporter interface {
GenerateReport(report Report) (string, error)
}
type ConsoleReporter struct{}
func NewConsoleReporter() *ConsoleReporter {
return &ConsoleReporter{}
}
func (cr *ConsoleReporter) GenerateReport(report Report) (string, error) {
sb := strings.Builder{}
sb.WriteString(fmt.Sprintf("Benchmark report for %s on %s:\n", report.PerformerName, report.BenchmarkDate.Format("2006-01-02")))
sb.WriteString("KPI scores:\n")
for k, v := range report.Scores {
sb.WriteString(fmt.Sprintf("- %s: %d\n", k, v))
}
return sb.String(), nil
}
type EmailReporter struct {
From string
To string
Subject string
SMTPHost string
SMTPPort int
Username string
Password string
}
func NewEmailReporter(from, to, subject, smtpHost, username, password string, smtpPort int) *EmailReporter {
return &EmailReporter{
From: from,
To: to,
Subject: subject,
SMTPHost: smtpHost,
SMTPPort: smtpPort,
Username: username,
Password: password,
}
}
func (er *EmailReporter) GenerateReport(report Report) (string, error) {
body, err := NewConsoleReporter().GenerateReport(report)
if err != nil {
return "", err
}
m := gomail.NewMessage()
m.SetHeader("From", er.From)
m.SetHeader("To", er.To)
m.SetHeader("Subject", er.Subject)
m.SetBody("text/plain", body)
d := gomail.NewDialer(er.SMTPHost, er.SMTPPort, er.Username, er.Password)
if err := d.DialAndSend(m); err != nil {
return "", err
}
return body, nil
}
type PDFReporter struct {
FilePath string
}
func NewPDFReporter(filePath string) *PDFReporter {
return &PDFReporter{
FilePath: filePath,
}
}
func (pr *PDFReporter) GenerateReport(report Report) (string, error) {
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.AddPage()
pdf.SetFont("Arial", "B", 16)
pdf.Cell(40, 10, "Benchmark Report")
pdf.Ln(20)
pdf.SetFont("Arial", "", 12)
pdf.CellFormat(40, 10, "Performer Name:", "", 0, "", false, 0, "")
pdf.CellFormat(0, 10, report.PerformerName, "", 1, "", false, 0, "")
pdf.CellFormat(40, 10, "Benchmark Date:", "", 0, "", false, 0, "")
pdf.CellFormat(0, 10, report.BenchmarkDate.Format("2006-01-02"), "", 1, "", false, 0, "")
pdf.Ln(10)
pdf.SetFont("Arial", "B", 12)
pdf.CellFormat(40, 10, "KPI Scores:")
}