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(); }
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); }
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)); }
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); }
/// <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); }
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); }
/// <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); }
/// <inheritdoc/> public Task <Tuple <IList <MeetingNotificationItemEntity>, Microsoft.Azure.Cosmos.Table.TableContinuationToken> > GetMeetingInviteNotifications(NotificationReportRequest meetingInviteReportRequest) => throw new NotImplementedException();
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);
/// <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)); }
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); }