Skip to content

Commit 2dab2b0

Browse files
committed
Create boiler plate for failed email notifications
1 parent fd5c60c commit 2dab2b0

4 files changed

Lines changed: 131 additions & 1 deletion

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package emails
2+
3+
// NotificationEmailFactory generates emails to users about a message
4+
type NotificationEmailFactory interface{}

api/pkg/emails/user_email.go

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package listeners
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/NdoleStudio/httpsms/pkg/events"
8+
"github.com/NdoleStudio/httpsms/pkg/services"
9+
"github.com/NdoleStudio/httpsms/pkg/telemetry"
10+
cloudevents "github.com/cloudevents/sdk-go/v2"
11+
"github.com/palantir/stacktrace"
12+
)
13+
14+
// EmailNotificationListener listens for events about failed and expired messages
15+
type EmailNotificationListener struct {
16+
logger telemetry.Logger
17+
tracer telemetry.Tracer
18+
service *services.EmailNotificationService
19+
}
20+
21+
// NewEmailNotificationListener creates a new instance of emailNotificationListener
22+
func NewEmailNotificationListener(
23+
logger telemetry.Logger,
24+
tracer telemetry.Tracer,
25+
service *services.EmailNotificationService,
26+
) (l *EmailNotificationListener, routes map[string]events.EventListener) {
27+
l = &EmailNotificationListener{
28+
logger: logger.WithService(fmt.Sprintf("%T", l)),
29+
tracer: tracer,
30+
service: service,
31+
}
32+
33+
return l, map[string]events.EventListener{
34+
events.EventTypeMessageSendExpired: l.OnMessageSendExpired,
35+
events.EventTypeMessageSendFailed: l.OnMessageSendFailed,
36+
}
37+
}
38+
39+
// OnMessageSendExpired handles the events.EventTypeMessageSendExpired event
40+
func (listener *EmailNotificationListener) OnMessageSendExpired(ctx context.Context, event cloudevents.Event) error {
41+
ctx, span := listener.tracer.Start(ctx)
42+
defer span.End()
43+
44+
payload := new(events.MessageSendExpiredPayload)
45+
if err := event.DataAs(&payload); err != nil {
46+
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
47+
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
48+
}
49+
50+
if err := listener.service.NotifyMessageExpired(ctx, payload); err != nil {
51+
msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
52+
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
53+
}
54+
55+
return nil
56+
}
57+
58+
// OnMessageSendFailed handles the events.EventTypeMessageSendFailed event
59+
func (listener *EmailNotificationListener) OnMessageSendFailed(ctx context.Context, event cloudevents.Event) error {
60+
ctx, span := listener.tracer.Start(ctx)
61+
defer span.End()
62+
63+
payload := new(events.MessageSendFailedPayload)
64+
if err := event.DataAs(&payload); err != nil {
65+
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
66+
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
67+
}
68+
69+
if err := listener.service.NotifyMessageFailed(ctx, payload); err != nil {
70+
msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
71+
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
72+
}
73+
74+
return nil
75+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package services
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/NdoleStudio/httpsms/pkg/cache"
8+
"github.com/NdoleStudio/httpsms/pkg/emails"
9+
"github.com/NdoleStudio/httpsms/pkg/events"
10+
"github.com/NdoleStudio/httpsms/pkg/repositories"
11+
"github.com/NdoleStudio/httpsms/pkg/telemetry"
12+
)
13+
14+
// EmailNotificationService is responsible for handling email notifications about messages
15+
type EmailNotificationService struct {
16+
service
17+
logger telemetry.Logger
18+
tracer telemetry.Tracer
19+
userRepository repositories.UserRepository
20+
factory emails.NotificationEmailFactory
21+
mailer emails.Mailer
22+
cache cache.Cache
23+
}
24+
25+
// NewEmailNotificationService creates a new EmailNotificationService
26+
func NewEmailNotificationService(
27+
logger telemetry.Logger,
28+
tracer telemetry.Tracer,
29+
userRepository repositories.UserRepository,
30+
factory emails.NotificationEmailFactory,
31+
mailer emails.Mailer,
32+
cache cache.Cache,
33+
) *EmailNotificationService {
34+
return &EmailNotificationService{
35+
logger: logger.WithService(fmt.Sprintf("%T", &EmailNotificationService{})),
36+
tracer: tracer,
37+
userRepository: userRepository,
38+
factory: factory,
39+
mailer: mailer,
40+
cache: cache,
41+
}
42+
}
43+
44+
// NotifyMessageExpired sends an email to the user about an expired message
45+
func (service *EmailNotificationService) NotifyMessageExpired(ctx context.Context, payload *events.MessageSendExpiredPayload) error {
46+
return nil
47+
}
48+
49+
// NotifyMessageFailed sends an email to the user about a failed message
50+
func (service *EmailNotificationService) NotifyMessageFailed(ctx context.Context, payload *events.MessageSendFailedPayload) error {
51+
return nil
52+
}

0 commit comments

Comments
 (0)