public IActionResult ConvertMoney([FromBody] ConvertMoneyRequestModel requestModel) { try { _moneyService.Convert(requestModel); return(Ok("Money was successfully converted")); } catch (Exception ex) { return(BadRequest(ex.Message)); } }
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); }
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()); }