Ejemplo n.º 1
0
        public async Task <IActionResult> FundWallet([FromBody] FundWalletDTO model, string Id)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ResponseMessage.Message("Bad request", errors: new { message = ModelState })));
            }

            var isValid = CurrencyConverter.ValidateCurrencyInput(model.TransactionCurrency);

            if (!isValid)
            {
                return(BadRequest(ResponseMessage.Message("Error", errors: new { message = "Invalid currency input" })));
            }

            var wallet = await _walletRepository.GetWalletByWalletId(Id);

            if (wallet == null)
            {
                return(NotFound(ResponseMessage.Message("Not found", new { message = $"Wallet with id {Id} was not found" })));
            }

            Transaction transaction = new Transaction
            {
                TransactionId       = Guid.NewGuid().ToString(),
                TransactionType     = "Credit",
                WalletId            = wallet.WalletId,
                Amount              = model.Amount,
                TransactionCurrency = model.TransactionCurrency
            };

            try
            {
                await _transactionRepository.AddTransaction(transaction);
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
                return(BadRequest(ResponseMessage.Message("Bad request", errors: new { message = "Failed to add transaction" })));
            }

            try
            {
                var walletOwner = await _userManager.FindByIdAsync(wallet.ApplicationUserId);

                if (walletOwner == null)
                {
                    return(NotFound(ResponseMessage.Message("Not found", new { message = $"User with id {wallet.ApplicationUserId} was not found" })));
                }

                UserMainCurrencyDetail mainCurrencyDetail;
                try
                {
                    mainCurrencyDetail = await _userMainCurrencyRepository.GetMainCurrencyByUserId(walletOwner.Id);
                }
                catch (Exception e)
                {
                    await _transactionRepository.DeleteTransaction(transaction);

                    _logger.LogError(e.Message);
                    return(BadRequest(ResponseMessage.Message("Data access error", errors: new { message = "Could not access record from data source" })));
                }

                var mainCurrency = mainCurrencyDetail.MainCurrency;

                decimal convertedAmount;
                try
                {
                    convertedAmount = await CurrencyConverter.ConvertCurrency(model.TransactionCurrency, mainCurrency, model.Amount);
                }
                catch (Exception e)
                {
                    return(BadRequest(ResponseMessage.Message("Error", errors: new { message = e.Message })));
                }

                wallet.Balance += convertedAmount;
                await _walletRepository.UpdateWallet(wallet);

                return(Ok(ResponseMessage.Message("Success! Wallet funded")));
            }
            catch (Exception e)
            {
                await _transactionRepository.DeleteTransaction(transaction);

                _logger.LogError(e.Message);
                return(BadRequest(ResponseMessage.Message("Bad request", errors: new { message = "Failed to fund wallet" })));
            }
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> FundWallet([FromBody] FundWalletDTO model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ResponseMessage.Message("Bad request", errors: new { message = ModelState })));
            }

            var loggedInUser = await _userManager.GetUserAsync(User);

            if (loggedInUser == null)
            {
                return(NotFound(ResponseMessage.Message("Not found", errors: new { message = "Could not access user" })));
            }

            var loggedInUserRoles = await _userManager.GetRolesAsync(loggedInUser);

            Transaction transaction = null;

            if (loggedInUserRoles[0] == "Noob")
            {
                var wallets = await _walletRepository.GetWalletsByUserId(loggedInUser.Id);

                var wallet = wallets.ToList()[0];

                transaction = new Transaction
                {
                    TransactionId       = Guid.NewGuid().ToString(),
                    TransactionType     = "Credit",
                    WalletId            = wallet.WalletId,
                    TransactionStatus   = "pending",
                    Amount              = model.Amount,
                    TransactionCurrency = model.TransactionCurrency
                };

                try
                {
                    await _transactionRepository.AddTransaction(transaction);

                    return(Ok(ResponseMessage.Message($"Success! Transaction with id {transaction.TransactionId} created. Funding approval pending")));
                }
                catch (Exception e)
                {
                    _logger.LogError(e.Message);
                    return(BadRequest(ResponseMessage.Message("Bad request", errors: new { message = "Failed to add transaction" })));
                }
            }
            else
            {
                var wallets = await _walletRepository.GetWalletsByUserId(loggedInUser.Id);

                var wallet = wallets.FirstOrDefault(x => x.WalletCurrency == model.TransactionCurrency);

                if (wallet == null)
                {
                    try
                    {
                        Wallet newWallet = new Wallet
                        {
                            WalletId          = Guid.NewGuid().ToString(),
                            ApplicationUserId = loggedInUser.Id,
                            WalletCurrency    = model.TransactionCurrency
                        };

                        await _walletRepository.AddWallet(newWallet);

                        wallet = await _walletRepository.GetWalletByWalletId(newWallet.WalletId);
                    }
                    catch (Exception e)
                    {
                        _logger.LogError(e.Message);
                        return(BadRequest(ResponseMessage.Message("Bad request", errors: new { message = "Failed to add wallet" })));
                    }
                }

                transaction = new Transaction
                {
                    TransactionId       = Guid.NewGuid().ToString(),
                    TransactionType     = "Credit",
                    WalletId            = wallet.WalletId,
                    Amount              = model.Amount,
                    TransactionCurrency = model.TransactionCurrency
                };

                try
                {
                    await _transactionRepository.AddTransaction(transaction);
                }
                catch (Exception e)
                {
                    await _walletRepository.DeleteWallet(wallet);

                    _logger.LogError(e.Message);
                    return(BadRequest(ResponseMessage.Message("Bad request", errors: new { message = "Failed to add transaction" })));
                }

                try
                {
                    wallet.Balance += model.Amount;
                    await _walletRepository.UpdateWallet(wallet);

                    return(Ok(ResponseMessage.Message("Success! Wallet funded")));
                }
                catch (Exception e)
                {
                    await _transactionRepository.DeleteTransaction(transaction);

                    await _walletRepository.DeleteWallet(wallet);

                    _logger.LogError(e.Message);
                    return(BadRequest(ResponseMessage.Message("Bad request", errors: new { message = "Failed to fund wallet" })));
                }
            }
        }