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

ntDeleted   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/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
// Integration3CXListener sends 3CX events to users
15
type Integration3CXListener struct {
16
	logger  telemetry.Logger
17
	tracer  telemetry.Tracer
18
	service *services.Integration3CXService
19
}
20
21
// NewIntegration3CXListener creates a new instance of Integration3CXListener
22
func NewIntegration3CXListener(
23
	logger telemetry.Logger,
24
	tracer telemetry.Tracer,
25
	service *services.Integration3CXService,
26
) (l *Integration3CXListener, routes map[string]events.EventListener) {
27
	l = &Integration3CXListener{
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.EventTypeMessagePhoneReceived:  l.OnMessagePhoneReceived,
35
		// events.EventTypeMessagePhoneDelivered: l.OnMessagePhoneDelivered,
36
		// events.EventTypeMessageSendFailed:     l.OnMessageSendFailed,
37
		// events.EventTypeMessagePhoneSent:      l.OnMessagePhoneSent,
38
		events.UserAccountDeleted: l.onUserAccountDeleted,
39
	}
40
}
41
42
// OnMessagePhoneReceived handles the events.EventTypeMessagePhoneReceived event
43
func (listener *Integration3CXListener) OnMessagePhoneReceived(ctx context.Context, event cloudevents.Event) error {
44
	ctx, span := listener.tracer.Start(ctx)
45
	defer span.End()
46
47
	var payload events.MessagePhoneReceivedPayload
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.Send(ctx, payload.UserID, event); err != nil {
54
		msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
55
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
56
	}
57
58
	return nil
59
}
60
61
// OnMessageSendFailed handles the events.EventTypeMessageSendFailed event
62
func (listener *Integration3CXListener) OnMessageSendFailed(ctx context.Context, event cloudevents.Event) error {
63
	ctx, span := listener.tracer.Start(ctx)
64
	defer span.End()
65
66
	var payload events.MessageSendFailedPayload
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.Send(ctx, payload.UserID, event); err != nil {
73
		msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
74
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
75
	}
76
77
	return nil
78
}
79
80
// OnMessagePhoneSent handles the events.EventTypeMessagePhoneSent event
81
func (listener *Integration3CXListener) OnMessagePhoneSent(ctx context.Context, event cloudevents.Event) error {
82
	ctx, span := listener.tracer.Start(ctx)
83
	defer span.End()
84
85
	var payload events.MessagePhoneSentPayload
86
	if err := event.DataAs(&payload); err != nil {
87
		msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
88
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
89
	}
90
91
	if err := listener.service.Send(ctx, payload.UserID, event); err != nil {
92
		msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
93
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
94
	}
95
96
	return nil
97
}
98
99
// OnMessagePhoneDelivered handles the events.EventTypeMessagePhoneDelivered event
100
func (listener *Integration3CXListener) OnMessagePhoneDelivered(ctx context.Context, event cloudevents.Event) error {
101
	ctx, span := listener.tracer.Start(ctx)
102
	defer span.End()
103
104
	var payload events.MessagePhoneDeliveredPayload
105
	if err := event.DataAs(&payload); err != nil {
106
		msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
107
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
108
	}
109
110
	if err := listener.service.Send(ctx, payload.UserID, event); err != nil {
111
		msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
112
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
113
	}
114
115
	return nil
116
}
117
118
func (listener *Integration3CXListener) onUserAccountDeleted(ctx context.Context, event cloudevents.Event) error {
119
	ctx, span := listener.tracer.Start(ctx)
120
	defer span.End()
121
122
	var payload events.UserAccountDeletedPayload
123
	if err := event.DataAs(&payload); err != nil {
124
		msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
125
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
126
	}
127
128
	if err := listener.service.DeleteAllForUser(ctx, payload.UserID); err != nil {
129
		msg := fmt.Sprintf("cannot delete [entities.Integration3CX] for user [%s] on [%s] event with ID [%s]", payload.UserID, event.Type(), event.ID())
130
		return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
131
	}
132
133
	return nil
134
}
135