public MessageSummaryTableEntity(InputMessage message, SmsMessageInfoExtension extension) { this.EngagementAccount = message.MessageInfo.EngagementAccount; this.MessageId = message.MessageInfo.MessageId.ToString(); this.MessageBody = message.MessageInfo.MessageBody; this.Targets = message.Targets.Count; this.SendTime = message.MessageInfo.SendTime; this.LastUpdateTime = DateTime.UtcNow; this.MessageCategory = extension.MessageCategory.ToString(); this.PartitionKey = this.MessageId; this.RowKey = this.EngagementAccount; }
public async Task OnMessageSentAsync(InputMessage message, SmsMessageInfoExtension extension) { // Create record in summary table var summary = new MessageSummaryTableEntity(message, extension); await MessageSummaryTableEntity.InsertOrMergeAsync(this.summaryTable, summary); // Create record in history table var historyTable = await this.GetHistoryTableAsync(message.MessageInfo.EngagementAccount); if (historyTable == null) { // Create the table in case any issue in account initialize historyTable = await this.GetHistoryTableAsync(message.MessageInfo.EngagementAccount, true); } await MessageHistoryTableEntity.InsertOrMergeAsync(historyTable, summary); }
private async Task DispatchMessageAsync(InputMessage message, SmsMessageInfoExtension extension, string requestId) { // Get partition based on message category var partition = this.configuration.DispatchPartitions.SingleOrDefault(p => p.Category == extension.MessageCategory); if (partition == null) { var exception = new ApplicationException($"Cannot dispatch message for category {extension.MessageCategory.ToString()}"); SmsProviderEventSource.Current.CriticalException(SmsProviderEventSource.EmptyTrackingId, this, nameof(this.DispatchMessageAsync), OperationStates.Failed, "Dispatcher service partition failure", exception); throw exception; } var partionId = this.random.Next(partition.MinPartition, partition.MaxPartition + 1); // Config callback service uri message.ReportingServiceUri = SmsConstant.ReportingServiceUri; // Send to dispatcher service var client = this.proxyFactory.CreateServiceProxy <IDispatcherService>(new Uri(SmsConstant.DispatcherServiceUri), new ServicePartitionKey(partionId), TargetReplicaSelector.PrimaryReplica); await client.DispatchAsync(new List <InputMessage> { message }, CancellationToken.None); }
public async Task OnMessageSentAsync(string engagementAccount, InputMessage message, SmsMessageInfoExtension extension) { if (message.Targets == null || message.Targets.Count <= 0) { return; } // Init telemetry await this.telemetryManager.OnMessageSentAsync(message, extension); // Get connector metadata var metadata = await this.credentialManager.GetMetadata(message.ConnectorCredential.ConnectorName); if (metadata.ReportType != ConnectorMetadata.ConnectorInboundType.Pull) { return; } // Update agent metadata var meta = await this.store.GetAgentMetadataAsync(message.ConnectorCredential); if (meta == null) { meta = new AgentMetadata(); meta.ConnectorName = message.ConnectorCredential.ConnectorName; meta.ConnectorId = message.ConnectorCredential.ConnectorId; } meta.LastMessageSendTime = message.MessageInfo.SendTime; meta.PendingReceive += message.Targets.Count; await this.store.CreateOrUpdateAgentMetadataAsync(meta); // Get agent var agent = this.GetAgent(message.ConnectorCredential); if (agent == null) { return; } // Notify agent of message sent agent.OnMessageSent(message, message.MessageInfo.TrackingId); }
private async Task <MessagePack> BuildInputMessageAsync(Account account, MessageSendRequest request, string requestId) { // Validate extended code this.ValidateExtendedCode(request.ExtendedCode); // Get template var template = await this.store.GetTemplateAsync(account.EngagementAccount, request.MessageBody.TemplateName); Validator.IsTrue <ArgumentException>(template != null && template.State == ResourceState.Active, nameof(template), "Template does not exist or is not active"); // Validate account settings this.ValidateAccountSettings(account, template); // Get signature var signature = await this.store.GetSignatureAsync(account.EngagementAccount, template.Signature); Validator.IsTrue <ArgumentException>(signature != null && signature.State == ResourceState.Active, nameof(signature), "Signature does not exist or is not active"); // Get message body var messageBody = this.ValidateTemplateParameters(template, request.MessageBody.TemplateParameters); messageBody = string.Format(SmsConstant.SmsBodyFormat, signature.Value, messageBody); // Get credential assignement var channelType = SmsConstant.MessageSendChannelMappings[template.Category]; var assignment = await this.credentialManager.GetCredentialAssignmentByAccountAsync(account.EngagementAccount, channelType); Validator.IsTrue <ApplicationException>(assignment != null, nameof(assignment), "No active credential assignment for account {0}", account.EngagementAccount); // Get credential and metadata var credential = await this.credentialManager.GetConnectorCredentialByIdAsync(assignment.ConnectorIdentifier); Validator.IsTrue <ApplicationException>(credential != null, nameof(credential), "Invalid credential for account {0}", account.EngagementAccount); var metadata = await this.credentialManager.GetMetadata(assignment.ConnectorIdentifier.ConnectorName); // Extended code consists of three segments var extendedCodes = new List <string> { assignment.ExtendedCode, signature.ExtendedCode, request.ExtendedCode }; var extension = new SmsMessageInfoExtension(); extension.ChannelType = SmsConstant.MessageSendChannelMappings[template.Category]; extension.MessageCategory = template.Category; extension.ExtendedCodes = extendedCodes; var message = new InputMessage(); message.MessageInfo = new MessageInfo(); message.MessageInfo.EngagementAccount = account.EngagementAccount; message.MessageInfo.MessageId = Guid.NewGuid(); message.MessageInfo.MessageBody = messageBody; message.MessageInfo.SendTime = DateTime.UtcNow; message.MessageInfo.TrackingId = requestId; message.MessageInfo.ExtensionData = extension.ToString(); message.Targets = request.Targets.AsReadOnly(); message.ConnectorCredential = credential.ToDataContract(metadata); return(new MessagePack { InputMessage = message, Extension = extension, Signature = signature }); }