private async Task ProcessTransferTransaction(ITransferTransaction tx) { var transferTransactionInfo = await tx.GetTransferTransactionInfo(); var fromAccount = GrainFactory.GetGrain<IBankAccount>(transferTransactionInfo.FromAccountId); var toAccount = GrainFactory.GetGrain<IBankAccount>(transferTransactionInfo.ToAccountId); if (await tx.GetStatus() == TransactionStatus.Started) { var validTask1 = fromAccount.Validate(); var validTask2 = toAccount.Validate(); await Task.WhenAll(fromAccount.Validate(), toAccount.Validate()); if (!validTask1.Result) await tx.Cancel(TransactionFaileReason.FromAccountNotExist); else if (!validTask2.Result) await tx.Cancel(TransactionFaileReason.ToAccountNotExist); else await tx.ConfirmAccountValidatePassed(); } if (await tx.GetStatus() == TransactionStatus.AccountValidateCompleted) { var transferOutPreparationTask = fromAccount.AddTransactionPreparation(tx.GetPrimaryKey(), TransactionType.TransferTransaction, PreparationType.DebitPreparation, transferTransactionInfo.Amount); var transferInPreparationTask = toAccount.AddTransactionPreparation(tx.GetPrimaryKey(), TransactionType.TransferTransaction, PreparationType.CreditPreparation, transferTransactionInfo.Amount); await Task.WhenAll(transferOutPreparationTask, transferInPreparationTask); if (transferOutPreparationTask.Result.Success) await tx.ConfirmTransferOutPreparation(); else await tx.Cancel(TransactionFaileReason.BalanceNotEnough); if (transferInPreparationTask.Result.Success) await tx.ConfirmTransferInPreparation(); } if (await tx.GetStatus() == TransactionStatus.PreparationCompleted) { var transferOutTask = fromAccount.CommitTransactionPreparation(tx.GetPrimaryKey()); var transferInTask = toAccount.CommitTransactionPreparation(tx.GetPrimaryKey()); await Task.WhenAll(transferOutTask, transferInTask); await Task.WhenAll(tx.ConfirmTransferOut(), tx.ConfirmTransferIn()); Console.WriteLine("transaction complete success." + transferTransactionInfo.Amount + "$"); } }
private async Task ProcessTransferTransaction(ITransferTransaction tx) { var transferTransactionInfo = await tx.GetTransferTransactionInfo(); var fromAccount = GrainFactory.GetGrain <IBankAccount>(transferTransactionInfo.FromAccountId); var toAccount = GrainFactory.GetGrain <IBankAccount>(transferTransactionInfo.ToAccountId); if (await tx.GetStatus() == TransactionStatus.Started) { var validTask1 = fromAccount.Validate(); var validTask2 = toAccount.Validate(); await Task.WhenAll(fromAccount.Validate(), toAccount.Validate()); if (!validTask1.Result) { await tx.Cancel(TransactionFaileReason.FromAccountNotExist); } else if (!validTask2.Result) { await tx.Cancel(TransactionFaileReason.ToAccountNotExist); } else { await tx.ConfirmAccountValidatePassed(); } } if (await tx.GetStatus() == TransactionStatus.AccountValidateCompleted) { var transferOutPreparationTask = fromAccount.AddTransactionPreparation(tx.GetPrimaryKey(), TransactionType.TransferTransaction, PreparationType.DebitPreparation, transferTransactionInfo.Amount); var transferInPreparationTask = toAccount.AddTransactionPreparation(tx.GetPrimaryKey(), TransactionType.TransferTransaction, PreparationType.CreditPreparation, transferTransactionInfo.Amount); await Task.WhenAll(transferOutPreparationTask, transferInPreparationTask); if (transferOutPreparationTask.Result.Success) { await tx.ConfirmTransferOutPreparation(); } else { await tx.Cancel(TransactionFaileReason.BalanceNotEnough); } if (transferInPreparationTask.Result.Success) { await tx.ConfirmTransferInPreparation(); } } if (await tx.GetStatus() == TransactionStatus.PreparationCompleted) { var transferOutTask = fromAccount.CommitTransactionPreparation(tx.GetPrimaryKey()); var transferInTask = toAccount.CommitTransactionPreparation(tx.GetPrimaryKey()); await Task.WhenAll(transferOutTask, transferInTask); await Task.WhenAll(tx.ConfirmTransferOut(), tx.ConfirmTransferIn()); Console.WriteLine("transaction complete success." + transferTransactionInfo.Amount + "$"); } }