public IActionResult ConvertMoney([FromBody] ConvertMoneyRequestModel requestModel)
 {
     try
     {
         _moneyService.Convert(requestModel);
         return(Ok("Money was successfully converted"));
     }
     catch (Exception ex)
     {
         return(BadRequest(ex.Message));
     }
 }
Exemplo n.º 2
0
        public void Convert(ConvertMoneyRequestModel request)
        {
            if (request.FromCurrency.Equals(request.ToCurrency))
            {
                throw new Exception("Converting to the same currency is not allowed.");
            }

            var user = _userRepo.Get(request.UserId);

            if (user == null)
            {
                throw new Exception("The user you specified not found.");
            }

            var fromCurrency = _currencyRepo.GetAll(s => s.Name.Equals(request.FromCurrency)).FirstOrDefault();
            var toCurrency   = _currencyRepo.GetAll(s => s.Name.Equals(request.ToCurrency)).FirstOrDefault();

            if (toCurrency == null || fromCurrency == null)
            {
                throw new Exception("Trying to convert to unavialable currecy is not allowed.");
            }

            user.ValidateIfHasCurrencyBalance(request.FromCurrency);

            var fromMoney = user.Money.Where(s => s.Currency.Name.Equals(request.FromCurrency)).FirstOrDefault();
            var toMoney   = user.Money.Where(s => s.Currency.Name.Equals(request.ToCurrency)).FirstOrDefault();

            fromMoney.ValidateIfCanConvert(toCurrency, request.Amount);

            decimal converted_FromMoney = fromMoney.ConvertToCurrency(toCurrency);

            this.Store(new StoreMoneyRequestModel()
            {
                UserId   = user.Id,
                Currency = request.ToCurrency,
                Amount   = request.Amount
            });

            decimal cashOutAmount = request.Amount * fromCurrency.Ratio;

            fromMoney.CashOut(cashOutAmount);

            _userRepo.Update(user);
        }
Exemplo n.º 3
0
        public async Task <ActionResult> ConvertMoney(int userId, string sourceCurrencyCode, ConvertMoneyRequestModel model)
        {
            var sourceAccount = await _currencyAccountRepository.SingleOrDefaultAsync(ca => ca.CurrencyCode == sourceCurrencyCode && ca.Wallet.UserId == userId, ca => new { ca.Id });

            if (sourceAccount == null)
            {
                return(NotFound($"Не существует '{sourceCurrencyCode}' счёта для пользователя {userId}."));
            }

            var destinationAccount = await _currencyAccountRepository.SingleOrDefaultAsync(ca => ca.CurrencyCode == model.DestinationCurrencyCode && ca.Wallet.UserId == userId, ca => new { ca.Id });

            if (destinationAccount == null)
            {
                return(NotFound($"Не существует '{model.DestinationCurrencyCode}' счёта для пользователя {userId}."));
            }

            await _mediator.Send(new ConvertMoneyRequest(userId, model.SourceCurrencyAmount, sourceAccount.Id, destinationAccount.Id));

            return(NoContent());
        }