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" })); }
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)); } }