コード例 #1
0
        public async Task <IActionResult> GetReportNotifications([FromBody] NotificationReportRequest notificationFilterRequest)
        {
            if (notificationFilterRequest is null)
            {
                throw new System.ArgumentException("Notification Filter Request cannot be null");
            }

            Tuple <IList <NotificationReportResponse>, TableContinuationToken> notificationResponses;

            this.logger.TraceInformation($"Started {nameof(this.GetReportNotifications)} method of {nameof(NotificationReportController)}.");
            notificationResponses = await this.notificationReportManager.GetReportNotifications(notificationFilterRequest).ConfigureAwait(false);

            string nextPartitionKey = notificationResponses.Item2?.NextPartitionKey;
            string nextRowKey       = notificationResponses.Item2?.NextRowKey;

            if (nextPartitionKey != null && nextRowKey != null)
            {
                this.Response.Headers.Add("Access-Control-Expose-Headers", "X-NextPartitionKey, X-NextRowKey");
                this.Response.Headers.Add("X-NextPartitionKey", nextPartitionKey);
                this.Response.Headers.Add("X-NextRowKey", nextRowKey);
            }

            this.logger.TraceInformation($"Finished {nameof(this.GetReportNotifications)} method of {nameof(NotificationReportController)}.");
            return(new OkObjectResult(notificationResponses.Item1));
        }
        public void GetFilteredEmailNotificationTests()
        {
            var request = new NotificationReportRequest()
            {
                NotificationStatusFilter = new List <NotificationItemStatus> {
                    NotificationItemStatus.Sent, NotificationItemStatus.Processing
                },
                NotificationPriorityFilter = new List <NotificationPriority> {
                    NotificationPriority.High
                },
                NotificationTypeFilter = new List <NotificationType> {
                    NotificationType.Mail
                },
                NotificationIdsFilter = new List <string> {
                    "1"
                },
                MailSensitivityFilter = new List <MailSensitivity> {
                    MailSensitivity.Normal
                },
                AccountsUsedFilter = new List <string> {
                    "gtauser"
                },
                ApplicationFilter = new List <string>()
                {
                    "test", "SelectedApp",
                },
                CreatedDateTimeStart = "2020-07-21",
            };
            var faultedResult = this.EmailNotificationRepository.GetEmailNotifications(null);

            Assert.AreEqual(faultedResult.Status.ToString(), "Faulted");

            Expression <Func <EmailNotificationItemEntity, bool> >     filterExpression = n => true;
            Expression <Func <EmailNotificationItemEntity, DateTime> > sortExpression   = n => n.CreatedDateTime;

            Expression <Func <EmailNotificationItemEntity, EmailNotificationItemEntity> > selectExpression = n => new EmailNotificationItemEntity()
            {
                NotificationId = n.NotificationId
            };
            var result = this.EmailNotificationRepository.GetEmailNotifications(request);

            Assert.AreEqual(result.Status.ToString(), "RanToCompletion");

            this.CosmosDBQueryClient.Verify(cdq => cdq.GetCosmosContainer(It.IsAny <string>(), It.IsAny <string>()), Times.Once);
            this.CosmosContainer.Verify(container => container.GetItemLinqQueryable <EmailNotificationItemEntity>(It.IsAny <bool>(), It.IsAny <string>(), It.IsAny <QueryRequestOptions>()), Times.Once);
            Assert.Pass();
        }
コード例 #3
0
        private string GetDateFilterExpression(NotificationReportRequest notificationReportRequest)
        {
            string filterExpression = null;

            if (DateTime.TryParse(notificationReportRequest.CreatedDateTimeStart, out DateTime createdDateTimeStart))
            {
                filterExpression = filterExpression == null?TableQuery.GenerateFilterConditionForDate("CreatedDateTimeStart", QueryComparisons.GreaterThanOrEqual, createdDateTimeStart) : filterExpression + TableQuery.GenerateFilterConditionForDate("CreatedDateTimeStart", QueryComparisons.GreaterThanOrEqual, createdDateTimeStart);
            }

            if (DateTime.TryParse(notificationReportRequest.CreatedDateTimeEnd, out DateTime createdDateTimeEnd))
            {
                filterExpression = filterExpression == null?TableQuery.GenerateFilterConditionForDate("CreatedDateTimeEnd", QueryComparisons.LessThanOrEqual, createdDateTimeEnd) : filterExpression + TableQuery.GenerateFilterConditionForDate("CreatedDateTimeEnd", QueryComparisons.LessThanOrEqual, createdDateTimeEnd);
            }

            if (DateTime.TryParse(notificationReportRequest.SendOnUtcDateStart, out DateTime sentTimeStart))
            {
                filterExpression = filterExpression == null?TableQuery.GenerateFilterConditionForDate("SendOnUtcDateStart", QueryComparisons.GreaterThanOrEqual, sentTimeStart) : filterExpression + TableQuery.GenerateFilterConditionForDate("SendOnUtcDateStart", QueryComparisons.GreaterThanOrEqual, sentTimeStart);
            }

            if (DateTime.TryParse(notificationReportRequest.SendOnUtcDateEnd, out DateTime sentTimeEnd))
            {
                filterExpression = filterExpression == null?TableQuery.GenerateFilterConditionForDate("SendOnUtcDateEnd", QueryComparisons.LessThanOrEqual, sentTimeEnd) : filterExpression + TableQuery.GenerateFilterConditionForDate("SendOnUtcDateEnd", QueryComparisons.LessThanOrEqual, sentTimeEnd);
            }

            if (DateTime.TryParse(notificationReportRequest.UpdatedDateTimeStart, out DateTime updatedTimeStart))
            {
                filterExpression = filterExpression == null?TableQuery.GenerateFilterConditionForDate("UpdatedDateTimeStart", QueryComparisons.GreaterThanOrEqual, updatedTimeStart) : filterExpression + TableQuery.GenerateFilterConditionForDate("UpdatedDateTimeStart", QueryComparisons.GreaterThanOrEqual, updatedTimeStart);
            }

            if (DateTime.TryParse(notificationReportRequest.UpdatedDateTimeEnd, out DateTime updatedTimeEnd))
            {
                filterExpression = filterExpression == null?TableQuery.GenerateFilterConditionForDate("UpdatedDateTimeEnd", QueryComparisons.LessThanOrEqual, updatedTimeEnd) : filterExpression + TableQuery.GenerateFilterConditionForDate("UpdatedDateTimeEnd", QueryComparisons.LessThanOrEqual, updatedTimeEnd);
            }

            return(filterExpression);
        }
コード例 #4
0
        public void GetReportNotificationsWithApplicationFilter()
        {
            Dictionary <string, string> testConfigValues = new Dictionary <string, string>()
            {
                { "RetrySetting:MaxRetries", "10" },
                { "RetrySetting:TransientRetryCount", "3" },
                { NotificationService.Common.Constants.StorageType, StorageType.StorageAccount.ToString() },
            };

            this.Configuration = new ConfigurationBuilder()
                                 .AddInMemoryCollection(testConfigValues)
                                 .Build();

            List <NotificationReportResponse> results = new List <NotificationReportResponse>();

            results.Add(new NotificationReportResponse()
            {
                NotificationId = "1", Application = "SelectedApp"
            });
            results.Add(new NotificationReportResponse()
            {
                NotificationId = "2", Application = "SelectedApp"
            });

            var request = new NotificationReportRequest()
            {
                NotificationStatusFilter = new List <NotificationItemStatus> {
                    NotificationItemStatus.Sent, NotificationItemStatus.Processing
                },
                NotificationPriorityFilter = new List <NotificationPriority> {
                    NotificationPriority.High
                },
                NotificationTypeFilter = new List <NotificationType> {
                    NotificationType.Mail
                },
                NotificationIdsFilter = new List <string> {
                    "1"
                },
                MailSensitivityFilter = new List <MailSensitivity> {
                    MailSensitivity.Normal
                },
                AccountsUsedFilter = new List <string> {
                    "gtauser"
                },
                ApplicationFilter = new List <string>()
                {
                    "test", "SelectedApp",
                },
                CreatedDateTimeStart = "2020-07-21",
            };

            List <EmailNotificationItemEntity> dbEntities = new List <EmailNotificationItemEntity>();

            dbEntities.Add(new EmailNotificationItemEntity()
            {
                NotificationId = "1", Application = "SelectedApp"
            });
            dbEntities.Add(new EmailNotificationItemEntity()
            {
                NotificationId = "2", Application = "SelectedApp"
            });

            var tuple = Tuple.Create <IList <EmailNotificationItemEntity>, TableContinuationToken>(dbEntities, null);

            _ = this.EmailNotificationRepository
                .Setup(repository => repository.GetEmailNotifications(request))
                .ReturnsAsync(tuple);

            _ = this.EmailNotificationRepositoryFactory
                .Setup(repository => repository.GetRepository(StorageType.StorageAccount))
                .Returns(this.EmailNotificationRepository.Object);

            this.NotificationReportManager = new NotificationReportManager(this.Logger, this.EmailNotificationRepositoryFactory.Object, this.Configuration, this.EmailManager.Object, this.MailTemplateRepository.Object);

            var managerResult = this.NotificationReportManager.GetReportNotifications(request);

            Assert.AreEqual(managerResult.Status.ToString(), "RanToCompletion");
            CollectionAssert.AreEquivalent(managerResult.Result.Item1.Select(x => x.NotificationId), results.Select(x => x.NotificationId));

            this.EmailNotificationRepositoryFactory.Verify(repo => repo.GetRepository(StorageType.StorageAccount).GetEmailNotifications(request));
        }
コード例 #5
0
        private Expression <Func <MeetingNotificationItemCosmosDbEntity, bool> > GetMeetingFilterExpression(NotificationReportRequest notificationReportRequest)
        {
            Expression <Func <MeetingNotificationItemCosmosDbEntity, bool> > filterExpression = notification => true;

            if (DateTime.TryParse(notificationReportRequest.CreatedDateTimeStart, out DateTime createdDateTimeStart))
            {
                filterExpression = filterExpression.And(notification => notification.CreatedDateTime >= createdDateTimeStart);
            }

            if (DateTime.TryParse(notificationReportRequest.CreatedDateTimeEnd, out DateTime createdDateTimeEnd))
            {
                filterExpression = filterExpression.And(notification => notification.CreatedDateTime <= createdDateTimeEnd);
            }

            if (DateTime.TryParse(notificationReportRequest.SendOnUtcDateStart, out DateTime sentTimeStart))
            {
                filterExpression = filterExpression.And(notification => notification.SendOnUtcDate >= sentTimeStart);
            }

            if (DateTime.TryParse(notificationReportRequest.SendOnUtcDateEnd, out DateTime sentTimeEnd))
            {
                filterExpression = filterExpression.And(notification => notification.SendOnUtcDate <= sentTimeEnd);
            }

            if (DateTime.TryParse(notificationReportRequest.UpdatedDateTimeStart, out DateTime updatedTimeStart))
            {
                filterExpression = filterExpression.And(notification => notification.UpdatedDateTime >= updatedTimeStart);
            }

            if (DateTime.TryParse(notificationReportRequest.UpdatedDateTimeEnd, out DateTime updatedTimeEnd))
            {
                filterExpression = filterExpression.And(notification => notification.UpdatedDateTime <= updatedTimeEnd);
            }

            if (notificationReportRequest.NotificationPriorityFilter?.Count > 0)
            {
                List <string> priorityList = notificationReportRequest.NotificationPriorityFilter.ToList().ConvertAll(f => f.ToString());
                filterExpression = filterExpression.And(notification => priorityList.Contains(notification.Priority));
            }

            if (notificationReportRequest.ApplicationFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.ApplicationFilter.Contains(notification.Application));
            }

            if (notificationReportRequest.AccountsUsedFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.AccountsUsedFilter.Contains(notification.EmailAccountUsed));
            }

            if (notificationReportRequest.NotificationIdsFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.NotificationIdsFilter.Contains(notification.NotificationId));
            }

            if (notificationReportRequest.NotificationStatusFilter?.Count > 0)
            {
                List <string> statusList = notificationReportRequest.NotificationStatusFilter.ToList().ConvertAll(f => f.ToString());
                filterExpression = filterExpression.And(notification => statusList.Contains(notification.Status));
            }

            if (notificationReportRequest.TrackingIdsFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.TrackingIdsFilter.Contains(notification.TrackingId));
            }

            return(filterExpression);
        }
コード例 #6
0
        /// <inheritdoc/>
        public async Task <Tuple <IList <MeetingNotificationItemEntity>, Microsoft.Azure.Cosmos.Table.TableContinuationToken> > GetMeetingInviteNotifications(NotificationReportRequest meetingInviteReportRequest)
        {
            if (meetingInviteReportRequest is null)
            {
                throw new System.ArgumentNullException(nameof(meetingInviteReportRequest));
            }
            Expression <Func <MeetingNotificationItemCosmosDbEntity, bool> > filterExpression = this.GetMeetingFilterExpression(meetingInviteReportRequest);
            Expression <Func <MeetingNotificationItemCosmosDbEntity, MeetingNotificationItemCosmosDbEntity> > projectionExpression = this.GetMeetingProjectionExpression();
            Expression <Func <MeetingNotificationItemCosmosDbEntity, DateTime> > orderExpression = this.GetMeetingOrderExpression();
            int skip = meetingInviteReportRequest.Skip;
            int take = meetingInviteReportRequest.Take > 0 ? meetingInviteReportRequest.Take : 100;

            if (filterExpression == null)
            {
                throw new ArgumentNullException($"Filter Expression Cannot be null");
            }

            if (projectionExpression == null)
            {
                throw new ArgumentNullException($"Select Expression Cannot be null");
            }

            if (orderExpression == null)
            {
                throw new ArgumentNullException($"Order Expression Cannot be null");
            }

            this.logger.TraceInformation($"Started {nameof(this.GetEmailNotifications)} method of {nameof(EmailNotificationRepository)}.");

            var filteredNotifications = new List <MeetingNotificationItemEntity>();
            var query = this.meetingHistoryContainer.GetItemLinqQueryable <MeetingNotificationItemCosmosDbEntity>()
                        .Where(filterExpression)
                        .OrderByDescending(orderExpression)
                        .Select(projectionExpression)
                        .Skip(skip)
                        .Take(take);

            var itemIterator = this.cosmosLinqQuery.GetFeedIterator <MeetingNotificationItemCosmosDbEntity>(query);

            while (itemIterator.HasMoreResults)
            {
                foreach (MeetingNotificationItemCosmosDbEntity item in await itemIterator.ReadNextAsync().ConfigureAwait(false))
                {
                    filteredNotifications.Add(item.ConvertToMeetingNotificationItemEntity());
                }
            }

            Tuple <IList <MeetingNotificationItemEntity>, TableContinuationToken> tuple = new Tuple <IList <MeetingNotificationItemEntity>, TableContinuationToken>(filteredNotifications, null);

            return(tuple);
        }
コード例 #7
0
        private Expression <Func <EmailNotificationItemEntity, bool> > GetFilterExpression(NotificationReportRequest notificationReportRequest)
        {
            Expression <Func <EmailNotificationItemEntity, bool> > filterExpression = notification => true;

            if (DateTime.TryParse(notificationReportRequest.CreatedDateTimeStart, out DateTime createdDateTimeStart))
            {
                filterExpression = filterExpression.And(notification => notification.CreatedDateTime >= createdDateTimeStart);
            }

            if (DateTime.TryParse(notificationReportRequest.CreatedDateTimeEnd, out DateTime createdDateTimeEnd))
            {
                filterExpression = filterExpression.And(notification => notification.CreatedDateTime <= createdDateTimeEnd);
            }

            if (DateTime.TryParse(notificationReportRequest.SendOnUtcDateStart, out DateTime sentTimeStart))
            {
                filterExpression = filterExpression.And(notification => notification.SendOnUtcDate >= sentTimeStart);
            }

            if (DateTime.TryParse(notificationReportRequest.SendOnUtcDateEnd, out DateTime sentTimeEnd))
            {
                filterExpression = filterExpression.And(notification => notification.SendOnUtcDate <= sentTimeEnd);
            }

            if (DateTime.TryParse(notificationReportRequest.UpdatedDateTimeStart, out DateTime updatedTimeStart))
            {
                filterExpression = filterExpression.And(notification => notification.UpdatedDateTime >= updatedTimeStart);
            }

            if (DateTime.TryParse(notificationReportRequest.UpdatedDateTimeEnd, out DateTime updatedTimeEnd))
            {
                filterExpression = filterExpression.And(notification => notification.UpdatedDateTime <= updatedTimeEnd);
            }

            if (notificationReportRequest.NotificationTypeFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.NotificationTypeFilter.Contains(notification.NotifyType));
            }

            if (notificationReportRequest.NotificationPriorityFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.NotificationPriorityFilter.Contains(notification.Priority));
            }

            if (notificationReportRequest.ApplicationFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.ApplicationFilter.Contains(notification.Application));
            }

            if (notificationReportRequest.AccountsUsedFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.AccountsUsedFilter.Contains(notification.EmailAccountUsed));
            }

            if (notificationReportRequest.NotificationIdsFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.NotificationIdsFilter.Contains(notification.NotificationId));
            }

            if (notificationReportRequest.NotificationStatusFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.NotificationStatusFilter.Contains(notification.Status));
            }

            if (notificationReportRequest.MailSensitivityFilter?.Count > 0)
            {
                filterExpression = filterExpression.And(notification => notificationReportRequest.MailSensitivityFilter.Contains(notification.Sensitivity));
            }

            return(filterExpression);
        }
コード例 #8
0
        /// <inheritdoc/>
        public async Task <Tuple <IList <NotificationReportResponse>, TableContinuationToken> > GetReportNotifications(NotificationReportRequest notificationReportRequest)
        {
            // Map the request object to filters
            if (notificationReportRequest == null)
            {
                throw new ArgumentNullException($"The Notification Report Request cannot be null");
            }

            var emailNotificationItemEntities = await this.emailNotificationRepository.GetEmailNotifications(notificationReportRequest).ConfigureAwait(false);

            TableContinuationToken            token        = emailNotificationItemEntities.Item2;
            List <NotificationReportResponse> responseList = new List <NotificationReportResponse>();

            foreach (var item in emailNotificationItemEntities.Item1)
            {
                responseList.Add(EmailNotificationItemEntityExtensions.ToNotificationReportResponse(item));
            }

            Tuple <IList <NotificationReportResponse>, TableContinuationToken> tuple = new Tuple <IList <NotificationReportResponse>, TableContinuationToken>(responseList, token);

            return(tuple);
        }
コード例 #9
0
 /// <inheritdoc/>
 public Task <Tuple <IList <MeetingNotificationItemEntity>, Microsoft.Azure.Cosmos.Table.TableContinuationToken> > GetMeetingInviteNotifications(NotificationReportRequest meetingInviteReportRequest) => throw new NotImplementedException();
コード例 #10
0
        private string GetFilterExpression(NotificationReportRequest notificationReportRequest)
        {
            var    filterSet          = new HashSet <string>();
            string filterExpression   = null;
            string applicationFilter  = null;
            string accountFilter      = null;
            string notificationFilter = null;
            string statusFilter       = null;
            string trackingIdFilter   = null;

            if (notificationReportRequest.ApplicationFilter?.Count > 0)
            {
                foreach (var item in notificationReportRequest.ApplicationFilter)
                {
                    applicationFilter = applicationFilter == null?TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, item) : applicationFilter + " or " + TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, item);
                }

                _ = filterSet.Add("(" + applicationFilter + ")");
            }

            if (notificationReportRequest.AccountsUsedFilter?.Count > 0)
            {
                foreach (var item in notificationReportRequest.AccountsUsedFilter)
                {
                    accountFilter = accountFilter == null?TableQuery.GenerateFilterCondition("EmailAccountUsed", QueryComparisons.Equal, item) : accountFilter + " or " + TableQuery.GenerateFilterCondition("EmailAccountUsed", QueryComparisons.Equal, item);
                }

                _ = filterSet.Add("(" + accountFilter + ")");
            }

            if (notificationReportRequest.NotificationIdsFilter?.Count > 0)
            {
                foreach (var item in notificationReportRequest.NotificationIdsFilter)
                {
                    notificationFilter = notificationFilter == null?TableQuery.GenerateFilterCondition("NotificationId", QueryComparisons.Equal, item) : notificationFilter + " or " + TableQuery.GenerateFilterCondition("NotificationId", QueryComparisons.Equal, item);
                }

                _ = filterSet.Add("(" + notificationFilter + ")");
            }

            if (notificationReportRequest.TrackingIdsFilter?.Count > 0)
            {
                foreach (var item in notificationReportRequest.TrackingIdsFilter)
                {
                    trackingIdFilter = trackingIdFilter == null?TableQuery.GenerateFilterCondition("TrackingId", QueryComparisons.Equal, item) : trackingIdFilter + " or " + TableQuery.GenerateFilterCondition("TrackingId", QueryComparisons.Equal, item);
                }

                _ = filterSet.Add("(" + trackingIdFilter + ")");
            }

            if (notificationReportRequest.NotificationStatusFilter?.Count > 0)
            {
                foreach (int item in notificationReportRequest.NotificationStatusFilter)
                {
                    string status = GetStatus(item);
                    statusFilter = statusFilter == null?TableQuery.GenerateFilterCondition("Status", QueryComparisons.Equal, status) : statusFilter + " or " + TableQuery.GenerateFilterCondition("Status", QueryComparisons.Equal, status);
                }

                _ = filterSet.Add("(" + statusFilter + ")");
            }

            filterExpression = PrepareFilterExp(filterSet);
            return(filterExpression);
コード例 #11
0
        /// <inheritdoc/>
        public Task <Tuple <IList <MeetingNotificationItemEntity>, TableContinuationToken> > GetMeetingInviteNotifications(NotificationReportRequest meetingInviteReportRequest)
        {
            if (meetingInviteReportRequest == null)
            {
                throw new ArgumentNullException(nameof(meetingInviteReportRequest));
            }

            this.logger.TraceInformation($"Started {nameof(this.GetMeetingInviteNotifications)} method of {nameof(TableStorageEmailRepository)}.");
            var    entities             = new List <MeetingNotificationItemTableEntity>();
            var    notificationEntities = new List <MeetingNotificationItemEntity>();
            string filterDateExpression = this.GetDateFilterExpression(meetingInviteReportRequest);
            string filterExpression     = this.GetFilterExpression(meetingInviteReportRequest);
            string finalFilter          = filterDateExpression != null && filterDateExpression.Length > 0 ? filterDateExpression : filterExpression;

            if (filterDateExpression != null && filterDateExpression.Length > 0 && filterExpression != null && filterExpression.Length > 0)
            {
                finalFilter = TableQuery.CombineFilters(filterDateExpression, TableOperators.And, filterExpression);
            }

            var tableQuery = new TableQuery <MeetingNotificationItemTableEntity>()
                             .Where(finalFilter)
                             .OrderByDesc(meetingInviteReportRequest.SendOnUtcDateStart)
                             .Take(meetingInviteReportRequest.Take == 0 ? 100 : meetingInviteReportRequest.Take);
            var queryResult = this.meetingHistoryTable.ExecuteQuerySegmented(tableQuery, meetingInviteReportRequest.Token);

            entities.AddRange(queryResult.Results);
            notificationEntities = entities.Select(e => e.ConvertToMeetingNotificationItemEntity()).ToList();
            var token = queryResult.ContinuationToken;
            Tuple <IList <MeetingNotificationItemEntity>, TableContinuationToken> tuple = new Tuple <IList <MeetingNotificationItemEntity>, TableContinuationToken>(notificationEntities, token);

            return(Task.FromResult(tuple));
        }
コード例 #12
0
        private string GetFilterExpression(NotificationReportRequest notificationReportRequest)
        {
            string filterExpression = null;

            if (notificationReportRequest.ApplicationFilter?.Count > 0)
            {
                foreach (var item in notificationReportRequest.ApplicationFilter)
                {
                    filterExpression = filterExpression == null?TableQuery.GenerateFilterCondition("Application", QueryComparisons.Equal, item) : filterExpression + " And " + TableQuery.GenerateFilterCondition("Application", QueryComparisons.Equal, item);
                }
            }

            if (notificationReportRequest.AccountsUsedFilter?.Count > 0)
            {
                foreach (var item in notificationReportRequest.AccountsUsedFilter)
                {
                    filterExpression = filterExpression == null?TableQuery.GenerateFilterCondition("EmailAccountUsed", QueryComparisons.Equal, item) : filterExpression + " and " + TableQuery.GenerateFilterCondition("EmailAccountUsed", QueryComparisons.Equal, item);
                }
            }

            if (notificationReportRequest.NotificationIdsFilter?.Count > 0)
            {
                foreach (var item in notificationReportRequest.NotificationIdsFilter)
                {
                    filterExpression = filterExpression == null?TableQuery.GenerateFilterCondition("NotificationId", QueryComparisons.Equal, item) : filterExpression + " and " + TableQuery.GenerateFilterCondition("NotificationId", QueryComparisons.Equal, item);
                }
            }

            if (notificationReportRequest.NotificationStatusFilter?.Count > 0)
            {
                foreach (int item in notificationReportRequest.NotificationStatusFilter)
                {
                    string status = "Queued";
                    switch (item)
                    {
                    case 0:
                        status = "Queued";
                        break;

                    case 1:
                        status = "Processing";
                        break;

                    case 2:
                        status = "Retrying";
                        break;

                    case 3:
                        status = "Failed";
                        break;

                    case 4:
                        status = "Sent";
                        break;

                    case 5:
                        status = "FakeMail";
                        break;
                    }

                    filterExpression = filterExpression == null?TableQuery.GenerateFilterCondition("Status", QueryComparisons.Equal, status) : filterExpression + " and " + TableQuery.GenerateFilterCondition("Status", QueryComparisons.Equal, status);
                }
            }

            return(filterExpression);
        }