@@ -130,6 +130,58 @@ func (service *MessageService) StoreEvent(ctx context.Context, message *entities
130130 return service .repository .Load (ctx , params .MessageID )
131131}
132132
133+ // MessageReceiveParams parameters registering a message event
134+ type MessageReceiveParams struct {
135+ From string
136+ To string
137+ Content string
138+ Timestamp time.Time
139+ Source string
140+ }
141+
142+ // ReceiveMessage handles message received by a mobile phone
143+ func (service * MessageService ) ReceiveMessage (ctx context.Context , params MessageReceiveParams ) (* entities.Message , error ) {
144+ ctx , span := service .tracer .Start (ctx )
145+ defer span .End ()
146+
147+ ctxLogger := service .tracer .CtxLogger (service .logger , span )
148+
149+ eventPayload := events.MessagePhoneReceivedPayload {
150+ ID : uuid .New (),
151+ From : params .From ,
152+ To : params .To ,
153+ Timestamp : params .Timestamp ,
154+ Content : params .Content ,
155+ }
156+
157+ ctxLogger .Info (fmt .Sprintf ("creating cloud event for received with ID [%s]" , eventPayload .ID ))
158+
159+ event , err := service .createMessagePhoneReceivedEvent (params .Source , eventPayload )
160+ if err != nil {
161+ msg := fmt .Sprintf ("cannot create %T from payload with message id [%s]" , event , eventPayload .ID )
162+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
163+ }
164+
165+ ctxLogger .Info (fmt .Sprintf ("created event [%s] with id [%s] and message id [%s]" , event .Type (), event .ID (), eventPayload .ID ))
166+
167+ if err = service .eventDispatcher .Dispatch (ctx , event ); err != nil {
168+ msg := fmt .Sprintf ("cannot dispatch event type [%s] and id [%s]" , event .Type (), event .ID ())
169+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
170+ }
171+
172+ ctxLogger .Info (fmt .Sprintf ("event [%s] dispatched succesfully" , event .ID ()))
173+
174+ message , err := service .repository .Load (ctx , eventPayload .ID )
175+ if err != nil {
176+ msg := fmt .Sprintf ("cannot load message with ID [%s] in the repository" , eventPayload .ID )
177+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
178+ }
179+
180+ ctxLogger .Info (fmt .Sprintf ("fetched message with id [%s] from the repository" , message .ID ))
181+
182+ return message , nil
183+ }
184+
133185func (service * MessageService ) handleMessageSentEvent (ctx context.Context , params MessageStorePhoneEventParams , message * entities.Message ) error {
134186 ctx , span := service .tracer .Start (ctx )
135187 defer span .End ()
@@ -263,16 +315,15 @@ func (service *MessageService) SendMessage(ctx context.Context, params MessageSe
263315
264316// MessageStoreParams are parameters for creating a new message
265317type MessageStoreParams struct {
266- From string
267- To string
268- Content string
269- ID uuid.UUID
270- Source string
271- RequestReceivedAt time.Time
318+ From string
319+ To string
320+ Content string
321+ ID uuid.UUID
322+ Timestamp time.Time
272323}
273324
274- // StoreMessage a new message
275- func (service * MessageService ) StoreMessage (ctx context.Context , params MessageStoreParams ) (* entities.Message , error ) {
325+ // StoreSentMessage a new message
326+ func (service * MessageService ) StoreSentMessage (ctx context.Context , params MessageStoreParams ) (* entities.Message , error ) {
276327 ctx , span := service .tracer .Start (ctx )
277328 defer span .End ()
278329
@@ -285,10 +336,10 @@ func (service *MessageService) StoreMessage(ctx context.Context, params MessageS
285336 Content : params .Content ,
286337 Type : entities .MessageTypeMobileTerminated ,
287338 Status : entities .MessageStatusPending ,
288- RequestReceivedAt : params .RequestReceivedAt ,
339+ RequestReceivedAt : params .Timestamp ,
289340 CreatedAt : time .Now ().UTC (),
290341 UpdatedAt : time .Now ().UTC (),
291- OrderTimestamp : params .RequestReceivedAt ,
342+ OrderTimestamp : params .Timestamp ,
292343 SendDuration : nil ,
293344 LastAttemptedAt : nil ,
294345 SentAt : nil ,
@@ -304,6 +355,36 @@ func (service *MessageService) StoreMessage(ctx context.Context, params MessageS
304355 return message , nil
305356}
306357
358+ // StoreReceivedMessage a new message
359+ func (service * MessageService ) StoreReceivedMessage (ctx context.Context , params MessageStoreParams ) (* entities.Message , error ) {
360+ ctx , span := service .tracer .Start (ctx )
361+ defer span .End ()
362+
363+ ctxLogger := service .tracer .CtxLogger (service .logger , span )
364+
365+ message := & entities.Message {
366+ ID : params .ID ,
367+ From : params .From ,
368+ To : params .To ,
369+ Content : params .Content ,
370+ Type : entities .MessageTypeMobileOriginated ,
371+ Status : entities .MessageStatusReceived ,
372+ RequestReceivedAt : params .Timestamp ,
373+ CreatedAt : time .Now ().UTC (),
374+ UpdatedAt : time .Now ().UTC (),
375+ OrderTimestamp : params .Timestamp ,
376+ ReceivedAt : & params .Timestamp ,
377+ }
378+
379+ if err := service .repository .Store (ctx , message ); err != nil {
380+ msg := fmt .Sprintf ("cannot save message with id [%s]" , params .ID )
381+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
382+ }
383+
384+ ctxLogger .Info (fmt .Sprintf ("message saved with id [%s] in the repository" , message .ID ))
385+ return message , nil
386+ }
387+
307388// HandleMessageParams are parameters for handling a message event
308389type HandleMessageParams struct {
309390 ID uuid.UUID
@@ -368,6 +449,10 @@ func (service *MessageService) createMessageAPISentEvent(source string, payload
368449 return service .createEvent (events .EventTypeMessageAPISent , source , payload )
369450}
370451
452+ func (service * MessageService ) createMessagePhoneReceivedEvent (source string , payload events.MessagePhoneReceivedPayload ) (cloudevents.Event , error ) {
453+ return service .createEvent (events .EventTypeMessagePhoneReceived , source , payload )
454+ }
455+
371456func (service * MessageService ) createMessagePhoneSendingEvent (source string , payload events.MessagePhoneSendingPayload ) (cloudevents.Event , error ) {
372457 return service .createEvent (events .EventTypeMessagePhoneSending , source , payload )
373458}
0 commit comments