private static Result ValdateQuery(GetConversionRateQuery query) { var errors = new List <string>(); if (query.TransactionAmount <= 0) { errors.Add("Invalid transaction amount"); } if (string.IsNullOrWhiteSpace(query.BillingCurrency) || query.BillingCurrency.Length != 3) { errors.Add("Invalid billing currency"); } if (string.IsNullOrWhiteSpace(query.TransactionCurrency) || query.TransactionCurrency.Length != 3) { errors.Add("Invalid transaction amount"); } if (errors.Any()) { return(Result.Failure(string.Join(", ", errors))); } return(Result.Success()); }
public async Task <Result <ConversionRateDto> > Handle(GetConversionRateQuery query) { var validationResult = ValdateQuery(query); if (validationResult.IsFailure) { return(Result.Failure <ConversionRateDto>(validationResult.Error)); } var fxDate = _dateTimeProvider.UtcNow.ToString("yyyy-MM-dd"); var response = await _currencyRateClient.GetConversionRate(fxDate, query.TransactionCurrency, query.BillingCurrency, query.TransactionAmount); if (response.IsFailure()) { return(Result.Failure <ConversionRateDto>(response.Data?.ErrorMessage)); } var conversionRate = new ConversionRateDto { TransactionAmount = query.TransactionAmount, TransactionCurrency = query.TransactionCurrency, ConversionRate = response.Data.ConversionRate.GetValueOrDefault(), BillingAmount = response.Data.CrdhldBillAmt.GetValueOrDefault(), BillingCurrency = response.Data.CrdhldBillCurr }; return(Result.Success(conversionRate)); }