public async Task <PerMessageAggregationList> GetPerMessageAggregationAsync(
            string engagementAccount,
            DateTimeOffset startTime,
            DateTimeOffset endTime,
            int count,
            TableContinuationToken continuationToken)
        {
            var historyTable = await this.GetHistoryTableAsync(engagementAccount);

            var segment = await MessageHistoryTableEntity.GetAsync(
                historyTable,
                startTime,
                endTime,
                count,
                continuationToken);

            var aggregations = await Task.WhenAll(
                segment.Select(async historyEntity =>
            {
                var countByState = await MessageDetailTableEntity.CountByStateAsync(
                    this.detailTable,
                    historyEntity.MessageId);

                return(new PerMessageAggregationList.PerMessageAggregation(
                           historyEntity,
                           countByState));
            }));

            return(new PerMessageAggregationList(
                       aggregations,
                       startTime,
                       endTime,
                       segment.ContinuationToken));
        }
        public async Task <MessageDetails> GetMessageHistoryAsync(string engagementAccount, string messageId, int count, TableContinuationToken continuationToken)
        {
            var historyTable = await this.GetHistoryTableAsync(engagementAccount);

            var record = await MessageHistoryTableEntity.GetAsync(historyTable, engagementAccount, messageId);

            if (record == null)
            {
                return(null);
            }

            var result = new MessageDetails
            {
                MessageId = record.MessageId,
                SendTime  = record.SendTime,
                Targets   = record.Targets
            };

            // Calculate success and failed count
            var tuple = await MessageDetailTableEntity.GetResultAsync(this.detailTable, engagementAccount, messageId);

            result.Succeed = tuple.Item1;
            result.Failed  = tuple.Item2;

            // Get details
            return(await MessageDetailTableEntity.ListAsync(this.detailTable, engagementAccount, messageId, count, continuationToken, result));
        }
        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);
        }