55 "fmt"
66 "time"
77
8+ "github.com/NdoleStudio/httpsms/pkg/events"
9+ cloudevents "github.com/cloudevents/sdk-go/v2"
10+
811 "github.com/google/uuid"
912 "github.com/nyaruka/phonenumbers"
1013
@@ -17,20 +20,24 @@ import (
1720
1821// PhoneService is handles phone requests
1922type PhoneService struct {
23+ service
2024 logger telemetry.Logger
2125 tracer telemetry.Tracer
2226 repository repositories.PhoneRepository
27+ dispatcher * EventDispatcher
2328}
2429
2530// NewPhoneService creates a new PhoneService
2631func NewPhoneService (
2732 logger telemetry.Logger ,
2833 tracer telemetry.Tracer ,
2934 repository repositories.PhoneRepository ,
35+ dispatcher * EventDispatcher ,
3036) (s * PhoneService ) {
3137 return & PhoneService {
3238 logger : logger .WithService (fmt .Sprintf ("%T" , s )),
3339 tracer : tracer ,
40+ dispatcher : dispatcher ,
3441 repository : repository ,
3542 }
3643}
@@ -58,6 +65,7 @@ type PhoneUpsertParams struct {
5865 FcmToken * string
5966 MessagesPerMinute * uint
6067 MessageExpirationDuration * time.Duration
68+ Source string
6169 UserID entities.UserID
6270}
6371
@@ -82,40 +90,63 @@ func (service *PhoneService) Upsert(ctx context.Context, params PhoneUpsertParam
8290 msg := fmt .Sprintf ("cannot update phone with id [%s] and number [%s]" , phone .ID , phone .PhoneNumber )
8391 return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
8492 }
85-
86- ctxLogger . Info ( fmt . Sprintf ( "phone saved with id [%s] in the userRepository" , phone . ID ))
87- return phone , nil
88- }
89-
90- func ( service * PhoneService ) update ( phone * entities. Phone , params PhoneUpsertParams ) * entities. Phone {
91- if phone . FcmToken != nil {
92- phone . FcmToken = params . FcmToken
93- }
94- if params . MessagesPerMinute != nil {
95- phone . MessagesPerMinute = * params . MessagesPerMinute
93+ ctxLogger . Info ( fmt . Sprintf ( "phone saved with id [%s] in the phone repository" , phone . ID ))
94+
95+ event , err := service . createPhoneUpdatedEvent ( params . Source , events. PhoneUpdatedPayload {
96+ PhoneID : phone . ID ,
97+ UserID : phone . UserID ,
98+ Timestamp : phone . UpdatedAt ,
99+ Owner : phone . PhoneNumber ,
100+ })
101+ if err != nil {
102+ msg := fmt . Sprintf ( "cannot create event when phone is updated" )
103+ return nil , service . tracer . WrapErrorSpan ( span , stacktrace . Propagate ( err , msg ))
96104 }
97105
98- if params .MessageExpirationDuration != nil {
99- phone .MessageExpirationSeconds = uint (params .MessageExpirationDuration .Seconds ())
106+ if err = service .dispatcher .Dispatch (ctx , event ); err != nil {
107+ msg := fmt .Sprintf ("cannot dispatch event [%s] for phone with id [%s]" , event .Type (), phone .ID )
108+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
100109 }
101- return phone
110+
111+ return phone , nil
102112}
103113
104114// Delete an entities.Phone
105- func (service * PhoneService ) Delete (ctx context.Context , userID entities.UserID , phoneID uuid.UUID ) error {
115+ func (service * PhoneService ) Delete (ctx context.Context , source string , userID entities.UserID , phoneID uuid.UUID ) error {
106116 ctx , span := service .tracer .Start (ctx )
107117 defer span .End ()
108118
109119 ctxLogger := service .tracer .CtxLogger (service .logger , span )
110120
111- err := service .repository .Delete (ctx , userID , phoneID )
121+ phone , err := service .repository .LoadByID (ctx , userID , phoneID )
112122 if err != nil {
123+ msg := fmt .Sprintf ("cannot load phone with userID [%s] and phoneID [%s]" , userID , phoneID )
124+ return service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
125+ }
126+
127+ if err = service .repository .Delete (ctx , userID , phoneID ); err != nil {
113128 msg := fmt .Sprintf ("cannot delete phone with id [%s] and user id [%s]" , phoneID , userID )
114129 return service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
115130 }
116131
117132 ctxLogger .Info (fmt .Sprintf ("deleted phone with id [%s] and user id [%s]" , phoneID , userID ))
118133
134+ event , err := service .createPhoneDeletedEvent (source , events.PhoneDeletedPayload {
135+ PhoneID : phone .ID ,
136+ UserID : phone .UserID ,
137+ Timestamp : phone .UpdatedAt ,
138+ Owner : phone .PhoneNumber ,
139+ })
140+ if err != nil {
141+ msg := fmt .Sprintf ("cannot create event when phone is deleted" )
142+ return service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
143+ }
144+
145+ if err = service .dispatcher .Dispatch (ctx , event ); err != nil {
146+ msg := fmt .Sprintf ("cannot dispatch event [%s] for phone with id [%s]" , event .Type (), phone .ID )
147+ return service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
148+ }
149+
119150 return nil
120151}
121152
@@ -141,3 +172,25 @@ func (service *PhoneService) createPhone(ctx context.Context, params PhoneUpsert
141172
142173 return phone , nil
143174}
175+
176+ func (service * PhoneService ) createPhoneUpdatedEvent (source string , payload events.PhoneUpdatedPayload ) (cloudevents.Event , error ) {
177+ return service .createEvent (events .EventTypePhoneUpdated , source , payload )
178+ }
179+
180+ func (service * PhoneService ) createPhoneDeletedEvent (source string , payload events.PhoneDeletedPayload ) (cloudevents.Event , error ) {
181+ return service .createEvent (events .EventTypePhoneUpdated , source , payload )
182+ }
183+
184+ func (service * PhoneService ) update (phone * entities.Phone , params PhoneUpsertParams ) * entities.Phone {
185+ if phone .FcmToken != nil {
186+ phone .FcmToken = params .FcmToken
187+ }
188+ if params .MessagesPerMinute != nil {
189+ phone .MessagesPerMinute = * params .MessagesPerMinute
190+ }
191+
192+ if params .MessageExpirationDuration != nil {
193+ phone .MessageExpirationSeconds = uint (params .MessageExpirationDuration .Seconds ())
194+ }
195+ return phone
196+ }
0 commit comments