Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Retrieves rates from CNB API and converts it #672

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 77 additions & 3 deletions jobs/Backend/Task/ExchangeRateProvider.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using ExchangeRateUpdater.Models;

namespace ExchangeRateUpdater
{
Expand All @@ -11,9 +17,77 @@ public class ExchangeRateProvider
/// do not return exchange rate "USD/CZK" with value calculated as 1 / "CZK/USD". If the source does not provide
/// some of the currencies, ignore them.
/// </summary>
public IEnumerable<ExchangeRate> GetExchangeRates(IEnumerable<Currency> currencies)
public IEnumerable<ExchangeRate> GetExchangeRates(IEnumerable<Currency> currencies, Currency baseCurrency)
{
return Enumerable.Empty<ExchangeRate>();
var exchangeRates = new List<ExchangeRate>();

// Created two different calls to exemplify how API can change individually, despite being right now, returning the data in the same format
var ratesDaily = GetExchangeRatesDailyAsync(currencies).Result;
var ratesForex = GetExchangeRatesForexAsync(currencies).Result;

// Conversion should be one or two different depending on what is done with the API calls. In this case, for simplicity, I've done one single converter
exchangeRates.AddRange(RateConverter.ConvertApiToExchangeRate(ratesDaily, baseCurrency));
exchangeRates.AddRange(RateConverter.ConvertApiToExchangeRate(ratesForex, baseCurrency));

return exchangeRates;
}

private async Task<IEnumerable<ExchangeRateApi>> GetExchangeRatesDailyAsync(IEnumerable<Currency> currencies)
{
var exchangeRates = new List<ExchangeRateApi>();

var dayDate = DateTime.Now.ToString("yyyy-MM-dd");

var urlApi = $"https://api.cnb.cz/cnbapi/exrates/daily";
var parametersApi = $"?date={dayDate}";

HttpClient client = new HttpClient();
client.BaseAddress = new Uri(urlApi);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = await client.GetAsync(parametersApi).ConfigureAwait(false);

if (response.IsSuccessStatusCode)
{
var jsonString = await response.Content.ReadAsStringAsync();
var ratesList = JsonConvert.DeserializeObject<ExchangeRatesList>(jsonString);

if (ratesList != null)
{
exchangeRates.AddRange(ratesList.Rates.Where(e => currencies.Any(c => c.Code == e.CurrencyCode)));
}
}

return exchangeRates;
}

private async Task<IEnumerable<ExchangeRateApi>> GetExchangeRatesForexAsync(IEnumerable<Currency> currencies)
{
var exchangeRates = new List<ExchangeRateApi>();

var monthDate = DateTime.Now.AddMonths(-1).ToString("yyyy-MM");

var urlApi = $"https://api.cnb.cz/cnbapi/fxrates/daily-month";
var parametersApi = $"?yearMonth={monthDate}";

HttpClient client = new HttpClient();
client.BaseAddress = new Uri(urlApi);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = await client.GetAsync(parametersApi).ConfigureAwait(false);

if (response.IsSuccessStatusCode)
{
var jsonString = await response.Content.ReadAsStringAsync();
var ratesList = JsonConvert.DeserializeObject<ExchangeRatesList>(jsonString);

if (ratesList != null)
{
exchangeRates.AddRange(ratesList.Rates.Where(e => currencies.Any(c => c.Code == e.CurrencyCode)));
}
}

return exchangeRates;
}
}
}
4 changes: 4 additions & 0 deletions jobs/Backend/Task/ExchangeRateUpdater.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,8 @@
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>

</Project>
22 changes: 22 additions & 0 deletions jobs/Backend/Task/Models/ExchangeRateApi.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExchangeRateUpdater.Models
{
[Serializable]
public class ExchangeRateApi
{
[JsonProperty("currencyCode")]
public string CurrencyCode { get; set; }

[JsonProperty("rate")]
public decimal Rate { get; set; }

[JsonProperty("amount")]
public decimal Amount { get; set; }
}
}
16 changes: 16 additions & 0 deletions jobs/Backend/Task/Models/ExchangeRatesList.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExchangeRateUpdater.Models
{
[Serializable]
public class ExchangeRatesList
{
[JsonProperty("rates")]
public IEnumerable<ExchangeRateApi> Rates { get; set; }
}
}
4 changes: 3 additions & 1 deletion jobs/Backend/Task/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@ public static class Program
new Currency("XYZ")
};

public static Currency baseCurrency = new Currency("CZK");

public static void Main(string[] args)
{
try
{
var provider = new ExchangeRateProvider();
var rates = provider.GetExchangeRates(currencies);
var rates = provider.GetExchangeRates(currencies, baseCurrency);

Console.WriteLine($"Successfully retrieved {rates.Count()} exchange rates:");
foreach (var rate in rates)
Expand Down
15 changes: 15 additions & 0 deletions jobs/Backend/Task/RateConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using ExchangeRateUpdater.Models;
using System.Collections.Generic;
using System.Linq;

namespace ExchangeRateUpdater
{
internal static class RateConverter
{
// Convert from ExchangeRateApi to ExchangeRate
public static IEnumerable<ExchangeRate> ConvertApiToExchangeRate(IEnumerable<ExchangeRateApi> ratesApi, Currency baseCurrency)
{
return ratesApi.Select(c => new ExchangeRate(new Currency(c.CurrencyCode), baseCurrency, c.Rate / c.Amount));
}
}
}