SendMessage a new message
(ctx context.Context, params MessageSendParams)
| 481 | |
| 482 | // SendMessage a new message |
| 483 | func (service *MessageService) SendMessage(ctx context.Context, params MessageSendParams) (*entities.Message, error) { |
| 484 | ctx, span := service.tracer.Start(ctx) |
| 485 | defer span.End() |
| 486 | |
| 487 | ctxLogger := service.tracer.CtxLogger(service.logger, span) |
| 488 | |
| 489 | sendAttempts, sim, messagesPerMinute := service.phoneSettings(ctx, params.UserID, phonenumbers.Format(params.Owner, phonenumbers.E164)) |
| 490 | |
| 491 | eventPayload := events.MessageAPISentPayload{ |
| 492 | MessageID: uuid.New(), |
| 493 | UserID: params.UserID, |
| 494 | Encrypted: params.Encrypted, |
| 495 | MaxSendAttempts: sendAttempts, |
| 496 | RequestID: params.RequestID, |
| 497 | Owner: phonenumbers.Format(params.Owner, phonenumbers.E164), |
| 498 | Contact: params.Contact, |
| 499 | RequestReceivedAt: params.RequestReceivedAt, |
| 500 | Content: params.Content, |
| 501 | Attachments: params.Attachments, |
| 502 | ScheduledSendTime: params.SendAt, |
| 503 | ExactSendTime: params.SendAt != nil, |
| 504 | SIM: sim, |
| 505 | } |
| 506 | |
| 507 | event, err := service.createMessageAPISentEvent(params.Source, eventPayload) |
| 508 | if err != nil { |
| 509 | msg := fmt.Sprintf("cannot create %T from payload with message id [%s]", event, eventPayload.MessageID) |
| 510 | return nil, service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg)) |
| 511 | } |
| 512 | 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)) |
| 513 | |
| 514 | message, err := service.storeSentMessage(ctx, eventPayload) |
| 515 | if err != nil { |
| 516 | msg := fmt.Sprintf("cannot store message with id [%s]", eventPayload.MessageID) |
| 517 | return nil, service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg)) |
| 518 | } |
| 519 | |
| 520 | timeout := service.getSendDelay(ctxLogger, eventPayload, params, messagesPerMinute) |
| 521 | if _, err = service.eventDispatcher.DispatchWithTimeout(ctx, event, timeout); err != nil { |
| 522 | msg := fmt.Sprintf("cannot dispatch event type [%s] and id [%s]", event.Type(), event.ID()) |
| 523 | return nil, service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg)) |
| 524 | } |
| 525 | |
| 526 | ctxLogger.Info(fmt.Sprintf("[%s] event with ID [%s] dispatched succesfully for message [%s] with user [%s] and delay [%s]", event.Type(), event.ID(), eventPayload.MessageID, eventPayload.UserID, timeout)) |
| 527 | return message, err |
| 528 | } |
| 529 | |
| 530 | // MissedCallParams parameters for sending a new message |
| 531 | type MissedCallParams struct { |
no test coverage detected