public async Task <ServiceProviderResponse> GetMessageDetailAsync(
            [FromHeader(Constant.OperationTrackingIdHeader)] string requestId,
            [FromHeader] string account,
            string messageId,
            [FromQuery] string continuationToken = null,
            [FromQuery] int count = ContinuationToken.DefaultCount)
        {
            var currentAccount = await this.ValidateAccount(account);

            Validator.IsTrue <ArgumentException>(count > 0 && count <= SmsConstant.PagingMaxTakeCount, nameof(count), $"Count should be between 0 and {SmsConstant.PagingMaxTakeCount}.");

            var token = new AzureStorageContinuationToken(continuationToken);

            Validator.IsTrue <ArgumentException>(token.IsValid, nameof(token), "ContinuationToken is invalid.");

            var details = await this.reportManager.GetMessageAsync(account, messageId, count, token.TableContinuationToken);

            Validator.IsTrue <ArgumentException>(details != null, nameof(details), "Message does not exist.");

            var response = ServiceProviderResponse.CreateJsonResponse(HttpStatusCode.OK, details);

            if (details.ContinuationToken != null)
            {
                response.Headers = new Dictionary <string, IEnumerable <string> >
                {
                    { ContinuationToken.ContinuationTokenKey, new List <string> {
                          new AzureStorageContinuationToken(details.ContinuationToken).Token
                      } }
                };
            }

            return(response);
        }
        public async Task <ServiceProviderResponse> GetPerMessageAggregationAsync(
            [FromHeader(Constant.OperationTrackingIdHeader)] string requestId,
            [FromHeader] string account,
            [FromQuery("startTime")] long startTimeUnixSeconds = long.MinValue,
            [FromQuery("endTime")] long endTimeUnixSeconds     = long.MaxValue,
            [FromQuery] string continuationToken = null,
            [FromQuery] int count = ContinuationToken.DefaultCount)
        {
            var currentAccount = await this.ValidateAccount(account);

            Validator.IsTrue <ArgumentException>(count > 0 && count <= SmsConstant.PagingMaxTakeCount, nameof(count), $"Count should be between 0 and {SmsConstant.PagingMaxTakeCount}.");

            var token = new AzureStorageContinuationToken(continuationToken);

            Validator.IsTrue <ArgumentException>(token.IsValid, nameof(token), "ContinuationToken is invalid.");

            var            utcNow = DateTime.UtcNow;
            DateTimeOffset startTime, endTime;

            try
            {
                startTime = DateTimeOffset.FromUnixTimeSeconds(startTimeUnixSeconds);
            }
            catch
            {
                startTime = new DateTimeOffset(utcNow.Year, utcNow.Month, 1, 0, 0, 0, TimeSpan.Zero);
            }

            try
            {
                endTime = DateTimeOffset.FromUnixTimeSeconds(endTimeUnixSeconds);
            }
            catch
            {
                endTime = new DateTimeOffset(utcNow);
            }

            var result = await this.reportManager.GetPerMessageAggregationAsync(
                account,
                startTime,
                endTime,
                count,
                token.TableContinuationToken);

            var response = ServiceProviderResponse.CreateJsonResponse(HttpStatusCode.OK, result);

            if (result.ContinuationToken != null)
            {
                response.Headers = new Dictionary <string, IEnumerable <string> >
                {
                    {
                        ContinuationToken.ContinuationTokenKey,
                        new[]
                        {
                            new AzureStorageContinuationToken(result.ContinuationToken).Token
                        }
                    }
                };
            }

            return(response);
        }