Passed
Push — main ( 570b65...2ff189 )
by Acho
02:48
created

listeners.*BillingListener.onUserAccountDeleted   A

Complexity

Conditions 3

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 11
dl 0
loc 16
rs 9.85
c 0
b 0
f 0
nop 2
1
package listeners
2
3
import (
4
	"context"
5
	"fmt"
6
7
	"github.com/davecgh/go-spew/spew"
8
9
	"github.com/NdoleStudio/httpsms/pkg/events"
10
	"github.com/NdoleStudio/httpsms/pkg/services"
11
	"github.com/NdoleStudio/httpsms/pkg/telemetry"
12
	cloudevents "github.com/cloudevents/sdk-go/v2"
13
	"github.com/palantir/stacktrace"
14
)
15
16
// BillingListener handles cloud events which affect billing
17
type BillingListener struct {
18
	logger  telemetry.Logger
19
	tracer  telemetry.Tracer
20
	service *services.BillingService
21
}
22
23
// NewBillingListener creates a new instance of UserListener
24
func NewBillingListener(
25
	logger telemetry.Logger,
26
	tracer telemetry.Tracer,
27
	service *services.BillingService,
28
) (l *BillingListener, routes map[string]events.EventListener) {
29
	l = &BillingListener{
30
		logger:  logger.WithService(fmt.Sprintf("%T", l)),
31
		tracer:  tracer,
32
		service: service,
33
	}
34
35
	return l, map[string]events.EventListener{
36
		events.EventTypeMessageAPISent:       l.OnMessageAPISent,
37
		events.UserAccountDeleted:            l.onUserAccountDeleted,
38
		events.EventTypeMessagePhoneReceived: l.OnMessagePhoneReceived,
39
	}
40
}
41
42
// OnMessageAPISent handles the events.EventTypeMessageAPISent event
43
func (listener *BillingListener) OnMessageAPISent(ctx context.Context, event cloudevents.Event) error {
44
	ctx, span := listener.tracer.Start(ctx)
45
	defer span.End()
46
47
	var payload events.MessageAPISentPayload
48
	if err := event.DataAs(&payload); err != nil {
49
		msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
50
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
51
	}
52
53
	if err := listener.service.RegisterSentMessage(ctx, payload.MessageID, payload.RequestReceivedAt, payload.UserID); err != nil {
54
		msg := fmt.Sprintf("cannot register sent message for event [%s] for event with ID [%s]", spew.Sdump(payload), event.ID())
55
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
56
	}
57
58
	return nil
59
}
60
61
// OnMessagePhoneReceived handles the events.EventTypeMessagePhoneReceived event
62
func (listener *BillingListener) OnMessagePhoneReceived(ctx context.Context, event cloudevents.Event) error {
63
	ctx, span := listener.tracer.Start(ctx)
64
	defer span.End()
65
66
	var payload events.MessagePhoneReceivedPayload
67
	if err := event.DataAs(&payload); err != nil {
68
		msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
69
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
70
	}
71
72
	if err := listener.service.RegisterReceivedMessage(ctx, payload.MessageID, payload.Timestamp, payload.UserID); err != nil {
73
		msg := fmt.Sprintf("cannot register received message for event [%s] for event with ID [%s]", spew.Sdump(payload), event.ID())
74
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
75
	}
76
77
	return nil
78
}
79
80
func (listener *BillingListener) onUserAccountDeleted(ctx context.Context, event cloudevents.Event) error {
81
	ctx, span := listener.tracer.Start(ctx)
82
	defer span.End()
83
84
	var payload events.UserAccountDeletedPayload
85
	if err := event.DataAs(&payload); err != nil {
86
		msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
87
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
88
	}
89
90
	if err := listener.service.DeleteAllForUser(ctx, payload.UserID); err != nil {
91
		msg := fmt.Sprintf("cannot delete [entities.BillingUsage] for user [%s] on [%s] event with ID [%s]", payload.UserID, event.Type(), event.ID())
92
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
93
	}
94
95
	return nil
96
}
97