forked from NdoleStudio/httpsms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathintegration_3cx_listener.go
More file actions
134 lines (109 loc) · 4.93 KB
/
Copy pathintegration_3cx_listener.go
File metadata and controls
134 lines (109 loc) · 4.93 KB
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package listeners
import (
"context"
"fmt"
"github.com/NdoleStudio/httpsms/pkg/events"
"github.com/NdoleStudio/httpsms/pkg/services"
"github.com/NdoleStudio/httpsms/pkg/telemetry"
cloudevents "github.com/cloudevents/sdk-go/v2"
"github.com/palantir/stacktrace"
)
// Integration3CXListener sends 3CX events to users
type Integration3CXListener struct {
logger telemetry.Logger
tracer telemetry.Tracer
service *services.Integration3CXService
}
// NewIntegration3CXListener creates a new instance of Integration3CXListener
func NewIntegration3CXListener(
logger telemetry.Logger,
tracer telemetry.Tracer,
service *services.Integration3CXService,
) (l *Integration3CXListener, routes map[string]events.EventListener) {
l = &Integration3CXListener{
logger: logger.WithService(fmt.Sprintf("%T", l)),
tracer: tracer,
service: service,
}
return l, map[string]events.EventListener{
// events.EventTypeMessagePhoneReceived: l.OnMessagePhoneReceived,
// events.EventTypeMessagePhoneDelivered: l.OnMessagePhoneDelivered,
// events.EventTypeMessageSendFailed: l.OnMessageSendFailed,
// events.EventTypeMessagePhoneSent: l.OnMessagePhoneSent,
events.UserAccountDeleted: l.onUserAccountDeleted,
}
}
// OnMessagePhoneReceived handles the events.EventTypeMessagePhoneReceived event
func (listener *Integration3CXListener) OnMessagePhoneReceived(ctx context.Context, event cloudevents.Event) error {
ctx, span := listener.tracer.Start(ctx)
defer span.End()
var payload events.MessagePhoneReceivedPayload
if err := event.DataAs(&payload); err != nil {
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
if err := listener.service.Send(ctx, payload.UserID, event); err != nil {
msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
return nil
}
// OnMessageSendFailed handles the events.EventTypeMessageSendFailed event
func (listener *Integration3CXListener) OnMessageSendFailed(ctx context.Context, event cloudevents.Event) error {
ctx, span := listener.tracer.Start(ctx)
defer span.End()
var payload events.MessageSendFailedPayload
if err := event.DataAs(&payload); err != nil {
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
if err := listener.service.Send(ctx, payload.UserID, event); err != nil {
msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
return nil
}
// OnMessagePhoneSent handles the events.EventTypeMessagePhoneSent event
func (listener *Integration3CXListener) OnMessagePhoneSent(ctx context.Context, event cloudevents.Event) error {
ctx, span := listener.tracer.Start(ctx)
defer span.End()
var payload events.MessagePhoneSentPayload
if err := event.DataAs(&payload); err != nil {
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
if err := listener.service.Send(ctx, payload.UserID, event); err != nil {
msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
return nil
}
// OnMessagePhoneDelivered handles the events.EventTypeMessagePhoneDelivered event
func (listener *Integration3CXListener) OnMessagePhoneDelivered(ctx context.Context, event cloudevents.Event) error {
ctx, span := listener.tracer.Start(ctx)
defer span.End()
var payload events.MessagePhoneDeliveredPayload
if err := event.DataAs(&payload); err != nil {
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
if err := listener.service.Send(ctx, payload.UserID, event); err != nil {
msg := fmt.Sprintf("cannot process [%s] event with ID [%s]", event.Type(), event.ID())
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
return nil
}
func (listener *Integration3CXListener) onUserAccountDeleted(ctx context.Context, event cloudevents.Event) error {
ctx, span := listener.tracer.Start(ctx)
defer span.End()
var payload events.UserAccountDeletedPayload
if err := event.DataAs(&payload); err != nil {
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
if err := listener.service.DeleteAllForUser(ctx, payload.UserID); err != nil {
msg := fmt.Sprintf("cannot delete [entities.Integration3CX] for user [%s] on [%s] event with ID [%s]", payload.UserID, event.Type(), event.ID())
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
}
return nil
}