/// <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; } } }
/// <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))); }
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; } } } }