public async Task <bool> ConfirmAppendDataAsync(string subscriptionId, PwnedPasswordsTransaction transaction, CancellationToken cancellationToken = default) { try { Response <AppendTransactionEntity> transactionEntityResponse = await _transactionTable.GetEntityAsync <AppendTransactionEntity>(subscriptionId, transaction.TransactionId, cancellationToken : cancellationToken).ConfigureAwait(false); if (!transactionEntityResponse.Value.Confirmed) { transactionEntityResponse.Value.Confirmed = true; Response?updateResponse = await _transactionTable.UpdateEntityAsync(transactionEntityResponse.Value, transactionEntityResponse.Value.ETag, cancellationToken : cancellationToken).ConfigureAwait(false); _log.LogInformation("Subscription {SubscriptionId} successfully confirmed transaction {TransactionId}. Queueing data for blob updates.", subscriptionId, transaction.TransactionId); return(true); } // We've already confirmed this transaction. return(false); } catch (RequestFailedException e) when(e.Status == 404) { throw new ArgumentOutOfRangeException("Transaction id not found.", e); } catch (RequestFailedException e) when(e.Status == StatusCodes.Status409Conflict) { throw new ArgumentException("Transaciton has already been updated.", e); } catch (RequestFailedException e) { _log.LogError(e, "Error looking up/updating transaction with id = {TransactionId} for subscription {SubscriptionId}.", transaction.TransactionId, subscriptionId); throw new InvalidOperationException("Error confirming transaction.", e); } }
public async Task <PwnedPasswordsTransaction> InsertAppendDataAsync(string subscriptionId, CancellationToken cancellationToken = default) { var transaction = new PwnedPasswordsTransaction { TransactionId = Guid.NewGuid().ToString() }; await _transactionTable.AddEntityAsync(new AppendTransactionEntity { PartitionKey = subscriptionId, RowKey = transaction.TransactionId, Confirmed = false }, cancellationToken).ConfigureAwait(false); _log.LogInformation("Subscription {SubscriptionId} created a new transaction with id = {TransactionId}.", subscriptionId, transaction.TransactionId); return(transaction); }