Passed
Push — main ( 79339c...92ecdf )
by Acho
02:24
created

listeners.*WebsocketListener.onMessagePhoneFailed   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
	cloudevents "github.com/cloudevents/sdk-go/v2"
8
	"github.com/palantir/stacktrace"
9
10
	"github.com/NdoleStudio/httpsms/pkg/events"
11
	"github.com/NdoleStudio/httpsms/pkg/telemetry"
12
	"github.com/pusher/pusher-http-go/v5"
13
)
14
15
// WebsocketListener handles cloud events that send a websocket event to the frontend
16
type WebsocketListener struct {
17
	logger telemetry.Logger
18
	tracer telemetry.Tracer
19
	client *pusher.Client
20
}
21
22
// NewWebsocketListener creates a new instance of WebsocketListener
23
func NewWebsocketListener(
24
	logger telemetry.Logger,
25
	tracer telemetry.Tracer,
26
	client *pusher.Client,
27
) (l *WebsocketListener, routes map[string]events.EventListener) {
28
	l = &WebsocketListener{
29
		logger: logger.WithService(fmt.Sprintf("%T", l)),
30
		tracer: tracer,
31
		client: client,
32
	}
33
34
	return l, map[string]events.EventListener{
35
		events.EventTypePhoneUpdated:      l.onPhoneUpdated,
36
		events.EventTypeMessagePhoneSent:  l.onMessagePhoneSent,
37
		events.EventTypeMessageSendFailed: l.onMessagePhoneFailed,
38
	}
39
}
40
41
// onMessagePhoneSent handles the events.EventTypeMessagePhoneSent event
42
func (listener *WebsocketListener) onMessagePhoneSent(ctx context.Context, event cloudevents.Event) error {
43
	ctx, span, _ := listener.tracer.StartWithLogger(ctx, listener.logger)
44
	defer span.End()
45
46
	var payload events.MessagePhoneSentPayload
47
	if err := event.DataAs(&payload); err != nil {
48
		msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
49
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
50
	}
51
52
	if err := listener.client.Trigger(payload.UserID.String(), event.Type(), event.ID()); err != nil {
53
		msg := fmt.Sprintf("cannot trigger websocket [%s] event with ID [%s] for user with ID [%s]", event.Type(), event.ID(), payload.UserID)
54
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
55
	}
56
57
	return nil
58
}
59
60
// onMessagePhoneFailed handles the events.EventTypeMessageSendFailed event
61
func (listener *WebsocketListener) onMessagePhoneFailed(ctx context.Context, event cloudevents.Event) error {
62
	ctx, span, _ := listener.tracer.StartWithLogger(ctx, listener.logger)
63
	defer span.End()
64
65
	var payload events.MessageSendFailedPayload
66
	if err := event.DataAs(&payload); err != nil {
67
		msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
68
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
69
	}
70
71
	if err := listener.client.Trigger(payload.UserID.String(), event.Type(), event.ID()); err != nil {
72
		msg := fmt.Sprintf("cannot trigger websocket [%s] event with ID [%s] for user with ID [%s]", event.Type(), event.ID(), payload.UserID)
73
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
74
	}
75
76
	return nil
77
}
78
79
// onPhoneUpdated handles the events.EventTypePhoneUpdated event
80
func (listener *WebsocketListener) onPhoneUpdated(ctx context.Context, event cloudevents.Event) error {
81
	ctx, span, _ := listener.tracer.StartWithLogger(ctx, listener.logger)
82
	defer span.End()
83
84
	var payload events.PhoneUpdatedPayload
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.client.Trigger(payload.UserID.String(), event.Type(), event.ID()); err != nil {
91
		msg := fmt.Sprintf("cannot trigger websocket [%s] event with ID [%s] for user with ID [%s]", event.Type(), event.ID(), payload.UserID)
92
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
93
	}
94
95
	return nil
96
}
97