@@ -416,6 +416,55 @@ func (service *MessageService) SendMessage(ctx context.Context, params MessageSe
416416 return message , err
417417}
418418
419+ // MissedCallParams parameters for sending a new message
420+ type MissedCallParams struct {
421+ Owner * phonenumbers.PhoneNumber
422+ Contact string
423+ Source string
424+ SIM entities.SIM
425+ Timestamp time.Time
426+ UserID entities.UserID
427+ }
428+
429+ // RegisterMissedCall a new message
430+ func (service * MessageService ) RegisterMissedCall (ctx context.Context , params * MissedCallParams ) (* entities.Message , error ) {
431+ ctx , span := service .tracer .Start (ctx )
432+ defer span .End ()
433+
434+ ctxLogger := service .tracer .CtxLogger (service .logger , span )
435+
436+ eventPayload := & events.MessageCallMissedPayload {
437+ MessageID : uuid .New (),
438+ UserID : params .UserID ,
439+ Timestamp : params .Timestamp ,
440+ Owner : phonenumbers .Format (params .Owner , phonenumbers .E164 ),
441+ Contact : params .Contact ,
442+ SIM : params .SIM ,
443+ }
444+
445+ event , err := service .createEvent (events .MessageCallMissed , params .Source , eventPayload )
446+ if err != nil {
447+ msg := fmt .Sprintf ("cannot create [%T] from payload with message id [%s]" , event , eventPayload .MessageID )
448+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
449+ }
450+
451+ ctxLogger .Info (fmt .Sprintf ("created event [%s] with id [%s] and message id [%s] and user [%s]" , event .Type (), event .ID (), eventPayload .MessageID , eventPayload .UserID ))
452+
453+ message , err := service .storeMissedCallMessage (ctx , eventPayload )
454+ if err != nil {
455+ msg := fmt .Sprintf ("cannot store missed call message message with id [%s]" , eventPayload .MessageID )
456+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
457+ }
458+
459+ if err = service .eventDispatcher .Dispatch (ctx , event ); err != nil {
460+ msg := fmt .Sprintf ("cannot dispatch event type [%s] and id [%s]" , event .Type (), event .ID ())
461+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
462+ }
463+
464+ ctxLogger .Info (fmt .Sprintf ("[%s] event with ID [%s] dispatched succesfully for message [%s] with user [%s]" , event .Type (), event .ID (), eventPayload .MessageID , eventPayload .UserID ))
465+ return message , err
466+ }
467+
419468func (service * MessageService ) getSendDelay (ctxLogger telemetry.Logger , eventPayload events.MessageAPISentPayload , sendAt * time.Time ) time.Duration {
420469 if sendAt == nil {
421470 return time .Duration (0 )
@@ -848,6 +897,36 @@ func (service *MessageService) storeSentMessage(ctx context.Context, payload eve
848897 return message , nil
849898}
850899
900+ // storeMissedCallMessage a new message
901+ func (service * MessageService ) storeMissedCallMessage (ctx context.Context , payload * events.MessageCallMissedPayload ) (* entities.Message , error ) {
902+ ctx , span := service .tracer .Start (ctx )
903+ defer span .End ()
904+
905+ ctxLogger := service .tracer .CtxLogger (service .logger , span )
906+
907+ message := & entities.Message {
908+ ID : payload .MessageID ,
909+ Owner : payload .Owner ,
910+ Contact : payload .Contact ,
911+ UserID : payload .UserID ,
912+ SIM : payload .SIM ,
913+ Type : entities .MessageTypeCallMissed ,
914+ Status : entities .MessageStatusReceived ,
915+ RequestReceivedAt : payload .Timestamp ,
916+ CreatedAt : time .Now ().UTC (),
917+ UpdatedAt : time .Now ().UTC (),
918+ OrderTimestamp : payload .Timestamp ,
919+ }
920+
921+ if err := service .repository .Store (ctx , message ); err != nil {
922+ msg := fmt .Sprintf ("cannot save missed call message with id [%s]" , payload .MessageID )
923+ return nil , service .tracer .WrapErrorSpan (span , stacktrace .Propagate (err , msg ))
924+ }
925+
926+ ctxLogger .Info (fmt .Sprintf ("missed call message saved with id [%s]" , payload .MessageID ))
927+ return message , nil
928+ }
929+
851930func (service * MessageService ) createMessageSendExpiredEvent (source string , payload events.MessageSendExpiredPayload ) (cloudevents.Event , error ) {
852931 return service .createEvent (events .EventTypeMessageSendExpired , source , payload )
853932}
0 commit comments