using System.Collections.Generic; using System.Threading.Tasks; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using BootCamp.DataAccess.Factory; namespace BootCamp.DataAccess.Common.AWS.DynamoDB.Transaction { public class TransactScope { private readonly IAmazonDynamoDB _client; private TransactWriteItemsRequest _transactRequest; private TransactScope _subTransactScope; public TransactScope _parentTransactScope { get; set; } public TransactScope() { _client = AwsServiceFactory.GetAmazonDynamoDb(); } private TransactScope(IAmazonDynamoDB client) { _client = client; } /// /// Add the transact write item. /// /// public void AddTransactWriteItem(TransactWriteItem transactWriteItem) { if ((_transactRequest is null) || (transactWriteItem is null)) return; _transactRequest.TransactItems.Add(transactWriteItem); } /// /// Begin transaction. /// public TransactScope Begin() { if (_transactRequest is null) { _transactRequest = new TransactWriteItemsRequest { TransactItems = new List() }; return this; } else if (_subTransactScope is null) { _subTransactScope = new TransactScope(_client); _subTransactScope._parentTransactScope = this; _subTransactScope.Begin(); return _subTransactScope; } else { return _subTransactScope.Begin(); } } /// /// Commit transaction. /// /// public async Task Commit() { if (!(_subTransactScope is null)) { await _subTransactScope.Commit(); _subTransactScope = null; } if ((_client is object) && (_transactRequest is object) && (_transactRequest.TransactItems.Count > 0)) { await _client.TransactWriteItemsAsync(_transactRequest).ConfigureAwait(false); _transactRequest = null; } } /// /// Rollback transaction. /// public void Rollback() { if (!(_subTransactScope is null)) { _subTransactScope.Rollback(); _subTransactScope = null; } _transactRequest = null; } } }