Exemple #1
0
        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
            });
        }