예제 #1
0
        /// <summary>
        /// Records that an alert has been sent to a given email address.
        /// </summary>
        /// <param name="jobsSet">The jobs set.</param>
        /// <param name="jobId">The job identifier.</param>
        /// <param name="emailAddress">The email address.</param>
        public async Task MarkAlertAsSent(JobsSet jobsSet, int jobId, string emailAddress)
        {
            var table = _tableClient.GetTableReference(_alertsSentTable);
            await table.CreateIfNotExistsAsync();

            var entity = new JobAlertSentTableEntity()
            {
                PartitionKey = ToAzureKeyString(emailAddress),
                RowKey       = jobId.ToString(),
                JobsSet      = jobsSet.ToString()
            };

            try
            {
                var result = table.Execute(TableOperation.InsertOrReplace(entity));
            }
            catch (StorageException ex)
            {
                if (ex.Message.Contains("(400) Bad Request"))
                {
                    LogHelper.Error <AzureTableStorageAlertsRepository>($"Mark job alert for job {jobId} as sent to {emailAddress} returned {ex.RequestInformation.ExtendedErrorInformation.ErrorMessage}", ex);
                    ex.ToExceptionless().Submit();
                }
                else
                {
                    throw;
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Gets the ids of the jobs already sent to a given email address.
        /// </summary>
        /// <param name="jobsSet">The jobs set.</param>
        /// <param name="emailAddress">The email address.</param>
        /// <returns></returns>
        public async Task <IList <int> > GetJobsSentForEmail(JobsSet jobsSet, string emailAddress)
        {
            // Create the table query.
            var table = _tableClient.GetTableReference(_alertsSentTable);

            // Initialize a default TableQuery to retrieve all the entities in the table.
            var tableQuery = new TableQuery <TableEntity>().Where(TableQuery.CombineFilters(
                                                                      TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, emailAddress),
                                                                      TableOperators.And,
                                                                      TableQuery.GenerateFilterCondition("JobsSet", QueryComparisons.Equal, jobsSet.ToString()))
                                                                  );

            return(await ReadAllResults <int>(table, tableQuery, entity => Int32.Parse(entity.RowKey)));
        }
예제 #3
0
        private async Task DeleteRecordOfAlertsSent(JobsSet jobsSet, string emailAddress)
        {
            // Only remove data if there are no more alerts set up for this email, otherwise we may still send jobs they've already seen
            var alertsForThisEmail = await GetAlerts(new JobAlertsQuery { JobsSet = jobsSet, EmailAddress = emailAddress });

            if (alertsForThisEmail.Any())
            {
                return;
            }

            // Delete the record of alerts sent
            var table = _tableClient.GetTableReference(_alertsSentTable);
            await table.CreateIfNotExistsAsync();

            var tableQuery = new TableQuery <TableEntity>().Where(TableQuery.CombineFilters(
                                                                      TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, emailAddress),
                                                                      TableOperators.And,
                                                                      TableQuery.GenerateFilterCondition("JobsSet", QueryComparisons.Equal, jobsSet.ToString())));

            var alertsSentEntities = table.ExecuteQuery(tableQuery);

            foreach (var entity in alertsSentEntities)
            {
                try
                {
                    table.Execute(TableOperation.Delete(entity));
                }
                catch (StorageException ex)
                {
                    if (ex.Message.Contains("(400) Bad Request"))
                    {
                        LogHelper.Error <AzureTableStorageAlertsRepository>($"Delete job alert sent record for job {entity.RowKey} and alert {emailAddress} returned {ex.RequestInformation.ExtendedErrorInformation.ErrorMessage}", ex);
                        ex.ToExceptionless().Submit();
                    }
                    else
                    {
                        throw;
                    }
                }
            }
        }