/
main.go
104 lines (92 loc) · 2.75 KB
/
main.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
package main
import (
"log"
"os"
"strconv"
"time"
"github.com/joho/godotenv"
"github.com/nats-io/nats.go"
"github.com/opentracing/opentracing-go"
tracing "github.com/opentracing/opentracing-go"
"github.com/sirupsen/logrus"
"github.com/uber/jaeger-client-go"
"github.com/uber/jaeger-client-go/config"
"github.com/wisdommatt/ecommerce-microservice-notification-service/nats/handlers"
"github.com/wisdommatt/mailit"
)
func main() {
log := logrus.New()
log.SetFormatter(&logrus.JSONFormatter{PrettyPrint: true})
log.SetReportCaller(true)
log.SetOutput(os.Stdout)
mustLoadDotenv(log)
serviceTracer := initTracer("notificaton-service")
tracing.SetGlobalTracer(serviceTracer)
natsClient := mustConnectToNats(log)
defer natsClient.Close()
mailSmtpPort, err := strconv.Atoi(os.Getenv("MAIL_SMTP_PORT"))
if err != nil {
log.WithField("port", os.Getenv("MAIL_SMTP_PORT")).WithError(err).
Fatal("an error occured while converting string to int")
return
}
mailler := mailit.NewMailer(mailit.SMTPConfig{
Host: os.Getenv("MAIL_SMTP_HOST"),
Username: os.Getenv("MAIL_SMTP_USERNAME"),
Password: os.Getenv("MAIL_SMTP_PASSWORD"),
Port: mailSmtpPort,
})
log.WithField("nats_uri", os.Getenv("NATS_URI")).Info("app running & listening for incoming events")
natsClient.Subscribe("notification.SendEmail", wrapNatsEventHandler(log, handlers.HandleSendEmail(mailler)))
natsClient.Subscribe(
"notification.SendProductAddedEmail",
wrapNatsEventHandler(log, handlers.HandleSendProductAddedEmail(mailler)),
)
for {
// do nothing
}
}
func mustLoadDotenv(log *logrus.Logger) {
err := godotenv.Load(".env", ".env-defaults")
if err != nil {
log.WithError(err).Fatal("Unable to load env files")
}
}
func mustConnectToNats(log *logrus.Logger) *nats.Conn {
natsClient, err := nats.Connect(os.Getenv("NATS_URI"),
nats.RetryOnFailedConnect(true),
nats.MaxReconnects(10),
nats.ReconnectWait(2*time.Second),
)
if err != nil {
log.WithError(err).WithField("nats_uri", os.Getenv("NATS_URI")).
Fatal("an error occured while connecting to nats server")
return nil
}
return natsClient
}
func wrapNatsEventHandler(log *logrus.Logger, f handlers.NatsEventHandler) func(*nats.Msg) {
return func(m *nats.Msg) {
err := f(m)
if err != nil {
log.WithError(err).Error("an error occured while handling nats event")
}
}
}
func initTracer(serviceName string) opentracing.Tracer {
return initJaegerTracer(serviceName)
}
func initJaegerTracer(serviceName string) opentracing.Tracer {
cfg := &config.Configuration{
ServiceName: serviceName,
Sampler: &config.SamplerConfig{
Type: "const",
Param: 1,
},
}
tracer, _, err := cfg.NewTracer(config.Logger(jaeger.StdLogger))
if err != nil {
log.Fatal("ERROR: cannot init Jaeger", err)
}
return tracer
}