コード例 #1
0
        public async Task <ActionResult <UserBalance> > GetBalance()
        {
            var balance = await _balances.GetUserBalanceAsync(UserId);

            if (balance != null)
            {
                return(Ok(balance));
            }

            return(BadRequest(new { message = $"Could not get user`s wallet balance" }));
        }
コード例 #2
0
        public async Task <Transaction> CommitTransactionAsync(Transaction transaction)
        {
            if (transaction.RecipientId == default)
            {
                return(await RejectTransactionAsync(transaction));
            }

            UserBalance senderBalance = null;
            decimal     senderAmount  = 0;

            if (transaction.SenderId != null)
            {
                senderBalance = await _balances.GetUserBalanceAsync((Guid)transaction.SenderId);

                senderAmount = senderBalance.Amount;
            }

            var recipientBalance = await _balances.GetUserBalanceAsync(transaction.RecipientId);

            decimal recipientAmount = 0;

            if (recipientBalance != null)
            {
                recipientAmount = recipientBalance.Amount;
            }

            if (senderBalance != null)
            {
                if (senderAmount - transaction.Amount < 0)
                {
                    return(await RejectTransactionAsync(transaction));
                }
            }

            using var context       = _contextFactory.Invoke();
            using var dbTransaction = context.Database.BeginTransaction();
            try
            {
                if (senderBalance != null)
                {
                    await _balances.UpdateUserBalanceAsync((Guid)transaction.SenderId, transaction.Id, senderAmount - transaction.Amount);
                }
                await _balances.UpdateUserBalanceAsync(transaction.RecipientId, transaction.Id, recipientAmount + transaction.Amount);

                context.Attach(transaction);

                transaction.StatusDate = DateTime.Now;
                transaction.Status     = TransactionStatuses.Success;

                await context.SaveChangesAsync();

                dbTransaction.Commit();

                return(transaction);
            }
            catch (Exception)
            {
                dbTransaction.Rollback();
                return(await RejectTransactionAsync(transaction));
            }
        }