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 + "$");
            }
        }
Example #2
0
        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 + "$");
            }
        }