@@ -3,24 +3,21 @@ package listeners
33import (
44 "context"
55 "fmt"
6- "time"
76
8- "github.com/NdoleStudio/http-sms-manager/pkg/entities"
97 "github.com/NdoleStudio/http-sms-manager/pkg/events"
108 "github.com/NdoleStudio/http-sms-manager/pkg/repositories"
119 "github.com/NdoleStudio/http-sms-manager/pkg/services"
1210 "github.com/NdoleStudio/http-sms-manager/pkg/telemetry"
1311 cloudevents "github.com/cloudevents/sdk-go/v2"
14- "github.com/google/uuid"
1512 "github.com/palantir/stacktrace"
1613)
1714
1815// MessageListener handles cloud events which need to update the messages table
1916type MessageListener struct {
20- logger telemetry. Logger
21- tracer telemetry.Tracer
22- service * services. MessageService
23- repository repositories. EventListenerLogRepository
17+ listener
18+ logger telemetry.Logger
19+ tracer telemetry. Tracer
20+ service * services. MessageService
2421}
2522
2623// NewMessageListener creates a new instance of MessageListener
@@ -29,16 +26,19 @@ func NewMessageListener(
2926 tracer telemetry.Tracer ,
3027 service * services.MessageService ,
3128 repository repositories.EventListenerLogRepository ,
32- ) (listener * MessageListener , routes map [string ]events.EventListener ) {
33- listener = & MessageListener {
34- logger : logger .WithService (fmt .Sprintf ("%T" , listener )),
35- tracer : tracer ,
36- service : service ,
37- repository : repository ,
29+ ) (l * MessageListener , routes map [string ]events.EventListener ) {
30+ l = & MessageListener {
31+ logger : logger .WithService (fmt .Sprintf ("%T" , l )),
32+ tracer : tracer ,
33+ service : service ,
34+ listener : listener {
35+ repository : repository ,
36+ },
3837 }
3938
40- return listener , map [string ]events.EventListener {
41- events .EventTypeMessageAPISent : listener .OnMessageAPISent ,
39+ return l , map [string ]events.EventListener {
40+ events .EventTypeMessageAPISent : l .OnMessageAPISent ,
41+ events .EventTypeMessagePhoneSending : l .OnMessagePhoneSending ,
4242 }
4343}
4444
@@ -47,19 +47,16 @@ func (listener *MessageListener) OnMessageAPISent(ctx context.Context, event clo
4747 ctx , span := listener .tracer .Start (ctx )
4848 defer span .End ()
4949
50- handlerName := fmt .Sprintf ("%s.%T" , event .Type (), listener )
51- listener .logger .Warn (stacktrace .NewError (handlerName ))
52-
53- handled , err := listener .repository .Has (ctx , event .ID (), handlerName )
50+ handled , err := listener .repository .Has (ctx , event .ID (), listener .signature (event ))
5451 if err != nil {
55- msg := fmt .Sprintf ("cannot test if event [%s] has been handled by [%T]" , event .ID (), handlerName )
52+ msg := fmt .Sprintf ("cannot verify if event [%s] has been handled by [%T]" , event .ID (), listener . signature ( event ) )
5653 return listener .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
5754 }
5855
5956 ctxLogger := listener .tracer .CtxLogger (listener .logger , span )
6057
6158 if handled {
62- ctxLogger .Info (fmt .Sprintf ("event [%s] has already been handled by [%s]" , event .ID (), handlerName ))
59+ ctxLogger .Info (fmt .Sprintf ("event [%s] has already been handled by [%s]" , event .ID (), listener . signature ( event ) ))
6360 return nil
6461 }
6562
@@ -83,13 +80,46 @@ func (listener *MessageListener) OnMessageAPISent(ctx context.Context, event clo
8380 return listener .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
8481 }
8582
86- return listener .repository .Save (ctx , & entities.EventListenerLog {
87- ID : uuid .New (),
88- EventID : event .ID (),
89- EventType : event .Type (),
90- Handler : handlerName ,
91- Duration : time .Now ().Sub (event .Time ()),
92- HandledAt : time .Now ().UTC (),
93- CreatedAt : time .Now ().UTC (),
94- })
83+ return listener .storeEventListenerLog (ctx , listener .signature (event ), event )
84+ }
85+
86+ // OnMessagePhoneSending handles the events.EventTypeMessagePhoneSending event
87+ func (listener * MessageListener ) OnMessagePhoneSending (ctx context.Context , event cloudevents.Event ) error {
88+ ctx , span := listener .tracer .Start (ctx )
89+ defer span .End ()
90+
91+ handled , err := listener .repository .Has (ctx , event .ID (), listener .signature (event ))
92+ if err != nil {
93+ msg := fmt .Sprintf ("cannot verify if event [%s] has been handled by [%T]" , event .ID (), listener .signature (event ))
94+ return listener .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
95+ }
96+
97+ ctxLogger := listener .tracer .CtxLogger (listener .logger , span )
98+
99+ if handled {
100+ ctxLogger .Info (fmt .Sprintf ("event [%s] has already been handled by [%s]" , event .ID (), listener .signature (event )))
101+ return nil
102+ }
103+
104+ var payload events.MessagePhoneSendingPayload
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+ handleParams := services.HandleMessageSendingParams {
111+ ID : payload .ID ,
112+ Timestamp : event .Time (),
113+ }
114+
115+ if err = listener .service .HandleMessageSending (ctx , handleParams ); err != nil {
116+ msg := fmt .Sprintf ("cannot handle sending for message with ID [%s] for event with ID [%s]" , handleParams .ID , event .ID ())
117+ return listener .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
118+ }
119+
120+ return listener .storeEventListenerLog (ctx , listener .signature (event ), event )
121+ }
122+
123+ func (listener * MessageListener ) signature (event cloudevents.Event ) string {
124+ return listener .handlerSignature (listener , event )
95125}
0 commit comments